我了解到默认的复制赋值运算符(编辑:已更正,而不是复制构造函数)不能处理常量和引用。因此,如果一个类包含这样的成员,那么编译器将不会为它生成默认的复制构造函数。这个说法正确吗?为什么const不能处理?
此外,如果一个类包含指针作为成员,编译器会生成一个复制构造函数吗?我知道默认的复制构造函数只做浅层复制,但是编译器至少会生成一个复制构造函数,不是吗?
非常感谢您的澄清!
发布于 2015-06-16 02:11:56
构造函数需要一种方法来初始化常量非静态数据成员和引用类型的非静态数据成员,因为这些数据成员应在创建相应对象时进行初始化。因此,要么必须自己编写默认构造函数,要么这些数据成员必须在类定义中指定花括号或相等初始值设定项。
此外,一些数据成员可以没有默认构造函数。因此,编译器无法为该类创建默认构造函数,因为它无法调用此类数据成员的相应默认构造函数。
至于指针,它们不会阻止编译器定义复制构造函数。
这是一个演示程序
#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。
发布于 2015-06-16 02:08:29
如果没有为类X定义复制构造函数,则会隐式定义复制构造函数。它通常采用X(const X&)形式,但如果成员需要,它也可以是其他单参数形式之一,并且可以定义为已删除。构造函数的行为就像每个成员都是从右侧的相应成员初始化的一样,并且具有一个空的主体。有一些细节,但这只是大体的想法。
由于可以从相同类型的值初始化常量数据成员和引用数据成员,因此此类成员没有什么特殊之处。(不过,任务的情况有所不同。)
https://stackoverflow.com/questions/30851933
复制相似问题