建设网店网站,wordpress++分页,天津市城乡建设网,莱芜二手房问题
我们知道#xff0c;在C中#xff0c;如果没有为一个类显式定义构造函数#xff0c;那么编译器会为我们隐式地定义一个默认构造函数。那么#xff0c;你有没有想过#xff0c;这个隐式定义的默认构造函数#xff08;合成的默认构造函数#xff09;的访问权限是什么…问题
我们知道在C中如果没有为一个类显式定义构造函数那么编译器会为我们隐式地定义一个默认构造函数。那么你有没有想过这个隐式定义的默认构造函数合成的默认构造函数的访问权限是什么呢它跟类中其他成员的权限有没有什么关系呢
比如下面这个类它的所有成员都是 private 的那么它的合成的默认构造函数会是 private 的吗
class MyClass {
// 编译器为MyClass合成的默认构造函数的访问控制权限是什么呢
private:int val1;double val2;void info();
};分析
事实上通过编码很容易找到答案
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 的。
参考
Are synthesized copy control members always public?Default constructors