这个构造函数定义有什么好处?

5

我正在浏览Cprogramming.com上的随机页面,注意到构造函数和析构函数教程/示例页面。他们使用了以下定义构造函数的方法:

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++了。


1
https://dev59.com/Y3NA5IYBdhLWcg3whuV_ - Victor Sand
3个回答

11
这些是构造函数初始化列表,对于基本类型而言,与你熟悉的赋值形式没有区别。
然而,对于用户自定义类型,以下两种方式在性能(以及语义上)方面可能存在差异:
1. 先默认构造一个对象,然后再将其赋值为某个值。 2. 直接使用该值进行初始化。
此外,对于那些无法进行默认构造的类型,你只能使用成员初始化列表来初始化它们。同时对于const和引用成员,你也没有选择,必须立即进行初始化。

1
我曾和你一样,对于这种用法感到陌生。但后来我明白了,使用这种技术可以提高自定义类实现的运行性能。这里有一篇关于初始化列表的详细解释,出自C++之父之手。

0

C++中构造对象需要三个步骤:

  1. 获取内存
  2. 初始化成员变量
  3. 执行构造函数。

构造函数定义String() : str(NULL), size(0) {}在第二步为变量分配正确的值。

构造函数定义String() { this->str = NULL; this->size = 0; }在第三步为变量分配正确的值。然而,第二步仍然会被执行。因此,这种为成员变量分配正确值的方式效率较低。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接