我有一个程序,我想在其中使用指针初始化一个类对象数组。classxyz{};cin>>M;xyz*a=newxyz[M];//thiswillcalltheconstructorforeachobject.问题是我在xyz类中有两个构造函数。我想使用其他构造函数初始化最后两个元素,而不是没有参数的默认构造函数。我该怎么做?我希望第M+1和第M+2项由接受参数的不同构造函数初始化。 最佳答案 std::vectora(M-2);a.push_back(xyz(...));//xyz(...)hereisacalltothea.push
以下代码在GCC、Clang和VisualStudio中失败:#include#includeintmain(){std::strings="hello";//ok,copy-initializationstd::stringstreamss1(s);//ok,direct-initializationstd::stringstreamss2=s;//error}我认为直接初始化有效而复制初始化无效的唯一情况是构造函数是显式的,在这种情况下不是这样。怎么回事? 最佳答案 该构造函数是标记为显式的,因此只能与直接初始化一起使用。§27
我不确定这个主题是否与我正在寻找的完全匹配,但基本上是这样的:我能做到:structsomething{intd;}somethingType;但为什么我不能这样做呢?templatestructsomethingelse{intd;}somethingelseType;如果可以做第二种,正确的做法是什么? 最佳答案 我认为你可以,在语法上,但它被额外的限制所禁止:[温度]/1Atemplatedefinesafamilyofclassesorfunctionsoranaliasforafamilyoftypes. templat
下面的代码是做什么的?我猜它实例化了一个MyObjects数组,但我不知道?new(p)[[MyObject]] 最佳答案 这段代码当然不是一个完整的语句。我可以想象[[MyObject]]部分是一个用户定义的属性,适用于表达式这部分后面的任何内容。例如,编译以下代码:#includeintmain(){void*p=operatornew(sizeof(int));new(p)[[MyObject]]int(17);}[[MyObject]]部分使用了一个用户定义的属性,这可能毫无意义,我实际上不知道如何使用它(我可能应该在某个时
我正在阅读Dotheparenthesesafterthetypenamemakeadifferencewithnew有MichaelBurr讨论uninitialized和indeterminate值。想知道它们之间的区别。我的理解是,uninitialized意味着,编译器将分配内存而不是尝试初始化对象。indeterminate->访问此对象可能会导致未定义的行为。如果我错了,请纠正我。还想知道default-initialization和value-initialization的区别。 最佳答案 我认为您的解释很接近,但完全
假设在一个类中,构造函数被重载。是否可以使用同一类的不同构造函数为单个对象初始化多个数据成员?例如:classdemo{intsize;doublek;public:demo(ints){size=s;}demo(doublep){k=size+p;}voidshow(){cout这可能吗? 最佳答案 不,一旦对象被构造,它就被构造了。让我们检查一下您的代码,看看它做了什么(假设没有优化,请注意许多现代编译器即使在调试或-O0模式下也会做一些copy-elision):演示(0);代码demo(0)调用demo(ints)构造函数。
从C++11开始,可以在类定义中初始化staticconst内置类型,如下所示:classA{public:staticconstunsignedintval=0;//allowed};但是,在VisualC++2013中使用数组执行此操作会给我一个错误,告诉我这是不允许的:classB{public:staticconstunsignedintval[][2]={{0,1}};//notallowed};错误消息只是“constunsignedint[][2]类型的成员不能有类内初始化程序。”相反,我被迫执行以下操作:classC{public:staticconstunsigned
我正尝试在main()函数中复制初始化我的CObj类:#include#includeclassCObj{public:CObj(std::stringconst&str):m_str(str){std::cout但是,即使std::string是从charconst*隐式构造的,CObjobj="hello"行也无法编译>。根据我在这里的理解,这应该有效。有什么理由不这样做吗?如果我这样做,它会起作用:CObjobj=std::string("hello"); 最佳答案 文字"Hello"的类型为constchar[6]:为了调用
考虑以下示例:templatestructfoo{constexprfoo():a(){}inta[N];};intmain(){foo{}).a[0]>f;}尝试编译时,clang推断出foo作为f的类型同时g++因内部编译器错误而崩溃。然而,是a-foo的成员|保证为零,还是这种未定义/未指定的行为? 最佳答案 成员初始化器a()值初始化foo::a(通过[class.base.init]/7,这导致[dcl.init]/11)。[dcl.init]/8指定数组的值初始化对数组的每个元素进行值初始化。对于ints(和其他基本类型
我正在寻找一个如何使用初始化列表的简单示例。这是我想要做的:我有以下类(class):classfoo{public:voidset_x(constintix);voidset_y(constintiy);voiddisplay();private:intx;inty;};我想通过以下方式创建此类的对象:foofooObj={1,2};我知道在C++11中使用vector是可能的。我该如何实现这种行为? 最佳答案 在这种情况下,一个简单的构造函数将起作用:foo(intx,inty):x(x),y(y){}如果该类是一个更简单的聚合