C++ 构造函数的哪种方式最好?
构造类有两种方法:C++ 构造函数的哪种方式最好?,c++,constructor,C++,Constructor,构造类有两种方法: class Cell{ public: Cell(int cellID, int nx); ~Cell(); private: int cellID_; int nx; }; 第一种方式: Cell::Cell(int cellID, int nx) : cellID_(cellID), nx_(nx){} 第二种方式: Cell::Cell(int cellID, int n
class Cell{
public:
Cell(int cellID, int nx);
~Cell();
private:
int cellID_;
int nx;
};
第一种方式:
Cell::Cell(int cellID, int nx)
: cellID_(cellID), nx_(nx){}
第二种方式:
Cell::Cell(int cellID, int nx){init(cellID, nx)}
void Cell::init(int cellID, int nx){
cellID_ = cellID;
nx_ = nx;
}
性能:
第一种方法是最好的,因为它初始化了真正意义上的对象,而第二种方法分配了已经初始化的对象
请注意,使用第二种方法时会有一点开销:
正如您所看到的,在后者中有一个额外的创建和分配开销,这对于用户定义的类来说可能是相当大的
Cost of Member Initialization = Object Construction
Cost of Member Assignment = Object Construction + Assignment
如果成员是内置的/POD数据类型,则没有开销,但如果成员是非POD类型,则开销很大
必要性:
请注意,在某些情况下,您将被迫使用成员初始值设定项列表:
- 您的类有一个引用成员
- 您的类有一个非静态常量成员
鉴于上述实践,第一种方法总是首选。第一种方法几乎总是首选。对于作为引用的任何成员,
const
或只需要初始值设定项(即,不能默认构造)都是必需的。在其他情况下,它可以通过直接初始化成员对象而不是默认构造,然后分配给它来减少额外的工作。一般来说,初始化列表更好。检查这个C++ FAQ。< /P>
除非您需要以下功能
请注意,您的代码不会被编译器编译,因为
nx
不会在任何地方声明。您的第二个链接不再是C++11委托构造函数的情况。