一、列表初始化
1)c++11以前,定義初始化的幾種不同形式,如下:
int data = 0; //賦值初始化
int data = ; //花括號初始化
int data(0); //構造初始化
2)c++11以舊語法中花括號初始化形式為基礎,設計了列表初始化語法,統一了不同的初始化形式
a)資料型別 變數
//聚合型別
struct persion
char name[64];
struct date//成員是聚合型別
int year;
int month;
int day;
}age;
class student
public:
student(int year,int month,int day) : _year(year),_month(month),_day(day) {}
friend std::ostream& operator << (std::ostream &os, student const & s)
os << s._year << "-" << s._month << "-" << s._day;
private:
int _year;
int _month;
int _day;
int main()
int a;
std::cout << a << std::endl;
double b;
std::cout << b << std::endl;
//聚合型別(任意型別的陣列)
int c;
copy(c,c + sizeof(c) / sizeof(c[0]),ostream_iterator(cout, " "));
std::cout << std::endl;
persion persion;
std::cout << persion.name << persion.year << persion.day << std::endl;
student student;
std::cout << student << std::endl;
聚合型別
1)任意型別的陣列
2)滿足特定條件的類:
a、無自定義的建構函式
b、無私有或保護的非靜態成員變數
c、無基類
d、無虛函式
e、無通過「=」或者「{}」豐類宣告部分被初始化的非靜態成員變數
3)聚合型別的元素或者成員可以是聚合型別也可以是非聚合型別
4)對聚合型別使用列表初始化,相當於用列表初始化的值作為引數,呼叫相應的建構函式。
b)變長初始化列表:initializer_list
class num
public:
num(std::initializer_list list)
for(auto i : list)
_vector.push_back(i);
friend std::ostream& operator << (std::ostream &os, num n)
//copy(n._vector.begin(),n._vector.end(),ostream_iterator(os," ");
for(auto i : n_vector)
os << i << " " ;
return os;
private:
std::vector_vector;
int main()
num num;
std::cout << num << std::endl;
initializer_list作為輕量級的列表容器,不但可以用在建構函式中,也可以作為普通函式的引數,傳遞不定數量的實參,
相對於傳統標準容器,效率更高(輕量級列表容器,僅儲存初始化列表元素的引用,而非其副本)
C 11之列表初始化
c 98使用 對陣列初始化 int arr int arr 4 但對於自定義型別會報錯 vectorv 內建型別 int x1 int x2 int x3 1 2 int x4 int x5 陣列 int arr1 5 int arr2 動態陣列 c 98不支援 int arr3 new int 5...
C 11 就地初始化與列表初始化
在 c 11 之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。class c class c or int b c 11 only int c 7 error 注意,小括號初始化方式不能用於就地初始化。c 11 支援了就地初始化非靜態資料成員的同時,初始化列表的方式也被保留下來,也就...
c 11 就地初始化與列表初始化
還可以看看 在c 11之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。class c class c 或int b c 11 only int c 7 error 1.2就地初始化與初始化列表的先後順序 c 11標準支援了就地初始化非靜態資料成員的同時,初始化列表的方式也被保留下來,...