宣布像男人或像牛一样有什么区别?在结构的末尾声明是否会更改实例的范围?其中一种被认为是更好的做法吗?如果是这样,为什么?
#include <iostream>
struct person{
int age;
} guy;
struct animal{
int age;
};
int main(){
animal cow;
cow.age = 10;
guy.age = 20;
return 0;
}
答案 0 :(得分:3)
范围和存储持续时间都会受到影响。
范围:
cow
在main
内有本地范围,在全局范围内不可见。guy
具有全局范围,因此也可以从嵌套范围(例如main
内部)中看到。存储时间:
cow
是一个自动存储持续时间的对象。它的生命周期从其定义(animal cow;
)开始,并在它离开时结束范围(在这种情况下,当main
返回时)。
guy
已经静态存储持续时间。它的生命周期在程序运行时开始(甚至在输入main
之前)并持续到程序结束。
全球变量通常被认为是不良做法。变量应该具有尽可能窄的范围 - 这样可以更容易地推断出它们发生的事情并限制错误。
答案 1 :(得分:2)
您已将guy
声明为全局变量。它对于程序的生命是“活着的”,并且可以随时用于程序的任何部分(但是,如果某个东西在不同的翻译单元中,则需要extern
。
您已在cow
范围内声明main
。如果不将它传递给一个带animal
参数的函数(以某种形式 - 指针,引用,副本),它只能在main
中访问。但是,由于main
是程序的入口点,因此它在程序的整个生命周期中也是“活着的”。您可以通过为两者提供析构函数来查看清理顺序,以便在销毁时将某些内容打印到屏幕上。
答案 2 :(得分:0)
声明如此gui
是一个全局变量,可能被认为是不好的做法。
在我看来,声明变量以及类/结构定义对于类成员来说非常有用,例如:
class Foo {
struct data_t {
int x, y;
} data;
};
答案 3 :(得分:0)
struct person {
int age;
} guy;
与
相同struct person {
int age;
};
person guy;
在这种情况下,男人和母牛之间的唯一区别是,男人是全球性的,牛是本地的。 guy
可以通过任何方法访问,而cow
仅在从主要开始到结束时才有效。