C++构造函数初始化列表,该怎么解决
C++构造函数初始化列表
我想问一下这两种方式有什么不同,及使用初始化列表与不使用初始化列表有什么区别?
------解决方案--------------------
初始化列表是初始化,而括号里可以看为赋值
对于POD来说差不多,但对于某种class类型,有效率的差别
------解决方案--------------------
如定义一个类的const成员变量,就需要在初始化列表中做初始化。
------解决方案--------------------
1,base::base(int n):num(n){} //使用初始化列表
// 初始化,
,2,base::base(int n) //不使用初始化列表
{
num(n);//这个是赋值
}
区别在于的是:有可能你先使用了该类的属性num,而导致了未定义,比如第二种
base::base(int n) :fun(num)
建议是采用第一种类来初始化
------解决方案--------------------
对于构造函数的初始化,可以看成是分两步进行的,第一步是在初始化列表中进行初始化,如果没有显式的在初始化列表中进行初始化,则采用默认的形式进行初始化,类类型采用默认构造函数进行初始化,其他的一般没有初始化值。第二步才进行函数体中的赋值。对于有些类型的变量必须要在初始化列表中进行初始化,比如像没有默认构造函数的类,还有上面的const变量等,如果不在初始化列表中进行初始化就会出错。
------解决方案--------------------
参考:
初始化列表问题
我想问一下这两种方式有什么不同,及使用初始化列表与不使用初始化列表有什么区别?
- C/C++ code
class base { public: base(); base(int n); ~base(); private: int num; }; base::base(int n):num(n){} //使用初始化列表 base::base(int n) //不使用初始化列表 { num(n); }
------解决方案--------------------
初始化列表是初始化,而括号里可以看为赋值
对于POD来说差不多,但对于某种class类型,有效率的差别
------解决方案--------------------
如定义一个类的const成员变量,就需要在初始化列表中做初始化。
------解决方案--------------------
1,base::base(int n):num(n){} //使用初始化列表
// 初始化,
,2,base::base(int n) //不使用初始化列表
{
num(n);//这个是赋值
}
区别在于的是:有可能你先使用了该类的属性num,而导致了未定义,比如第二种
base::base(int n) :fun(num)
建议是采用第一种类来初始化
------解决方案--------------------
对于构造函数的初始化,可以看成是分两步进行的,第一步是在初始化列表中进行初始化,如果没有显式的在初始化列表中进行初始化,则采用默认的形式进行初始化,类类型采用默认构造函数进行初始化,其他的一般没有初始化值。第二步才进行函数体中的赋值。对于有些类型的变量必须要在初始化列表中进行初始化,比如像没有默认构造函数的类,还有上面的const变量等,如果不在初始化列表中进行初始化就会出错。
------解决方案--------------------
参考:
初始化列表问题