这个构造函数定义有啥好处[重复]

Posted

技术标签:

【中文标题】这个构造函数定义有啥好处[重复]【英文标题】:What is benefit of this constructor definition [duplicate]这个构造函数定义有什么好处[重复] 【发布时间】:2013-06-02 15:03:14 【问题描述】:

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

【问题讨论】:

***.com/questions/926752/… 【参考方案1】:

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

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

    默认构造一个对象并然后为其赋值,然后 直接用该值初始化它。

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

    获取内存 成员变量已初始化 构造函数被执行。

构造函数定义String() : str(NULL), size(0) 为步骤2中的变量分配适当的值。

构造函数定义String() this-&gt;str = NULL; this-&gt;size = 0; 在步骤 3 中执行此操作。然而,步骤 2 仍然执行。所以这种给成员变量赋值的方式效率较低。

【讨论】:

以上是关于这个构造函数定义有啥好处[重复]的主要内容,如果未能解决你的问题,请参考以下文章

请问把基类构造函数声明为protected有啥好处呢(抽象基类)

Java中私有构造函数有啥用?

用户没有定义无参数构造函数[重复]

python中的构造函数和初始化程序有啥区别? [复制]

构造函数后面2个括号各有啥作用

对带有数组的构造函数的未定义引用[重复]