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

参考

相关推荐
小欣加油8 小时前
leetcode3751 范围内总波动值I
java·数据结构·c++·算法·leetcode
代码中介商8 小时前
C++左值与右值:核心判断法则详解
开发语言·c++
JAVA9658 小时前
JAVA面试-并发篇 05-并发包AQS队列实现原理是什么
java·开发语言·面试
玖玥拾8 小时前
C/C++ 基础笔记(七)
c语言·c++
Halo_tjn8 小时前
反射与设计模式1
java·开发语言·算法
珊瑚里的鱼9 小时前
手撕单例模式中的饿汉模式和懒汉模式,懒汉模式还要再多加一个C++11版本的
开发语言·c++·单例模式
_不会dp不改名_9 小时前
python-opencv环境搭建
开发语言·python·opencv
HappyAcmen9 小时前
9.复盘API全套流程
开发语言·python
zh路西法9 小时前
【Linux 串口通信】基于 C++ 多线程的同步/异步串口实现
linux·运维·c++·python
charlie1145141919 小时前
通用GUI编程技术——图形渲染实战(四十五)——D3D12资源与堆管理:从上传到驻留
开发语言·3d·图形渲染·win32