草庐IT

Initialization

全部标签

c++ - 允许变量未初始化有什么好处?

在许多语言中,您可以在初始化变量之前声明并使用它。例如,在C++中,您可以编写如下代码片段:intx;cout这当然会返回不可预测的(好吧,除非你知道你的程序是如何映射内存的)结果,但我的问题是,为什么编译器允许这种行为?允许使用未初始化的内存是否有一些应用或效率?编辑:我突然想到,将初始化留给用户会最大限度地减少对生命周期有限(写入周期)的内存介质的写入。只是上述“性能”标题下的一个具体示例。谢谢。 最佳答案 我的想法(我以前错了,问问我的妻子吧)是它只是该语言早期版本的遗留物。C的早期版本不允许您在函数中任何您想要的位置声明变量

C++ 模板 : The static member in a global object is not initialized

我有一段简单的C++代码,其中我通过专门化模板定义了一个模板和一个全局对象。对象构造函数访问专用模板中的静态成员。但事实证明,此时静态成员并未初始化。但是对于本地对象(在函数体中定义),它可以工作。我很困惑...我的c++编译器是:g++(Ubuntu5.4.0-6ubuntu1~16.04.4)5.4.020160609/////////////////////////templateclassTB{public:constchar*_name;TB(constchar*str):_name(str){coutclassTA{public:constchar*_name;TA(con

C++ 模板 : The static member in a global object is not initialized

我有一段简单的C++代码,其中我通过专门化模板定义了一个模板和一个全局对象。对象构造函数访问专用模板中的静态成员。但事实证明,此时静态成员并未初始化。但是对于本地对象(在函数体中定义),它可以工作。我很困惑...我的c++编译器是:g++(Ubuntu5.4.0-6ubuntu1~16.04.4)5.4.020160609/////////////////////////templateclassTB{public:constchar*_name;TB(constchar*str):_name(str){coutclassTA{public:constchar*_name;TA(con

c++ - 初始化器列表 *argument* 评估顺序

因此,C++标准要求类成员按照它们在类中声明的顺序进行初始化,而不是按照它们在任何构造函数的初始化列表中的顺序进行初始化。但是,这并不意味着评估这些初始化的参数的顺序。我正在使用一个经常传递对序列化对象的引用的系统,并且想知道我是否可以确保以正确的顺序从中读取位,而与这些位写入对象字段的顺序无关。structFoo{inta;doubleb;//IwanttobeabletodothisFoo(SerObj&s):b(s.readDouble()),a(s.readInt()){}//RatherthanthisFoo(SerObj&s){b=s.readDouble();a=s.re

c++ - 初始化器列表 *argument* 评估顺序

因此,C++标准要求类成员按照它们在类中声明的顺序进行初始化,而不是按照它们在任何构造函数的初始化列表中的顺序进行初始化。但是,这并不意味着评估这些初始化的参数的顺序。我正在使用一个经常传递对序列化对象的引用的系统,并且想知道我是否可以确保以正确的顺序从中读取位,而与这些位写入对象字段的顺序无关。structFoo{inta;doubleb;//IwanttobeabletodothisFoo(SerObj&s):b(s.readDouble()),a(s.readInt()){}//RatherthanthisFoo(SerObj&s){b=s.readDouble();a=s.re

c++ - 错误 : invalid initialization of reference of type 'int&' from expression of type 'const int'

这是一个与thisquestion中的代码无关的问题。,关于以下模板函数。templateclassObject:publicContainer{public:T&object;Object(constT&obj):object(obj){}};这是调用构造函数的代码:templatevoidArray::add_element(constT&element){vec.push_back(newObject(element));}这段代码编译得很好,但是只要我在main中添加一行调用它:Arrayarray;inti=3;array.add_element(i);我收到编译器警告:er

c++ - 错误 : invalid initialization of reference of type 'int&' from expression of type 'const int'

这是一个与thisquestion中的代码无关的问题。,关于以下模板函数。templateclassObject:publicContainer{public:T&object;Object(constT&obj):object(obj){}};这是调用构造函数的代码:templatevoidArray::add_element(constT&element){vec.push_back(newObject(element));}这段代码编译得很好,但是只要我在main中添加一行调用它:Arrayarray;inti=3;array.add_element(i);我收到编译器警告:er

在静态变量初始化中使用 cout 时出现 C++ 段错误

我有一个程序,我使用cout来发出调试信息。代码在静态全局变量的初始化中执行,即在程序执行的早期。当我使用自己的构建脚本构建程序时,它在第一次使用cout时出现段错误(只有一个字符串文字被转移到cout,所以它不能是值)。我使用valgrind检查早期对无效位置的写入,但没有(也没有可能生成这些写入的代码,我在输出之前没有做太多)。当我将源代码复制到Eclipse项目并让Eclipse内置构建器构建它时,一切正常。我没有使用任何奇怪的构建器设置,只是用-ggdb-std=c++0x编译,这是仅有的两个标志。那么,如果之前没有无效写入,带有字符串文字的cout段错误的原因是什么?构建配置

在静态变量初始化中使用 cout 时出现 C++ 段错误

我有一个程序,我使用cout来发出调试信息。代码在静态全局变量的初始化中执行,即在程序执行的早期。当我使用自己的构建脚本构建程序时,它在第一次使用cout时出现段错误(只有一个字符串文字被转移到cout,所以它不能是值)。我使用valgrind检查早期对无效位置的写入,但没有(也没有可能生成这些写入的代码,我在输出之前没有做太多)。当我将源代码复制到Eclipse项目并让Eclipse内置构建器构建它时,一切正常。我没有使用任何奇怪的构建器设置,只是用-ggdb-std=c++0x编译,这是仅有的两个标志。那么,如果之前没有无效写入,带有字符串文字的cout段错误的原因是什么?构建配置

c++ - 处理具有长初始化列表和多个构造函数的类?

我有一个(对我而言)复杂对象,它包含大约20个数据成员,其中许多是指向其他类的指针。所以对于构造函数,我有一个又长又复杂的初始化列表。该类还具有十几个不同的构造函数,反射(reflect)了可以创建该类的各种方式。这些初始化项目中的大多数在这些不同的构造函数之间都没有变化。我担心的是,我现在有大量复制(或大部分复制)代码,如果我需要向类中添加新成员,可能无法将其放入每个构造函数初始化列表中。classObject{Object();Object(conststring&Name);Object(conststring&Name,conststring&path);Object(cons