草庐IT

initialization

全部标签

c++ - 为什么使用 auto 的直接列表初始化被认为是不好的或不受欢迎的?

我已经养成了使用直接列表初始化编写代码的习惯,因为它更有效,而且对于防止隐式narrowing非常有用。:inti{0};strings{""};charc{'a'};boolb{false};autonum{100};//Butthis??但是当涉及到自动说明符时,我听说这样写被认为是不好的或不受欢迎的,这是为什么呢? 最佳答案 这是使用该语法失败的示例:structFoo{};voideatFoo(constFoo&f){}intmain(){Fooa;autob{a};eatFoo(b);}您可能希望这没问题:b应该是Foo并

c++ - 施工期间初始化?

我写了下面的代码:structA{inta;intb;A(intc):a(c),b(a){}};intmain(){Ab(10);}现在,我不确定是否将b和a初始化为a(c),b(a)。这样做可以还是会导致UB? 最佳答案 是的,这没关系。成员按照它们在类中声明的顺序进行初始化。请注意,初始化程序的顺序无关紧要,因此这也可行(但不是好的做法):structA{inta;intb;A(intc):b(a),a(c){}};但这行不通:structA{intb;inta;A(intc):a(c),b(a){}};如果初始化顺序与声明顺序

c++ - 自定义类/对象的构造函数和初始化

我可以想象这个问题已经被问过了,但我实际上找不到任何合适的解决方案,所以如果这是一个多余的问题,请原谅。我有一个自定义类classmyClass_A{public:myClass_A();//ConstructormyFunction_A();//SomefunctionfromClassA};现在我有另一个自定义类,它有一个类型为myClass_A的成员classmyClass_B{public:myFunction_B();//SomefunctionfromClassBprivate:myClass_Am_instance;//InstanceofClassA}现在myFunct

c++ - 局部作用域静态变量的零初始化和静态初始化

我从Google阅读了几篇关于C++初始化的文章,其中一些指导我在StackOverflow上。我从这些帖子中挑选的概念如下:C++初始化的顺序是:零初始化;静态初始化;动态初始化。静态对象(包括变量)首先被零初始化,然后是静态初始化。我有几个关于初始化问题的查询(存储类问题也可能相关):全局对象(定义时没有使用static关键字)也是静态对象,对吧?全局对象也像静态对象一样通过上面两步初始化,对吧?什么是静态初始化?它是指初始化静态对象(使用static关键字定义)吗?我还读到,当执行线程首次进入block时,使用static关键字在block内(即在函数中)定义的对象被初始化!这意

c++ - 我可以在类定义中放置 "non-static blocks"代码吗?

C++中有非静态block吗?如果不是,如何优雅地模拟?我想替换像这样的东西:-classC{public:voidini(){/*somecode*/}};classD{std::vectorregis;//willini();laterpublic:Cfield1;public:Cfield2;public:Cfield3;//wheneverIaddanewfield,Ihaveto...#1public:D(){regis.push_back(&field1);regis.push_back(&field2);regis.push_back(&field3);//#1...al

C++ vector 初始化

我一直在Code::Blocks和MingW编译器中使用以下带有值的vector初始化:vectorv0{1,2,3,4};之后,我不得不将代码移动到一个visualstudio项目(c++)并尝试构建。我收到以下错误:局部函数定义是非法的VisualStudio编译器不支持这种初始化?我需要如何更改代码以使其兼容?我想初始化vector并同时用值填充它,就像数组一样。 最佳答案 VisualC++尚不支持初始化列表。最接近这种语法的是使用一个数组来保存初始值设定项,然后使用范围构造函数:std::arrayv0_init={1,2

c++ - 为什么在函数体内定义的内置类型的未初始化对象具有未定义的值?

问题:为什么在函数体内定义的内置类型的未初始化对象有未定义的值,而定义的内置类型的对象外部都被初始化为0或''?举个例子:#includeusingstd::cout;usingstd::endl;intia[10];/*iahasglobalscope*/intmain(){intia2[10];/*ia2hasblockscope*/for(constauto&i:ia)cout 最佳答案 因为C++的一般规则之一是您不必为不使用的东西付费。初始化全局对象相对便宜,因为它只在程序启动时发生一次。初始化局部变量会增加每个函数调用的

c++ - 为什么我不应该在 header 中初始化静态变量?

这个问题在这里已经有了答案:HowtoinitializeprivatestaticmembersinC++?(18个答案)关闭8年前。那么,假设我有一个这样的标题:#ifndefBASECLASS_H#defineBASECLASS_HclassBaseClass{public:staticintgetX(){returnx;}private:staticintx;};intBaseClass::x=10;#endif我多次听说我不应该在header中初始化静态变量,而应该在cpp中初始化。但是因为有guard,所以应该只有一份BaseClass::x。所以我有点不明白为什么要放in

c++ - 构造函数初始化列表中的约束检查

这种情况与Howtomakeaconstraintontheparametersoftheconstructor有关,但略有不同。您想初始化一个不可默认构造的成员,但需要在构造它之前检查约束。示例:(请注意,这实际上只是一个示例。在这种特定情况下是否应该使用无符号整数是可以讨论的,但问题实际上是关于您想要checkin构造函数的一般情况)你有以下类(class):classBuffer{public:Buffer()=delete;Buffer(intsize)noexcept;};....classRenderTarget{public:....private:intwidth_,h

c++ - 多维 vector 初始化

我关注std::vector声明:std::vector>>m_input;我正在初始化它如下:m_input.resize(100);m_output.resize(100);for(inti=0;i如何通过成员初始化列表实现这一点? 最佳答案 std::vector有一个带有两个参数的构造函数,一些元素和一个初始值。在你的例子中,你想要初始化m_input100份std::vector>,所以它会是:m_input(100,X).现在,那个X依次是100的vectorstd::vector,它又包含一百个整数::m_input(