这个构造函数定义的好处是什么

时间:2013-06-02 15:03:14

标签: c++ class constructor coding-style

我刚刚浏览Cprogramming.com上的随机页面并注意到Constructors and Destructors教程/示例页面。他们使用了以下定义构造函数的方法:

class String
{
    private:
        char *str;
        int size;
    public:
        String() : str(NULL), size(0) { }  // <- This statement
        String(int size) : str(NULL), size(size) {  // <- And this one
            str = new char[size];
        }
}

我一直在使用带有魔法this指针的构造函数的老式定义:

String() { 
    this->str = NULL;
    this->size = 0;
}
String(int size) {
    this->size = size;
    this->str = new char[size];
}

除了明显较小的代码(较少的行数)之外,第一个声明中是否还有其他好处?

PS:自从我上次用C ++编写内容以来已经有好几年了。

3 个答案:

答案 0 :(得分:11)

那些是constructor initialization lists,对于基本类型,与您习惯的表单没有区别,这是基于赋值而不是初始化。

但是,对于用户定义的类型,可能在性能(以及可能的语义)方面存在差异:

  1. 默认构建一个对象,然后为其赋值,
  2. 用该值直接初始化它。
  3. 此外,除了使用成员初始化列表初始化它们之外,您无法选择那些不是默认构造的类型,并且您无法选择const和引用成员,必须立即初始化。

答案 1 :(得分:1)

我和你一样,背着古老的拼贴知识,这种用法似乎很奇怪。但后来才明白,通过使用这种技术,自定义类实现可以在运行时提供更好的性能。 here是关于C ++之父的初始化列表的长篇解释。

答案 2 :(得分:0)

在C ++中构造对象分三步完成:

  1. 记忆是获得的
  2. 成员变量已初始化
  3. 构造函数已执行。
  4. 构造函数定义String() : str(NULL), size(0) {}在步骤2中为变量赋值。

    构造函数定义String() { this->str = NULL; this->size = 0; }在步骤3中执行此操作。但是,仍然执行步骤2。因此,这种为成员变量赋值的效率较低。