在声明末尾或 main 中声明结构或类实例之间的区别

Difference between declaring instances of structs or classes at the end of declaration or in main?

本文关键字:声明 之间 实例 区别 main 结构      更新时间:2023-10-16

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

#include <iostream>
struct person{
    int age;
} guy;
struct animal{
    int age;
};
int main(){
    animal cow;
    cow.age = 10;
    guy.age  = 20;
    return 0;
}

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

范围:

  • cowmain内部有局部范围,并且从全局范围内不可见。
  • guy具有全局作用域,因此在嵌套作用域(例如main内部的作用域)中也可见。

储存期限:

  • cow具有自动存储持续时间的对象。它的生命周期从其定义(animal cow;)开始,到超出范围时结束(在本例中,当main返回时)。

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

全局变量通常被认为是不良做法。变量的范围应该尽可能窄 - 这样可以更轻松地推理它们发生的事情并限制错误。

您已将guy声明为全局变量。 它在程序的生命周期中是"活跃的",并且可以随时用于程序的任何部分(但是,如果某些内容在不同的翻译单元中,则需要对其进行extern)。

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

像这样声明gui是一个全局变量,这可能被认为是不好的做法。

在我看来,声明变量以及类/结构定义对类成员最有用,如下所示:

class Foo {
    struct data_t { 
        int x, y;
    } data;
};
struct person {
    int age;
} guy;

struct person {
    int age;
};
person guy;
在这种情况下,guy

和 cow 之间的唯一区别是 guy 是全局的,而 cow 是本地的。 guy可以通过任何方法访问,而cow仅从 main 的开头到结束处于活动状态。