【发布时间】:2021-05-02 13:40:04
【问题描述】:
我正在编译一个类,完整的程序如下:
#include<iostream>
using namespace std;
class Test{
public:
Test()
{
cout<<"Test variable created...\n";
// accessing width variable in constructor
cout<<"Width is "<<width<<".\n";
}
void setHeight(int h)
{
height = h;
}
void printHeight()
{
cout<<"Height is "<<height<<" meters.\n";
}
int width = 6;
protected:
int height;
};
int main()
{
Test t = Test();
t.setHeight(3);
t.printHeight();
return 0;
}
代码工作得很好,但是构造函数如何访问变量width,直到public块结束才被声明。此外,成员函数如何能够访问公共块中稍后声明的变量? C++ 不是顺序的(按照它们编写的顺序执行语句)吗?
【问题讨论】:
-
声明不是陈述。在尝试编译其代码之前,会收集和存储类的声明。此外,如果程序的可观察行为在“as-if”规则下是相同的,AFAIK,则不需要顺序执行语句。
-
“C++ 不是顺序的(按照它们编写的顺序执行语句)吗?” 不,不是。语句可以按不同的顺序执行,例如成员初始化器列表。语句按照成员在类中列出的顺序执行,而不是按照实际语句的顺序执行。
-
声明为
int height{};,这样用户就不能在没有setHeight()的情况下尝试printHeight()来调用未定义的行为。 -
在调用构造函数之前初始化成员变量(
int width = 6;)。这意味着在调用第一个非静态方法之前必须知道类的结构。 -
Here 你可以看到在实际的构造函数开始工作之前发生了什么。有更好的文档,但我找不到它们。
标签: c++ oop control-flow access-specifier