c++ - 默认复制构造函数处理const吗?

标签 c++ pointers reference constants copy-constructor

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

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

非常感谢您的澄清!

最佳答案

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

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

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

这是一个演示程序

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

关于c++ - 默认复制构造函数处理const吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30851933/

相关文章:

c++ - std::cin::ungetc 中的回推次数

c++ - C++中的线程程序并不快

C: 两个不同的数组指向同一个结构

c++ - 应该使用其引用传递对象增加引用计数类中的引用计数

c++ - VCL 中的 Application.DispatcherUnhandledException

c++ - "when use an array"中用途的准确描述是什么

c - 从 'void*' 到 char(*) 的非法转换?

java - JSP 验证用户来自上一页

ios - Cocoa中如何识别和使用ASType

c++ - 提高从客户端应用程序到 MS SQL 2008 数据库的批量导入速度