Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 构造函数的哪种方式最好?_C++_Constructor - Fatal编程技术网

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委托构造函数的情况。