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++ 写东西已经有好几年了。

4

3 回答 3

11

这些是构造函数初始化列表,对于基本类型,与您习惯的形式没有区别,它基于赋值而不是初始化。

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

  1. 默认构造一个对象,然后为其分配一个值,并且
  2. 直接用该值初始化它。

此外,对于那些不可默认构造的类型,除了使用成员初始化列表来初始化它们之外,您没有选择,并且您也没有选择const和引用成员,必须立即初始化。

于 2013-06-02T15:06:22.963 回答
1

我和你一样,有了旧的拼贴知识,这种用法似乎很奇怪。但随后了解通过使用这种技术,自定义类实现在运行时提供更好的性能。这里是来自 C++ 之父的关于初始化列表的长解释

于 2013-06-02T15:20:36.560 回答
0

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

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

构造函数定义String() : str(NULL), size(0) {}将正确的值分配给步骤 2 中的变量。

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

于 2013-06-02T15:07:44.327 回答