C++11新特性:统一初始化列表,C++98中花括号可用于结构体或数组初始化!struct Point { int _x; int _y; };int main() { int array1[]={1, 2, 3, 4, 5}; int array2[5]={0}; Point p={1, 2}; return 0;}
C++11新特特性
统一初始化列表
这是C++98中花括号可以给结构体或者数组进行初始化!
struct Point
{
int _x;
int _y;
};
int main()
{
int array1[] = { 1, 2, 3, 4, 5 };
int array2[5] = { 0 };
Point p = { 1, 2 };
return 0;
}
struct Point
{
int _x;
int _y;
};
int main()
{
int array1[] = { 1, 2, 3, 4, 5 };
int array2[]{ 1, 2, 3, 4, 5 };//C++11可以省略等号
Point p1 = { 1, 2 };
Point p2{1,2};//C++11可以省略等号
int x1 = 1;
int x2 = {1};//变量也可以用花括号初始化
int x3 {1};//也可以省略等号
//前面的建议不要用花括号初始化变量,还是使用传统的初始化这样可读性更好
//但是其实这种初始化方式更主要是为了支持下面的
int* p = new int[10]{1,2,3,4,5,5};
//C++11之前new出来的数组都是未初始化的,C++11之后可以用花括号初始化
Point* pp = new Point[2]{{1,2},{3,4}};
//我们甚至可以使用这样子来进行初始化!
//这不是一个二维数组!这是一个一维数组
//里面的的花括号是为了初始化数组里面的Point类型的对象
//因为我们上面也演示过了,Point类型的对象可以用花括号初始化
return 0;
}
class Date
{
public:
Date(int year, int month, int day)
:_year(year)
,_month(month)
,_day(day)
{
cout << "Date(int year, int month, int day)" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d{1,1,1};//这里的花括号严格来说是调用了date的构造函数来进行初始化的!
Date* ds = new Date[2]{{1,1,1},{2,2,2}};//这里调用量两次构造函数!
return 0;
}
std::initializer_list
class Date
{
public:
Date(int year, int month, int day)
:_year(year)
,_month(month)
,_day(day)
{
cout << "Date(int year, int month, int day)" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1{1,1,1};//这样子写是没有问题的!
//因为本质是调用了构造函数的参数列
//但是如果下面这样写就会出现问题!
//Date d2{1,1,1,1};
//但是为什么vector,list就可以一直往里面插入元素呢?
//vector,list其实本质也是一个自定义类型!
vector<int> v ={1,1,1,1,1};
list<int> ls ={1,2,3,4,55};
//这是怎么做到的?
}
int main()
{
//所以我们要区分虽然都是使用花括号!但是调用的却是不一样的!
Date d1{1,1,1};//这是调用构造函数!
vector<int> v ={1,1,1,1,1};
list<int> ls ={1,2,3,4,55};
//这两个是调用initializer_list
}
//如果实现了拷贝构造!
class A
{
public:
A* func()
{
return new A(*this);
}
//就可以怎么玩来完成拷贝!
A()
{
}
~A()
{
delete[] p;
}
private:
A(const A& a)
{
//.....
}//实现而不是声明
int* p = new int[10];
};
int main()
{
A a;
A* b = a.func();
return 0;
}
==如果是声明==
class A
{
public:
A* func()
{
return new A(*this);
}
A()
{
}
~A()
{
delete[] p;
}
private:
A(const A& a);
private:
int* p = new int[10];
};
正常的拷贝
调用函数进行拷贝
我们发现这样子都不可以!——==就可以防止拷贝了!==
==我们可以发现C++98的方式很绕!==
==但是C++11的方式就十分的直接!——使用delete!==
class A
{
public:
A* func()
{
return new A(*this);
}
A()
{}
A (A& a) = delete;//直接这样子就可以!
~A()
{
delete[] p;
}
private:
int* p = new int[10];
};
int main()
{
A a;
A* b = a.func();
return 0;
}
C++11新特性:统一初始化列表,C++98中花括号可用于结构体或数组初始化!struct Point { int _x; int _y; };int main() { int array1[]={1, 2, 3, 4, 5}; int array2[5]={0}; Point p={1, 2}; return 0;}
C++11新特特性
统一初始化列表
这是C++98中花括号可以给结构体或者数组进行初始化!
struct Point
{
int _x;
int _y;
};
int main()
{
int array1[] = { 1, 2, 3, 4, 5 };
int array2[5] = { 0 };
Point p = { 1, 2 };
return 0;
}
struct Point
{
int _x;
int _y;
};
int main()
{
int array1[] = { 1, 2, 3, 4, 5 };
int array2[]{ 1, 2, 3, 4, 5 };//C++11可以省略等号
Point p1 = { 1, 2 };
Point p2{1,2};//C++11可以省略等号
int x1 = 1;
int x2 = {1};//变量也可以用花括号初始化
int x3 {1};//也可以省略等号
//前面的建议不要用花括号初始化变量,还是使用传统的初始化这样可读性更好
//但是其实这种初始化方式更主要是为了支持下面的
int* p = new int[10]{1,2,3,4,5,5};
//C++11之前new出来的数组都是未初始化的,C++11之后可以用花括号初始化
Point* pp = new Point[2]{{1,2},{3,4}};
//我们甚至可以使用这样子来进行初始化!
//这不是一个二维数组!这是一个一维数组
//里面的的花括号是为了初始化数组里面的Point类型的对象
//因为我们上面也演示过了,Point类型的对象可以用花括号初始化
return 0;
}
class Date
{
public:
Date(int year, int month, int day)
:_year(year)
,_month(month)
,_day(day)
{
cout << "Date(int year, int month, int day)" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d{1,1,1};//这里的花括号严格来说是调用了date的构造函数来进行初始化的!
Date* ds = new Date[2]{{1,1,1},{2,2,2}};//这里调用量两次构造函数!
return 0;
}
std::initializer_list
class Date
{
public:
Date(int year, int month, int day)
:_year(year)
,_month(month)
,_day(day)
{
cout << "Date(int year, int month, int day)" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1{1,1,1};//这样子写是没有问题的!
//因为本质是调用了构造函数的参数列
//但是如果下面这样写就会出现问题!
//Date d2{1,1,1,1};
//但是为什么vector,list就可以一直往里面插入元素呢?
//vector,list其实本质也是一个自定义类型!
vector<int> v ={1,1,1,1,1};
list<int> ls ={1,2,3,4,55};
//这是怎么做到的?
}
int main()
{
//所以我们要区分虽然都是使用花括号!但是调用的却是不一样的!
Date d1{1,1,1};//这是调用构造函数!
vector<int> v ={1,1,1,1,1};
list<int> ls ={1,2,3,4,55};
//这两个是调用initializer_list
}
//如果实现了拷贝构造!
class A
{
public:
A* func()
{
return new A(*this);
}
//就可以怎么玩来完成拷贝!
A()
{
}
~A()
{
delete[] p;
}
private:
A(const A& a)
{
//.....
}//实现而不是声明
int* p = new int[10];
};
int main()
{
A a;
A* b = a.func();
return 0;
}
==如果是声明==
class A
{
public:
A* func()
{
return new A(*this);
}
A()
{
}
~A()
{
delete[] p;
}
private:
A(const A& a);
private:
int* p = new int[10];
};
正常的拷贝
调用函数进行拷贝
我们发现这样子都不可以!——==就可以防止拷贝了!==
==我们可以发现C++98的方式很绕!==
==但是C++11的方式就十分的直接!——使用delete!==
class A
{
public:
A* func()
{
return new A(*this);
}
A()
{}
A (A& a) = delete;//直接这样子就可以!
~A()
{
delete[] p;
}
private:
int* p = new int[10];
};
int main()
{
A a;
A* b = a.func();
return 0;
}