在C++11下,可以在声明时直接初始化类成员。但是在构造函数的初始化列表中再次初始化它们也是可以的……为什么?#includestructMyStr{MyStr():j(0){std::cout因为这样做是错误的,可以理解:MyStr():j(0),j(1){}第一个示例有何不同,其中数据成员在声明时被初始化,然后在构造函数的初始化列表中再次初始化? 最佳答案 实际上只有一个初始化发生。只是允许您以brace-or-equalsinitializer的形式编写一个“默认”初始化器,但是如果您的构造函数初始化器列表也指定了一个初始化器
我正在尝试做类似的事情:#include#include#includeclassClickomania{public:Clickomania();std::vector>board;};Clickomania::Clickomania():board(12,std::vector(8,0))但是,显然我不能用这种方式初始化vector的“板”vector。如何创建二维vector类型的公共(public)成员并正确初始化它? 最佳答案 您应该使用允许您为两个vector指定大小和初始值的构造函数,这可能会使它更容易一点。类似于:v
这是一个特定于C++11的问题。假设我有一个vectorstd::vectorv已经使用过,我想将其调整为n使用现有值初始化的元素Tval.(典型用例:vector是被回收实例的成员)。以下几种方式各有什么优缺点,哪种方式效率最高?1)是std::vector::resize(n,val)足以进行初始化吗?v.clear();v.resize(n,val);2)如果不是,那么我假设以下是正确的?v.clear();v.resize(n);std::fill(v.begin(),v.end(),val);3)交换怎么样?v.swap(std::vector(n,val));
在C++中,当使用initializer_list语法初始化对象时,当没有其他列表初始化规则适用时,对象的常规构造函数也参与重载决策。据我了解,以下代码调用X::X(int)classX{inta_;X(inta):a_(a){});voidfoo(){Xbar{3};}但我不明白,为什么在initializer_lists的上下文中也考虑了常规构造函数。我感觉现在很多程序员都写X{3}来调用构造函数而不是X(3)来调用构造函数。我一点也不喜欢这种风格,因为它让我觉得对象没有常规构造函数。initializer_list语法也可以用来调用常规构造函数的原因是什么?现在有理由比常规的构造
在C#中我可以这样做:char[]a=newchar[]{'a','a','a'};但是我可以用C++做类似的事情吗?我试过:char*a=newchar[]{'a','a','a'};但它无法编译。 最佳答案 这是C++规范中的错误(不允许编译这个简单的构造)。您需要提供尺寸char*a=newchar[3]{'a','a','a'};参见http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1469.请注意,如果您将类型名称括在括号中,它是一个type-id而不是
假设我想要一个无符号字符的std::vector。它是用初始化列表(这是C++11)初始化的,永远不会改变。我想避免任何堆分配,即使在启动时也是如此,并让整个vector像const字符串一样存在于数据段中。那可能吗?IE:staticconstvectorv{0x1,0x2,0x3,0x0,0x5};(这是一个有点学术性的问题;我知道为此使用C数组并不难。) 最佳答案 为什么不直接使用std::array为此?staticconststd::arrayv{0x1,0x2,0x3,0x0,0x5};这避免了任何动态分配,因为std:
我在C++中有以下结构:structrouting_entry{unsignedlongdestSeq;//32bitsunsignedlongnextHop//32bitsunsignedcharhopCount;//8bits};我有以下功能:routing_entryCnode_router_aodv::consultTable(unsignedintdestinationID){routing_entryroute;if(routing_table.find(destinationID)!=routing_table.end())route=routing_table[dest
我看到的每个地方都有人大声争论未初始化的变量是不好的,我当然同意并理解为什么——但是;我的问题是,是否存在您不想这样做的情况?例如取代码:chararrBuffer[1024]={'\0'};将整个数组设为NULL是否会对性能产生影响,而不是使用数组而不初始化它? 最佳答案 我假定堆栈初始化,因为静态数组是自动初始化的。G++输出charwhatever[2567]={'\0'};8048530:8d95f5f5fffflea-0xa0b(%ebp),%edx8048536:b8070a0000mov$0xa07,%eax80485
我有三个代码片段。这个:1,7;//yes,that'sallthecode编译正常。这个:doubled=(1,7);也可以编译。然而这个:doubled=1,7;编译失败。gcc-4.3.4说error:expectedunqualified-idbeforenumericconstant和VisualC++10说errorC2059:syntaxerror:'constant'为什么会有这样的差异?为什么不是所有三个都使用编译,在所有三个中具有相同的效果? 最佳答案 在前两种情况下,语句使用C++的commaoperator在
我正在尝试使用lambda表达式初始化一个变量。我还没有听说这是否可能,所以这可能吗?例如:inti([](){return1;});返回errorC2440:'initializing':cannotconvertfrom'wmain::'to'int'这个操作是否可行,只是我的语法错误? 最佳答案 您正在尝试使用lambda对象而不是评估lambda的结果来初始化变量:inti([](){return1;}());//^^ 关于c++-通过lambda表达式初始化变量?,我们在Sta