我正在学习C,对于不同类型的初始化,我感到很困惑.
你可以做:
- T a;
据我所知,这有时会初始化一次,有时也不会,这取决于T是否有一个默认构造函数.
你也可以做:
- T a(); // or
- T a(1,2,3... args);
; (在某些情况下):
- T a = 1; // implicitly converted to T sometimes?
;如果没有构造函数:
- T a = {1,3,4,5,6};
;并且:
- T a = T(1,3);
.
如果你想在堆上分配,那就是
- T a = new T(1,3);
还有别的事吗?
我想知道是否a)我已经有所有类型的初始化覆盖和b)何时使用每种类型?
解决方法
你犯了一些错误.我会清理它们
- // Bog-standard declaration.
- // Initialisation rules are a bit complex.
- T a;
- // WRONG - this declares a function.
- T a();
- // Bog-standard declaration,with constructor arguments.
- // (*)
- T a(1,3... args);
- // Bog-standard declaration,with *one* constructor argument
- // (and only if there's a matching,_non-explicit_ constructor).
- // (**)
- T a = 1;
- // Uses aggregate initialisation,inherited from C.
- // Not always possible; depends on layout of T.
- T a = {1,6};
- // Invoking C++0x initializer-list constructor.
- T a{1,6};
- // This is actually two things.
- // First you create a [nameless] rvalue with three
- // constructor arguments (*),then you copy-construct
- // a [named] T from it (**).
- T a = T(1,3);
- // Heap allocation,the result of which gets stored
- // in a pointer.
- T* a = new T(1,3);
- // Heap allocation without constructor arguments.
- T* a = new T;