修改const数据成员访问说明符为何影响C++程序编译?
为什么Test类中const成员的访问权限会影响编译结果?
你的疑问核心是:为什么将Test类里的const int i改为public时代码能编译,默认private时却报错?下面分两种情况详细解释:
首先看你提供的代码:
#include <iostream> class Test { const int i; }; int main() { Test a{}; return EXIT_SUCCESS; }
一、默认private时编译报错的原因
- 类成员默认权限规则:C++中类的成员默认访问权限是private,所以
const int i属于私有成员,外部代码(包括main函数里的初始化逻辑)无法直接访问它。 - const成员的强制初始化要求:const类型的变量必须在创建时完成初始化,不能留空。你这里既没有在类内给i赋初始值(比如
const int i = 0;),也没有定义构造函数通过初始化列表初始化i,而是想用Test a{}这种聚合初始化方式。 - 聚合初始化的权限限制:C++标准明确规定,聚合初始化只能操作类的public成员。因为private成员对外不可见,聚合初始化无法访问并初始化i,导致const成员未完成初始化,编译器因此报错。
二、改为public时编译成功的原因
- 符合聚合类型定义:当
const int i改为public后,Test类满足C++中聚合类型的条件——没有用户声明的构造函数、没有私有/保护的非静态数据成员、没有基类、没有虚函数等。 - 空聚合初始化的自动值初始化:使用
Test a{}这种空列表的聚合初始化时,C++11及以后的标准会对成员进行值初始化。对于int类型的const成员i,值初始化会自动将其设为0,满足了const成员必须初始化的要求。 - 访问权限允许操作:因为i是public成员,聚合初始化可以直接访问并完成初始化,所以编译器不会报错,代码顺利通过编译。
内容的提问来源于stack exchange,提问作者Deepak Joshi
相关产品推荐
相关产品推荐

