默认复制构造函数是否处理常量



我了解到默认的复制赋值运算符(编辑:更正,而不是复制构造函数)不处理常量和引用。因此,如果类包含此类成员,则编译器不会为其生成默认的复制构造函数。这种说法正确吗?为什么常量不能处理?

此外,如果一个类包含指针作为成员,编译器会生成复制构造函数吗?我知道默认复制构造函数只做浅拷贝,但编译器至少会生成一个复制构造函数,对吗?

非常感谢您的澄清!

构造函数需要一种方法来初始化引用类型的常量非静态数据成员和非静态数据成员,因为这些数据成员应在创建相应对象时初始化。因此,要么必须自己编写默认构造函数,要么这些数据成员必须在类定义中指定大括号或等于初始值设定项。

此外,某些数据成员可以没有默认构造函数。因此,编译器无法为类创建默认构造函数,因为它无法调用此类数据成员的相应默认构造函数。

至于指针,它们不会阻止编译器定义复制构造函数。

这是一个演示程序

#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。

如果不为类X定义复制构造函数,则隐式定义复制构造函数。它通常采用 X(const X&) 的形式,但如果成员需要它,它也可以是其他单参数形式之一,并且可以定义为删除。构造函数的行为就像每个成员都是从右侧的相应成员初始化的,并且具有空主体。有细节,但这是一般的想法。

由于可以从相同类型的值初始化 const 数据成员和引用数据成员,因此此类成员没有什么特别之处。(不过,任务的故事有所不同。

最新更新