草庐IT

Initialization

全部标签

c++ - 为什么我们不能在声明时初始化类成员?

我想知道为什么我们不能在声明时初始化成员。classFoo{intBar=42;//thisisinvalid};相当于使用构造函数初始化列表。classFoo{intBar;public:Foo():Bar(42){}}我个人的理解是,上面的例子更具表现力和意图。此外,这是一个较短的语法。而且我认为不会与其他语言元素混淆。官方对此有澄清吗? 最佳答案 在C++11之前,不能像这样初始化非静态成员。如果您使用C++11编译器进行编译,它应该很乐意接受您提供的代码。我想首先不允许它的原因是因为数据成员声明不是定义。没有引入对象。如果您

java - 与 Java 静态 block 等效的 C++ 习语是什么?

我有一个包含一些静态成员的类,我想运行一些代码来初始化它们(假设这段代码不能转换为简单的表达式)。在Java中,我会这样做classMyClass{staticintmyDatum;static{/*dosomecomputationwhichsetsmyDatum*/}}除非我弄错了,C++不允许这样的静态代码块,对吧?我应该怎么做?我想要以下两个选项的解决方案:在加载进程时(或加载具有此类的DLL)时发生初始化。在第一次实例化类时进行初始化。对于第二个选项,我在想:classStaticInitialized{staticboolstaticsInitialized=false;v

java - 与 Java 静态 block 等效的 C++ 习语是什么?

我有一个包含一些静态成员的类,我想运行一些代码来初始化它们(假设这段代码不能转换为简单的表达式)。在Java中,我会这样做classMyClass{staticintmyDatum;static{/*dosomecomputationwhichsetsmyDatum*/}}除非我弄错了,C++不允许这样的静态代码块,对吧?我应该怎么做?我想要以下两个选项的解决方案:在加载进程时(或加载具有此类的DLL)时发生初始化。在第一次实例化类时进行初始化。对于第二个选项,我在想:classStaticInitialized{staticboolstaticsInitialized=false;v

c++ - 为什么在堆中创建对象或堆栈中的临时对象时,隐式构造函数将结构中的 POD 初始化为零?

标准和C++书说,类类型成员的默认构造函数由隐式生成的默认构造函数调用,但内置类型未初始化。但是,在这个测试程序中,在堆中分配对象或使用临时对象时,我得到了意想不到的结果:#includestructContainer{intn;};intmain(){Containerc;std::coutn我得到这个输出:[STACK]Num:-1079504552[HEAP]Num:0[TEMP]Num:0这是编译器特有的行为吗?我真的不打算依赖这个,但我很想知道为什么会发生这种情况,特别是对于第三种情况。 最佳答案 这是预期的行为。有两个概

c++ - 为什么在堆中创建对象或堆栈中的临时对象时,隐式构造函数将结构中的 POD 初始化为零?

标准和C++书说,类类型成员的默认构造函数由隐式生成的默认构造函数调用,但内置类型未初始化。但是,在这个测试程序中,在堆中分配对象或使用临时对象时,我得到了意想不到的结果:#includestructContainer{intn;};intmain(){Containerc;std::coutn我得到这个输出:[STACK]Num:-1079504552[HEAP]Num:0[TEMP]Num:0这是编译器特有的行为吗?我真的不打算依赖这个,但我很想知道为什么会发生这种情况,特别是对于第三种情况。 最佳答案 这是预期的行为。有两个概

c++ - 在 C++ 中初始化 const 字符串的静态 const 数组

我在初始化常量字符串的常量数组时遇到问题。来自week.h(仅显示相关部分):classWeek{private:staticconstchar*const*days={"mon","tue","wed","thur","fri","sat","sun"};};编译时出现错误“标量初始化程序中的多余元素”。我试着让它类型为constchar**,以为我搞砸了第二个const位置,但我得到了同样的错误。我做错了什么? 最佳答案 首先,你需要一个数组,而不是一个指针。staticconstchar*constdays[]={"mon",

c++ - 在 C++ 中初始化 const 字符串的静态 const 数组

我在初始化常量字符串的常量数组时遇到问题。来自week.h(仅显示相关部分):classWeek{private:staticconstchar*const*days={"mon","tue","wed","thur","fri","sat","sun"};};编译时出现错误“标量初始化程序中的多余元素”。我试着让它类型为constchar**,以为我搞砸了第二个const位置,但我得到了同样的错误。我做错了什么? 最佳答案 首先,你需要一个数组,而不是一个指针。staticconstchar*constdays[]={"mon",

c++ - 可以初始化但不能赋值的对象

我需要创建一个类,它的对象可以初始化但不能赋值。我想也许我可以通过不定义赋值运算符来做到这一点,但是编译器使用构造函数来进行赋值。我需要这样:Objecta=1;//OKa=1;//Error我该怎么做? 最佳答案 制作aconst就可以了constObjecta=1;//OK现在您将无法为a分配任何值,因为a被声明为const。注意,如果将a声明为const,则需要在声明时初始化a。一旦您将a声明为const并对其进行初始化,您将无法将任何其他值分配给aa=1;//error 关于c+

c++ - 可以初始化但不能赋值的对象

我需要创建一个类,它的对象可以初始化但不能赋值。我想也许我可以通过不定义赋值运算符来做到这一点,但是编译器使用构造函数来进行赋值。我需要这样:Objecta=1;//OKa=1;//Error我该怎么做? 最佳答案 制作aconst就可以了constObjecta=1;//OK现在您将无法为a分配任何值,因为a被声明为const。注意,如果将a声明为const,则需要在声明时初始化a。一旦您将a声明为const并对其进行初始化,您将无法将任何其他值分配给aa=1;//error 关于c+

c++ - 值初始化枚举的行为

首先,我想说,根据cppreference.com,对枚举进行值初始化有点不可能。根据http://en.cppreference.com/w/cpp/language/value_initialization,值初始化枚举实际上执行零初始化。然后,根据http://en.cppreference.com/w/cpp/language/zero_initialization,对枚举进行零初始化的效果是:IfTisascalartype,theobject'sinitialvalueistheintegralconstantzeroimplicitlyconvertedtoT.但是,整数