在声明末尾或 main 中声明结构或类实例之间的区别
Difference between declaring instances of structs or classes at the end of declaration or in main?
声明像男人或像牛有什么区别?在结构末尾声明是否会更改实例的范围?其中之一被认为是更好的做法吗?如果是这样,为什么?
#include <iostream>
struct person{
int age;
} guy;
struct animal{
int age;
};
int main(){
animal cow;
cow.age = 10;
guy.age = 20;
return 0;
}
范围和存储持续时间都会受到影响。
范围:
-
cow
在main
内部有局部范围,并且从全局范围内不可见。 -
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 的开头到结束处于活动状态。
相关文章:
- 在.cpp文件之间传递结构声明,而不使用全局头文件
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 如何声明不同类型的模板化类之间的转换
- 类型测试对象的动态数组的这两个声明之间的区别?
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- 重复符号 --- 定义和声明之间的差异
- 以下声明之间的区别
- 一条线和两行声明之间的差异
- 恒定声明全局或在使用它的函数中声明恒定声明之间有什么区别?
- 在构造函数中创建数组与在 C++ 中创建声明之间的区别
- 以下声明之间的区别是什么
- 以下声明之间的区别
- pimpl 最终用户的全局远向声明与私有远向声明之间的区别
- C++中include指令和forward声明之间的区别
- 这两个与灰泥相关的声明之间有区别吗
- 2D矢量声明之间的区别
- c++0x:解决函数定义后接空声明和简单声明之间的歧义
- 带有 extern 和没有 extern 的函数的本地/块范围声明之间的区别
- C中的这些声明之间有什么区别