这个构造函数定义有啥好处[重复]
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->str = NULL; this->size = 0;
在步骤 3 中执行此操作。然而,步骤 2 仍然执行。所以这种给成员变量赋值的方式效率较低。
【讨论】:
以上是关于这个构造函数定义有啥好处[重复]的主要内容,如果未能解决你的问题,请参考以下文章