[C++11]统一的数据初始化方式 - 初始化列表
關于C++中的變量,數組,對象等都有不同的初始化方法,在這些繁瑣的初始化方法中沒有任何一種方式適用于所有的情況。為了統一初始化方式,并且讓初始化行為具有確定的效果,在C++11中提出了列表初始化的概念。
代碼如下:
#include<iostream> #include <string> using namespace std;class Person { public:Person (int a):age(a){}Person (int a,string b):age(a),name(b){}int getAge(){return age;}string getName(){return name;}private:int age;string name; };int main() {Person p{ 23 };cout << p.getAge() << endl;Person p1{ 24,"Tom" };cout << "name = " << p1.getName() << " age = " << p1.getAge() << endl;int a{ 23 };cout << a << endl;int b = { 24 };cout << b << endl;int array[] = { 1,2,3,4,5 };int *ptr = new int{ 250 };cout << *ptr << endl;int *array01 = new int[3]{ 1,2,3 };double c = double{ 23.12 };//看起來更加直觀cout << c << endl;return 0; }測試結果:
使用初始化列表初始化聚合類型的變量
聚合類型:
1.普通數組本身可以看做是一個聚合類型。
#include <iostream> #include <string> using namespace std;int main() {int x[] = { 1,2,3,4,5 };double y[3][3] = { {1.1,2.2,3.3},{4.4,5.5,6.6},{7.7,8.8,9.9} };char carry[] = { 'a','b','c','d' };string sarry[] = { "hello","world","shijie" };return 0; }滿足以下條件的類(class,struct,union)可以被看做是一個聚合類型:
1.無用戶自定義的構造函數
2.無私有或保護的非靜態數據成員
場景1:類中有私有成員,無法使用初始化列表初始化
代碼如下:
struct T1 {int x;long y; protected:int z; }t{1,100,2};//error,類中有私有成員,無法使用初始化列表初始化場景2:類中有靜態成員可以使用初始化列表,但初始化列表不能初始化靜態成員變量
代碼如下:
struct T2 {int x;long y; protected:static int z; }t{1,100,2};//error結構體中的靜態變量z不能使用初始化列表進行初始化,它的初始化遵循靜態成員的初始化方式。
代碼如下:
struct T2 {int x;long y; protected:static int z; }t{113,2312};int T2::z = 3;3.無基類
4.無虛函數
5.類中不能有使用{}和 = 直接初始化的非靜態數據成員(從C++14就開始支持了)
代碼如下:
#include <iostream> using namespace std;struct T3 { public:int a = 5;int array[3]{ 1,2,3 };int c; };int main() {T3 t{ 11,{2,3,4},12 };//從C++14開始支持了cout << t.a << " " << t.c << endl;for (int i = 0; i < 3; i++){cout << t.array[i] << " ";}cout << endl;return 0; }測試結果:
使用初始化列表初始化非聚合類型的對象
對于非聚合類,我們必須提供一個對應的構造函數,才能用初始化列表對其初始化。
代碼如下:
#include <iostream> #include <string> using namespace std;class Person { public:private:int age;string name; };int main() {Person p{ 18,"Tom" };//errorreturn 0; }測試結果:
代碼如下:
測試結果:
注意:
聚合類型的定義并非遞歸的,也就是說當一個類的非靜態成員是非聚合類型時,這個類也可能是聚合類型。
代碼如下:
#include <iostream> using namespace std;struct T1 {int x;double y; private:int z; };struct T2 {T1 t1;long x;double y; };int main() {T2 t2{ {},520,13.14 };return 0; }可以看到,T1并非一個聚合類型,因為它有一個private的非靜態成員,但是盡管T2有一個非聚合類型的非靜態成員t1,T2依然是一個聚合類型,可以直接使用初始化列表。
最后強調一下t2對象的初始化過程,對于非聚合類型的成員t1做初始化的時候,可以直接寫一對空的{},這相當于調用是T1的無參構造函數。
總結
以上是生活随笔為你收集整理的[C++11]统一的数据初始化方式 - 初始化列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 墨鱼的功效与作用、禁忌和食用方法
- 下一篇: 如何解决win10电脑死机画面定格