C++中合成的默认构造函数的访问权限

问题

我们知道,在C++中,如果没有为一个类显式定义构造函数,那么编译器会为我们隐式地定义一个默认构造函数。那么,你有没有想过,这个隐式定义的默认构造函数(合成的默认构造函数)的访问权限是什么呢?它跟类中其他成员的权限有没有什么关系呢?

比如,下面这个类,它的所有成员都是 private 的,那么它的合成的默认构造函数会是 private 的吗?

cpp 复制代码
class MyClass {
// 编译器为MyClass合成的默认构造函数的访问控制权限是什么呢?
private:
	int val1;
	double val2;
	void info();
};

分析

事实上,通过编码很容易找到答案:

cpp 复制代码
class MyClass {
// 编译器为MyClass合成的默认构造函数的访问控制权限是什么呢?
private:
	int val1;
	double val2;
	void info();
};

void func() {
	MyClass obj;	// 正常编译,不会报错,说明默认构造函数是public的
}

从上面的代码可以看出,实际上编译器合成的默认构造函数永远都是 public 权限的,无论其中的成员是什么访问权限。

关于这一点,cppreference 中也有清晰的说明:

If no user-declared constructors of any kind are provided for a class type, the compiler will always declare a default constructor as an inline public member of its class.

如果用户没有为一个类提供任意种类的构造器,编译器总是会为该类声明一个作为内联公共成员的默认构造器。


拓展

事实上,不仅仅是合成的默认构造函数,包括编译器合成的拷贝控制成员(合成的拷贝构造函数、合成的移动构造函数、合成的赋值运算符和合成的析构函数),也都是永远是 public 的。

参考

相关推荐
所以遗憾是什么呢?9 分钟前
【题解】Educational Codeforces Round 195 (Rated for Div. 2) ABCDE
c++·动态规划·acm·icpc·ccpc·xcpc·codeforecs
xixiaoyunya21 分钟前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
学逆向的36 分钟前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
小坏讲微服务1 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
Lhan.zzZ2 小时前
Qt WebEngineView 在 Linux 上无法加载网页:从“看不见 HTML“到“禁用沙箱“
linux·c++·qt
打工仔折腾 AI3 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
MATLAB代码顾问3 小时前
Simulink PI 参数扫描与批量仿真完整 MATLAB 代码
开发语言·matlab
Want5953 小时前
Python跳动的爱心②
开发语言·python·数学建模
sysu_chenxy3 小时前
二重循环输出二维图形
c++
小羊没烦恼!4 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html