在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
第一种是通过在构造函数内赋值 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://www.itqun.net/content-detail/105800_2.html 相关热门文章
给主人留下些什么吧!~~
评论热议
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论