在声明数据成员之前,成员函数中数据成员的可访问性

Accessibility of data member in member function before declaration of data member

本文关键字:数据成员 访问 函数 成员 声明      更新时间:2023-10-16

考虑以下代码:

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