在C++11下,可以在声明时直接初始化类成员。但是在构造函数的初始化列表中再次初始化它们也是可以的……为什么?#includestructMyStr{MyStr():j(0){std::cout因为这样做是错误的,可以理解:MyStr():j(0),j(1){}第一个示例有何不同,其中数据成员在声明时被初始化,然后在构造函数的初始化列表中再次初始化? 最佳答案 实际上只有一个初始化发生。只是允许您以brace-or-equalsinitializer的形式编写一个“默认”初始化器,但是如果您的构造函数初始化器列表也指定了一个初始化器
这是一个特定于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#中我可以这样做: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而不是
如何在C++类中初始化一对字符串的vector?我尝试了几件事,但都没有成功。vector>myVec();//doesn'twork 最佳答案 没有必要以这种方式初始化vectorvector>myVec();这是一个名称为myVec的函数声明没有参数,返回类型为vector>简单写就够了vector>myVec;因为无论如何您都在创建一个空vector。或者,如果您希望vector具有一些初始值并且您的编译器支持C++2011,那么您也可以编写示例std::vector>myVec={{"first","first"},{"se
作为函数参数,我得到一个vector&vec(一个输出vector,因此是非常量)具有未知的长度和值。我想将此vector初始化为全为零的特定长度n。这会起作用vec.clear();vec.resize(n,0.0);这也行得通:vec.resize(n);vec.assign(n,0.0);第二种效率更高吗(因为不涉及内存释放/分配)?有没有更有效的方法来做到这一点? 最佳答案 std::vector(n).swap(vec);在此之后,保证vec的大小和容量为n,所有值为0.0。也许自C++11以来更惯用的方式是vec.ass
我有一个指向double组第一个元素的指针:double*p。我也知道数组的长度:n。有没有办法将其复制到std::vector中?最好使用构造函数和分配器。我想做类似的事情std::vectorv=std::vector(p,n);但无法确定哪个构造函数最接近此。我正在使用C++11。 最佳答案 std::vector有一个采用范围的构造函数。你可以像这样使用它:std::vectorv(p,p+n); 关于c++-从已知大小的double组构造std::vector,我们在Stack
我在之前的一个问题中提到,我正在阅读HerbSutter和AndreiAlexandrescu合着的《C++编码标准》一书。在其中一章中,他们是这样说的:Alwaysperformunmanagedresourceacquisition,suchasanewexpressionwhoseresultisnotimmediatelypassedtoasmartpointerconstructor,intheconstructorbodyandnotininitializerlists.这是否意味着我应该使用这种形式的构造(前提是data_3_必须用new初始化):SomeClass(co
这是一个代码片段来说明我的问题:constfloatD=0.1F;constfloatA[4]={sin(0*D),sin(1*D),sin(2*D),sin(3*D)};假设全局数组A更长,并且您不希望进行所有这些重复输入。是否有更短的方法在编译或初始化时初始化数组A,即无需编写初始化函数并在我的程序中的某处调用它? 最佳答案 您可以在动态初始化期间初始化A,如下所示:constfloat*init_a(floatx_){staticfloatdata[4];for(unsignedi=0;i
在C++中,我有一个包含匿名位域结构的类。我想将它初始化为零,而不必手动写出所有字段。我可以想象将初始化放在三个地方:在位域中创建一个构造函数在包含类的构造函数的初始化列表中清零在包含类的构造函数体中清零这个位域有很多字段,我不想一一列举。例如看下面的代码:classBig{public:Big();//Bitfieldstructstructbflag_struct{unsignedintfield1:1;unsignedintfield2:2;unsignedintfield3:1;//...unsignedintfield20:1;//bflag_struct();其中一个更可取
虽然我会写intn[]{1,2,3};我不会写int*m=newint[]{1,2,3};应该是int*m=newint[3]{1,2,3};这是什么原因? 最佳答案 请记住,new实际上是C++中的运算符。这是因为new操作符是如何定义的;也就是说,它需要明确地将请求的内存大小作为输入参数。因此,它不会由初始化列表成员的数量推导出来。 关于c++-为什么初始化列表初始化需要堆分配数组的大小?,我们在StackOverflow上找到一个类似的问题: https