在声明数据成员之前,成员函数中数据成员的可访问性
Accessibility of data member in member function before declaration of data member
考虑以下代码:
class Test
{
public:
Test() { i = 0; }
private:
int i;
};
数据成员"i"甚至在声明/定义之前就已使用。这不应该是一个编译错误吗?(它编译得很好!!)
规则是,在类定义中定义的成员函数被编译,就好像它们是在类定义之后立即定义的一样。
不应该,在类定义的上下文中,所有成员、数据成员或函数都具有完全的可见性。
声明前使用的数据成员在哪里?
class Test
{
public:
Test() { i = 0; } // constructor
private:
int i; //datamemeber
};
main()
{
Test obj; // memory allocated only here
}
构造函数是在main中只创建了obj之后调用的。则为i分配内存。并且构造函数被调用,因此i 有范围和可见性
这是因为成员函数的主体是类的完整类上下文,如下面引用的语句所述:
来自class.mem.general#6:
6.一个类的完整类上下文是一个:
函数体([dcl.fct.def.general]),
默认参数,
noexcept说明符(〔except.spec〕)或
默认成员初始值设定项
在类的成员规范中。
因此,构造函数的主体是类Test
的完整类上下文,因此在编写类定义时,即使数据成员i
稍后出现,也允许在构造函数内部使用i
。
相关文章:
- 用于访问容器<T>数据成员的正确 API
- 使用指针访问数组中的对象数据成员
- 友元函数无法访问私有数据成员 (c++)
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- 使公共数据成员在C++中无法访问
- 有没有办法在C++中循环访问对象的不同数据成员
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 如何在C++中使用类对象访问指针数据成员
- 通过指针算法访问结构数据成员
- 是否可以访问类数据成员并在析构函数中对它们执行操作?
- 如何在 c++ 中访问类的私有数据成员
- 现代C++编译器是否优化了对类中同一数据成员的重复访问?
- 无法访问派生类函数内的基类的受保护数据成员
- 从私有结构数据成员访问类公共成员函数C++
- 有关C++/组件数据布局、数据成员访问、方法的一般问题
- C++ 共享库不允许静态数据成员访问
- 私人数据成员访问
- OpenCV Mat数据成员访问
- 数据成员访问歧义和菱形继承