我了解到默认的复制赋值运算符(EDIT:已更正,而非复制构造函数)并不处理const和引用。因此,如果一个类包含这样的成员,那么编译器将不会为它生成默认的复制构造函数。这个陈述是否正确?为什么不能处理const?
此外,如果一个类包含指针作为成员,编译器是否会生成一个复制构造函数?我理解默认拷贝构造函数只做浅拷贝,但编译器至少会生成一个拷贝构造函数,会吗?
非常感谢您的澄清!
答案 0 :(得分:4)
构造函数需要一种方法来初始化常量非静态数据成员和引用类型的非静态数据成员,因为这些数据成员应在创建相应对象时初始化。 因此,您必须自己编写默认构造函数,或者这些数据成员必须在类定义中指定了brace-or equalt初始值设定项。
一些数据成员也可以没有默认构造函数。因此,编译器无法为该类创建默认构造函数,因为它无法调用此类数据成员的相应默认构造函数。
对于指针,它们不会阻止编译器定义复制构造函数。
这是一个示范程序
#include <iostream>
struct A
{
const int i = 10;
};
struct B
{
const int i;
};
int main()
{
A a;
std::cout << "a.i = " << a.i << std::endl;
// B b; // compilation error
}
对于结构A,编译器隐式定义了默认构造函数,因为数据成员i在类定义中初始化。 但是对于结构B,编译器无法定义默认构造函数,因为它不知道如何初始化常量数据成员i。
答案 1 :(得分:1)
如果没有为类X
定义复制构造函数,则隐式定义复制构造函数。它通常采用X(const X&)
形式,但如果成员需要,它也可以具有其他单参数形式之一,并且可以将其定义为已删除。构造函数的行为就好像每个成员都是从右侧的相应成员初始化,并且具有空体。有细节,但这是一般的想法。
由于您可以从相同类型的值初始化const数据成员和引用数据成员,因此这些成员没有什么特别之处。 (不过,故事的分配不同。)