C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
来源:互联网 发布:用java求水仙花数 编辑:程序博客网 时间:2024/04/28 10:05
一般我们进行成员变量初始化用两种方法
第一种是通过在构造函数内赋值
class Point
{
public:
Point(){ _x = 0; _y = 0;};
Point( int x, int y ){ _x = 0; _y = 0; }
private:
int _x, _y;
};
第二种是使用初始化列表
class Point
{
public:
Point():_x(0),_y(0){};
Point( int x, int y ):_x(x),_y(y){}
private:
int _x, _y;
};
这两种用法是有区别的
一、在有些情况下,必须使用初始化列表。特别是const和引用数据成员被初始化时。
class Point
{
// 这个类的定义就要求使用初始化成员列表,因为const成员只能被初始化,不能被赋值
public:
Point():_x(0),_y(0){};
Point( int x, int y ):_x(x),_y(y){}
//Point(){ _x = 0; _y = 0;}
//Point( int x, int y ){ _x = 0; _y = 0; }
private:
const int _x, _y;
};
二、是从效率方面来说的,对于内置类型或复合类型,差异不会太大,但对于非内置数据类型,差异还是很明显的
如我们再给Point类添加一个新的string类型的成员变量
class Point
{
const int _x, _y;
string _name;
};
构造函数内赋值进行初始化
Point( int x, int y, string name ){ _x = 0; _y = 0; _name = name; }
_name = name 这个表达式会调用string类的缺省构造函数一次,再调用Operator=函数进行赋值一次。所以需调用两次函数:一次构造,一次赋值
用初始化列表进行初始化
Point( int x, int y, string name ):_x(x),_y(y), _name(name){}
_name会通过拷贝构造函数仅以一个函数调用的代码完成初始化
即使是一个很简单的string类型,不必要的函数调用也会造成很高的代价。随着类越来越大,越来越复杂,它们的构造函数也越来越大而复杂,那么对象创建的代价也越来越高,所以一般情况下建议使用初始化列表进行初始化,不但可以满足const和引用成员的初始化要求,还可以避免低效的初始化数据成员。
转载:http://blog.csdn.net/pizi0475/article/details/5478333
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C/C++基础问答(1):通过初始化列表和构造函数内赋值初始化成员变量的区别
- C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- C++构造函数对类成员变量初始化,使用初始化列表和构造函数内部直接赋值 的区别
- [C++]类成员冒号初始化以及构造函数内赋值
- c++构造函数成员初始化中赋值和初始化列表两种方式的区别
- 成员初始化列表和构造函数体初始化的区别
- C++使用初始化清单和直接在构造函数内初始化成员变量的区别
- 使用初始化清单和直接在构造函数内初始化成员变量的区别
- 使用初始化清单和直接在构造函数内初始化成员变量的区别
- C++使用初始化清单和直接在构造函数内初始化成员变量的区别
- Android权限共享UID和签名(转)
- X Window 的 OpenGL 扩展 —— GLX
- bash shell字符串的截取
- C#中利用泛型实现实例单件化
- 求助
- C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
- window.open
- bash遇到的一个变量作用域问题,记录下
- 面试题:火车运煤问题
- viewDidUnload 和 dealloc 的区别
- Android通讯录分组管理
- Struts2 接受参数方法
- 面试题:赛马问题
- 常用CentOS vsftpd安装设置讲解