问题
我们知道,在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
的。
参考