声明结尾或主要声明结构或类的实例之间的区别?

时间:2014-02-21 18:29:29

标签: c++ class struct instance

宣布像男人或像牛一样有什么区别?在结构的末尾声明是否会更改实例的范围?其中一种被认为是更好的做法吗?如果是这样,为什么?

#include <iostream>

struct person{
    int age;
} guy;

struct animal{
    int age;
};

int main(){
    animal cow;
    cow.age = 10;

    guy.age  = 20;

    return 0;
}

4 个答案:

答案 0 :(得分:3)

范围存储持续时间都会受到影响。

范围:

  • cowmain内有本地范围,在全局范围内不可见。
  • guy具有全局范围,因此也可以从嵌套范围(例如main内部)中看到。

存储时间:

  • cow是一个自动存储持续时间的对象。它的生命周期从其定义(animal cow;)开始,并在它离开时结束范围(在这种情况下,当main返回时)。

  • guy已经静态存储持续时间。它的生命周期在程序运行时开始(甚至在输入main之前)并持续到程序结束。

全球变量通常被认为是不良做法。变量应该具有尽可能窄的范围 - 这样可以更容易地推断出它们发生的事情并限制错误。

答案 1 :(得分:2)

您已将guy声明为全局变量。它对于程序的生命是“活着的”,并且可以随时用于程序的任何部分(但是,如果某个东西在不同的翻译单元中,则需要extern

您已在cow范围内声明main。如果不将它传递给一个带animal参数的函数(以某种形式 - 指针,引用,副本),它只能在main中访问。但是,由于main是程序的入口点,因此它在程序的整个生命周期中也是“活着的”。您可以通过为两者提供析构函数来查看清理顺序,以便在销毁时将某些内容打印到屏幕上。

Example

答案 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仅在从主要开始到结束时才有效。