我刚刚浏览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 ++编写内容以来已经有好几年了。
答案 0 :(得分:11)
那些是constructor initialization lists,对于基本类型,与您习惯的表单没有区别,这是基于赋值而不是初始化。
但是,对于用户定义的类型,可能在性能(以及可能的语义)方面存在差异:
此外,除了使用成员初始化列表初始化它们之外,您无法选择那些不是默认构造的类型,并且您无法选择const
和引用成员,必须立即初始化。
答案 1 :(得分:1)
我和你一样,背着古老的拼贴知识,这种用法似乎很奇怪。但后来才明白,通过使用这种技术,自定义类实现可以在运行时提供更好的性能。 here是关于C ++之父的初始化列表的长篇解释。
答案 2 :(得分:0)
在C ++中构造对象分三步完成:
构造函数定义String() : str(NULL), size(0) {}
在步骤2中为变量赋值。
构造函数定义String() { this->str = NULL; this->size = 0; }
在步骤3中执行此操作。但是,仍然执行步骤2。因此,这种为成员变量赋值的效率较低。