C++11(1)

文章目录

统一的列表初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

struct Point
{
int _x;
int _y;
/*explicit*/ Point(int x,int y)
:_x(x),_y(y){cout<<"1"<<endl;}
};


class A
{
private:
int _a;
public:
explicit A(int a)
:_a(a){}

};


//单参数类型支持隐式类型转换
void test2()
{
A aa(2);//单参数的类型,可以使用正常的方式
//A b=2;//也可以使用这种隐式类型的转换
//2拷贝构造一个A,在进行拷贝构造成b
//加一个explicit,就不能这样了
string s1="hjs";//string的构造函数没有加explicit
vector<string> v;
v.push_back("hjk");//这也是隐式类型转换

}



void test1()
{

//以前
Point p={1,2};//c语言是使用这种方式来初始化
int brr[5]={1,2,3,4,5};//使用这种大括号进行初始化


//现在s
int a=1;
int b={2};//现在还可以这样进行初始化,=也省略了
int c{3};
int arr[5]{1,2,3,4};
Point k{1,2};
int * ptr=new int[5]{1,2,3};//初始化了前3个值,后面的值全都是0
Point* ptrd=new Point[2]{{1,1},{2,2}};//现在还可以这样进行初始化,里面必须要又两个{}
//new要去调用他的构造函数



//正常调用point
Point p1(1,2);//调用构造函数

//c++11支持的多参数的构造函数
Point p2={1,2};
Point p3{1,2};



}

initializer_list

1
2

auto il={1,2,3};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void test3()

{
//都是因为支持initializer_list的构造函数

//以前的vector初始化
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);

vector<int> v2={1,2,3,4};//现在vector也可以这样初始化, 掉的就是initializer list进行初始化

initializer_list<int> lt={1,2,3};//
list<int> l={1,2,3};//链表也可以这样初始化
map<string,string> dic={{"dasd","dsa"},{"dsada","fd"}};//map也可以
v2={10,20,30};//也可以用赋值,不是构造,在赋值运算符重载那里使用了initialzer_list

for(auto e:v2)
{
cout<<e<<" ";
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
List(initializer_list<T> ilt) //使用initializer_list进行初始化
{
_head = new Node; //无参构造
_head->_next = _head; //因为是双向链表
_head->_prev = _head;

typename initializer_list<T>::iterator it=ilt.begin();
while(it!=ilt.end())
{
PushBack(*it);
it++;
}
}

声明

auto

自动推导类型,范围for

decltype

推导对象的类型,可以作为模板参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

int func(int a)
{
return a;
}
void test4()
{
const int x=10;
cout<<typeid(x).name()<<endl;//获得x的类型名字
decltype(x) z=2;//获得x的类型名,来初始化另一个变量
double y=2.2;
decltype(x*y) ret;//ret类型为double
decltype(&x) p;//p类型为int*

int(*func)(int)=func;//函数指针
auto pfunc=func;//直接用auto也可以
decltype(pfunc) pfun3=func;//定义一个变量
map<string,string> dict={{"sort","排序"},{"insert","插入"}};
auto it=dict.begin();
auto cpit=it;
//但是不能把auto作为模板参数
vector<decltype(it)> v;//这样就很方便
v.push_back(it);

}

nullptr

避免了NULL 定义为0


C++11(1)
http://example.com/2022/06/04/C++11(1)/
作者
Zevin
发布于
2022年6月4日
许可协议