c++ - 为什么无法通过将数据传递给某个函数来在全局范围内初始化数据?

标签 c++ function constructor initialization global-variables

我一直想知道为什么不允许通过将任何数据传递给某个函数来初始化任何数据,尽管事实上构造函数无论如何都可以在全局范围内调用,所以如果我们有类似全局范围内的数组,它不能被任何函数初始化,但如果它在全局范围内的结构对象中,则可以在该范围内使用构造函数对其进行初始化:

//global scope

    char charArray[100];//can't be initialized using any function at global scope but in other scopes it could by being passed to some function

    struct Test{
     public:
      Test(){
       //initialization
      }
      char charArray[100];
    };
    Test obj();//now charArray can be initialized using constructor at global scope

最佳答案

实际上,您可以在全局范围内调用函数。

int foo()
{
    return 5;
}

int bar = foo();

这正是多年前 C 语言的设计方式,您不能让函数在全局范围内独立运行。所有程序代码都从 main 开始。

一般来说,您对全局初始化的依赖越少(尽可能避免它),您就越不必担心奇怪的静态初始化错误和此类随机出现的问题。

数组是一种不同的情况,因为您永远不能将函数调用的结果分配给数组 - 在这种情况下初始化它的唯一方法是在构造函数中,正如您所观察到的那样。

编辑:有些邪恶的方法来初始化一个受评论启发的数组:

bool do_init(int a[50])
{
    // Do whatever to init the array here.
    return true;
}

int array[50];
bool init_array = do_init(array);

这仅适用于在翻译单元中,全局变量的创建/初始化顺序保证是它们在文件中出现的顺序。

关于c++ - 为什么无法通过将数据传递给某个函数来在全局范围内初始化数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4317315/

相关文章:

c++ - 在 std::map 中使用 char* 作为键,它是如何工作的

php - 用于显示 mysql 版本 5.0.45 的 mysql 数据库中用户定义函数的代码的 Mysql 查询是什么?

c - 工作负载分配公式中字符 's' 代表什么

当本地磁盘上不存在文件时,java文件构造函数

java - 抽象类中的疑问

c++ - 如何优化拒绝采样

c++ - CUDA 相当于 OpenCV 3 中的 estimateRigidTransform

c++ - 处理二维数组的问题

r - r中的多重匹配函数

c++ - 解决 vector 的默认构造函数要求?