【发布时间】:2015-11-21 00:06:47
【问题描述】:
什么是c++中构造函数的默认访问以及为什么?
公共的、私有的还是受保护的?
以及如何通过code查看?
【问题讨论】:
-
构造函数在这方面并不特殊。所有成员都一样。
标签: c++ constructor default public
什么是c++中构造函数的默认访问以及为什么?
公共的、私有的还是受保护的?
以及如何通过code查看?
【问题讨论】:
标签: c++ constructor default public
如果你自己不声明构造函数,编译器总是会为你生成一个public trivial 的。他们还将隐式创建一个公共复制构造函数和复制赋值运算符。
来自 c++ 标准 12.1.5:
如果类 X 没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值。隐式声明的默认构造函数是其类的内联公共成员。
12.8.7 和 12.8.11:
如果类定义没有显式声明复制构造函数,则隐式声明。 [...] 隐式声明的复制/移动构造函数是其类的内联公共成员。
终于 12.8.18、12.8.20、12.8.22:
如果类定义没有显式声明复制赋值运算符,则隐式声明一个。 [...] 如果类 X 的定义没有显式声明移动赋值运算符,则将隐式声明 [...]。 隐式声明的复制/移动赋值运算符是其类的内联公共成员。
如果您使用c++11,则不会始终生成移动构造函数。有关详细信息,请参阅第 12.8.20 节。
【讨论】:
private?
构造函数或任何其他成员没有默认访问权限。在使用关键字class 定义的类中,默认情况下所有成员都是私有的;在使用关键字struct 定义的类中,默认情况下它们是公共的。这包括构造函数。
【讨论】:
没有对构造函数的默认访问。当你在类中声明它时,你决定访问是什么。如果您谈论的是由编译器创建的默认构造函数,那么 C++ 标准 12.1.4 具有:
[...]隐式声明的默认构造函数是其类的内联公共成员。
【讨论】:
C++中构造函数的默认访问是什么,为什么?
隐式生成的默认构造函数、复制构造函数、移动构造函数、复制赋值、移动赋值和析构函数都隐式声明为public,原因很明显(否则默认情况下所有类型都不是可实例化的、可复制的、可移动的和可破坏的)。
如果您要声明自己的默认构造函数,那么当然取决于您为其设置的可见性,就像任何其他成员函数一样。
以及如何通过代码查看?
如果您的默认构造函数(类型为 T)被声明为 protected 或 private,则以下内容将无法编译:
T x;
【讨论】: