C++ C++;具有变量初始化的构造函数
我正在读一本关于数据结构的书,偶然发现了这段代码:C++ C++;具有变量初始化的构造函数,c++,visual-c++,constructor,C++,Visual C++,Constructor,我正在读一本关于数据结构的书,偶然发现了这段代码: class UnorderedArray { public: UnorderedArray(int size, int growBy = 1) : m_array(NULL), m_maxSize(0), m_growSize(0), m_numElements(0) { if (size) { m_maxSize = size; m_array = new T[m_maxSize];
class UnorderedArray
{
public:
UnorderedArray(int size, int growBy = 1) :
m_array(NULL), m_maxSize(0), m_growSize(0), m_numElements(0)
{
if (size) {
m_maxSize = size;
m_array = new T[m_maxSize];
m_growSize = ((growBy > 0) ? growBy : 0);
}
}
private:
T * m_array;
int m_maxSize;
int m_growSize;
int m_numElements;
}
谁能给我解释一下这段代码吗
UnorderedArray(int size, int growBy = 1) :
m_array(NULL), m_maxSize(0), m_growSize(0), m_numElements(0)
我相信这是对这些变量的某种初始化,但我似乎找不到具体的答案。无序数组就是这个类
UnorderedArray(int size, int growBy = 1):
是接受一个或两个整数的构造函数的签名,如果未提供第二个整数,则默认为1(即如果未提供参数,则为1)
是显式的成员初始化,它将m_array设置为Null,m_maxSize设置为0,m_growSize设置为0,m_numElements设置为0 UnorderedArray是类
UnorderedArray(int size, int growBy = 1):
是接受一个或两个整数的构造函数的签名,如果未提供第二个整数,则默认为1(即如果未提供参数,则为1)
是显式的成员初始化,它将m_array设置为Null,m_maxSize设置为0,m_growSize设置为0,m_numElements设置为0 正如宋元耀的评论所指出的,这被称为初始值设定项列表,详细解释见。这个
m_数组(NULL)
相当于构造函数主体中的m_数组=NULL
。正如宋元耀的评论所指出的,这被称为初始值设定项列表,并在。此m_数组(NULL)
相当于构造函数主体中的m_数组=NULL
。是的,代码将变量初始化为括号中的值。C++的这个特性被称为“强>初始化列表>/P>
如中所述,在编写类构造函数时,您应该更喜欢使用成员初始化列表来分配:
考虑以下初始化成员对象的构造函数
使用初始化列表:Fred::Fred():x_uz(无论什么){}
。这个
这样做最常见的好处是提高了性能。对于
例如,如果表达式where与member的类型相同
变量x
,构造任意表达式的结果
直接在x
内部-编译器不单独复制
对象即使类型不同,编译器通常也是
能够使用初始化列表比使用
作业
构建构造函数的另一种(低效)方法是通过分配,
例如:Fred::Fred(){x_=whatever;}
。在本例中,表达式
任何导致创建一个单独的临时对象的原因
临时对象被传递到对象的赋值操作符中。
然后在处销毁临时对象代码>。那太没效率了
似乎这还不够糟糕,效率低下还有另一个原因
在构造函数中使用赋值时:成员对象将
完全由其默认构造函数构造,这可能
例如,分配一些默认内存量或打开一些默认内存
文件所有这些工作都可能是白费力气的,如果这个人有任何表情的话
和/或赋值运算符使对象关闭该文件和/或
释放该内存(例如,如果默认构造函数没有分配
足够大的内存池(如果打开了错误的文件)
结论:在所有其他条件相同的情况下,如果
您使用初始化列表而不是赋值
换句话说,如图所示的代码比在构造函数主体中初始化类的成员变量的替代代码更可取:
UnorderedArray(int size, int growBy = 1)
{
m_array = NULL;
m_maxSize = 0;
m_growSize = 0;
m_numElements = 0;
if (size) {
m_maxSize = size;
m_array = new T[m_maxSize];
m_growSize = ((growBy > 0) ? growBy : 0);
}
}
是的,代码将变量初始化为括号中的值。C++的这个特性被称为“强>初始化列表>/P>
如中所述,在编写类构造函数时,您应该更喜欢使用成员初始化列表来分配:
考虑以下初始化成员对象的构造函数
使用初始化列表:Fred::Fred():x_uz(无论什么){}
。这个
这样做最常见的好处是提高了性能。对于
例如,如果表达式where与member的类型相同
变量x
,构造任意表达式的结果
直接在x
内部-编译器不单独复制
对象即使类型不同,编译器通常也是
能够使用初始化列表比使用
作业
构建构造函数的另一种(低效)方法是通过分配,
例如:Fred::Fred(){x_=whatever;}
。在本例中,表达式
任何导致创建一个单独的临时对象的原因
临时对象被传递到对象的赋值操作符中。
然后在处销毁临时对象代码>。那太没效率了
似乎这还不够糟糕,效率低下还有另一个原因
在构造函数中使用赋值时:成员对象将
完全由其默认构造函数构造,这可能
例如,分配一些默认内存量或打开一些默认内存
文件所有这些工作都可能是白费力气的,如果这个人有任何表情的话
和/或赋值运算符使对象关闭该文件和/或
释放该内存(例如,如果默认构造函数没有分配
足够大的内存池(如果打开了错误的文件)
结论:在所有其他条件相同的情况下,如果
您使用初始化列表而不是赋值
换句话说,如图所示的代码比在构造函数主体中初始化类的成员变量的替代代码更可取:
UnorderedArray(int size, int growBy = 1)
{
m_array = NULL;
m_maxSize = 0;
m_growSize = 0;
m_numElements = 0;
if (size) {
m_maxSize = size;
m_array = new T[m_maxSize];
m_growSize = ((growBy > 0) ? growBy : 0);
}
}