下面是一段代码片段,可以在vs2015中编译运行而不会出错#includeusingnamespacestd;classA{public:A(intb):k(b){}//secondtimeconstintk=666;//firsttime};intmain(){Aa(555);cout输出为555。但据我所知,const对象应该只初始化一次,之后该值是不可修改的。 最佳答案 它没有被初始化两次;defaultmemberinitializer只是被忽略了。所以对于Aa(555);,a.k被初始化为555。Ifamemberhasa
与Whyiscopyconstructorcalledinsteadofconversionconstructor?有点相关初始化有两种语法,直接初始化和复制初始化:Aa(b);Aa=b;我想知道他们有不同定义行为的动机。对于拷贝初始化,涉及到一个额外的拷贝,我想不出那个拷贝有什么用途。由于它是临时拷贝,因此可以并且可能会对其进行优化,因此用户不能依赖它的发生-因此,额外的拷贝本身不足以引起不同的行为。那么……为什么? 最佳答案 只是一种猜测,但如果没有BjarneStroustrup确认它的真实情况,恐怕很难更确定:之所以这样设计
与Whyiscopyconstructorcalledinsteadofconversionconstructor?有点相关初始化有两种语法,直接初始化和复制初始化:Aa(b);Aa=b;我想知道他们有不同定义行为的动机。对于拷贝初始化,涉及到一个额外的拷贝,我想不出那个拷贝有什么用途。由于它是临时拷贝,因此可以并且可能会对其进行优化,因此用户不能依赖它的发生-因此,额外的拷贝本身不足以引起不同的行为。那么……为什么? 最佳答案 只是一种猜测,但如果没有BjarneStroustrup确认它的真实情况,恐怕很难更确定:之所以这样设计
我很好奇为什么可以在构造函数中修改const成员。初始化中是否有任何标准规则可以覆盖成员的“常量”?structBar{constintb=5;//defaultmemberinitializationBar(intc):b(c){}};Bar*b=newBar(2);//Problem:Bar::bismodifiedto2//wasexpectingittobeanerror有什么想法吗? 最佳答案 这不是修改(或赋值),而是initialization.例如structBar{constintb=5;//initializat
我很好奇为什么可以在构造函数中修改const成员。初始化中是否有任何标准规则可以覆盖成员的“常量”?structBar{constintb=5;//defaultmemberinitializationBar(intc):b(c){}};Bar*b=newBar(2);//Problem:Bar::bismodifiedto2//wasexpectingittobeanerror有什么想法吗? 最佳答案 这不是修改(或赋值),而是initialization.例如structBar{constintb=5;//initializat
我正在寻找一种简单的方法来查找未初始化的类成员变量。在runtime或compiletime中找到它们都可以。目前我在类构造函数中有一个断点,并一一检查成员变量。 最佳答案 如果您使用GCC,您可以使用-Weffc++标志,当变量未在成员初始化列表中初始化时会生成警告。这个:classFoo{intv;Foo(){}};导致:$g++-c-Weffc++foo.cpp-ofoo.ofoo.cpp:Inconstructor‘Foo::Foo()’:foo.cpp:4:warning:‘Foo::v’shouldbeinitializ
我正在寻找一种简单的方法来查找未初始化的类成员变量。在runtime或compiletime中找到它们都可以。目前我在类构造函数中有一个断点,并一一检查成员变量。 最佳答案 如果您使用GCC,您可以使用-Weffc++标志,当变量未在成员初始化列表中初始化时会生成警告。这个:classFoo{intv;Foo(){}};导致:$g++-c-Weffc++foo.cpp-ofoo.ofoo.cpp:Inconstructor‘Foo::Foo()’:foo.cpp:4:warning:‘Foo::v’shouldbeinitializ
对于C++类中的静态成员变量-初始化在类外完成。我想知道为什么?对此有任何逻辑推理/限制吗?或者它是纯粹的遗留实现-标准不想更正?我认为在类中进行初始化更“直观”且不那么困惑。它还给人以变量的静态和全局性的感觉。例如,如果您看到静态const成员。 最佳答案 从根本上说,这是因为静态成员必须在一个翻译单元中定义,以免违反One-DefinitionRule.如果语言允许类似:structGizmo{staticstringname="Foo";};然后name将在#include的这个头文件的每个翻译单元中定义。C++确实允许您在声
对于C++类中的静态成员变量-初始化在类外完成。我想知道为什么?对此有任何逻辑推理/限制吗?或者它是纯粹的遗留实现-标准不想更正?我认为在类中进行初始化更“直观”且不那么困惑。它还给人以变量的静态和全局性的感觉。例如,如果您看到静态const成员。 最佳答案 从根本上说,这是因为静态成员必须在一个翻译单元中定义,以免违反One-DefinitionRule.如果语言允许类似:structGizmo{staticstringname="Foo";};然后name将在#include的这个头文件的每个翻译单元中定义。C++确实允许您在声
今天有人在SO上断言,你永远不应该在头文件中使用匿名命名空间。通常这是正确的,但我似乎记得曾经有人告诉我,其中一个标准库在头文件中使用匿名命名空间来执行某种初始化。我没记错吗?有人可以填写详细信息吗? 最佳答案 在header中使用无名命名空间的唯一情况是您只想将代码作为header文件分发。例如,Boost的一个大型独立子集纯粹是header。另一个答案中提到的元组标记ignore是一个例子,_1、_2等绑定(bind)占位符是其他的。 关于c++-用于头文件中的匿名命名空间,我们在S