C++中的空类,默认产生哪些类成员函数

如题所述

一般进行成员变量初始化用两种方法第一种是通过在构造函数内赋值classPoint{public:Point(){_x=0;_y=0;};Point(intx,inty){_x=0;_y=0;}private:int_x,_y;};第二种是使用初始化列表classPoint{public:Point():_x(0),_y(0){};Point(intx,inty):_x(x),_y(y){}private:int_x,_y;};这两种用法是有区别的一、在有些情况下,必须使用初始化列表。特别是const和引用数据成员被初始化时。classPoint{//这个类的定义就要求使用初始化成员列表,因为const成员只能被初始化,不能被赋值public:Point():_x(0),_y(0){};Point(intx,inty):_x(x),_y(y){}//Point(){_x=0;_y=0;}//Point(intx,inty){_x=0;_y=0;}private:constint_x,_y;};二、是从效率方面来说的,对于内置类型或复合类型,差异不会太大,但对于非内置数据类型,差异还是很明显的如再给Point类添加一个新的string类型的成员变量classPoint{constint_x,_y;string_name;};构造函数内赋值进行初始化Point(intx,inty,stringname){_x=0;_y=0;_name=name;}_name=name这个表达式会调用string类的缺省构造函数一次,再调用Operator=函数进行赋值一次。所以需调用两次函数:一次构造,一次赋值用初始化列表进行初始化Point(intx,inty,stringname):_x(x),_y(y),_name(name){}_name会通过拷贝构造函数仅以一个函数调用的代码完成初始化即使是一个很简单的string类型,不必要的函数调用也会造成很高的代价。随着类越来越大,越来越复杂,它们的构造函数也越来越大而复杂,那么对象创建的代价也越来越高,所以一般情况下使用初始化列表进行初始化,不但可以满足const和引用成员的初始化要求,还可以避免低效的初始化数据成员。
温馨提示:答案为网友推荐,仅供参考
相似回答