编程语言
首页 > 编程语言> > C++11:初始化

C++11:初始化

作者:互联网

C++11:初始化

  1. C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++。在正式标准发布前,原名C++0x。它将取代C++标准第二版ISO/IEC 14882:2003 - Programming languages -- C++成为C++语言新标准。

  2. C++11是对目前C++语言的扩展和修正, C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL) ,并入了大部分的C++ Technical Report 1(TR1) 程序库(数学的特殊函数除外)。

  3. C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto、 decltype,和模板的大量改进。

类内成员初始化

class Mem
{
public:
    Mem(int i): m(i){} //初始化列表给m初始化
    int m;
};
class Group
{
public:
    Group(){}

private:
    int data = 1;       // 使用"="初始化非静态普通成员,也可以 int data{1};
    Mem mem{2}; // 对象成员,创建对象时,可以使用{}来调用构造函数
    string name{"mike"};
};

列表初始化

C++11引入了一个新的初始化方式,称为初始化列表(List Initialize),具体的初始化方式如下:

int a[]{1, 3, 5};
int i = {1};  
int j{3}; 

初始化列表可以用于初始化结构体类型,例如:

struct Person  
{  
  std::string name;  
  int age;  
};  

int main()  
{  
    Person p = {"Frank", 25};  
    std::cout << p.name << " : " << p.age << std::endl;  
} 

其他一些不方便初始化的地方使用,比如std的初始化,如果不使用这种方式,只能用构造函数来初始化,难以达到效果:

std::vector<int> ivec1(3, 5);  
std::vector<int> ivec2 = {5, 5, 5};  
std::vector<int> ivec3 = {1,2,3,4,5}; //不使用列表初始化用构造函数难以实现 

防止类型收窄

类型收窄指的是导致数据内容发生变化或者精度丢失的隐式类型转换。使用列表初始化可以防止类型收窄。

int main(void)
{
    const int x = 1024;
    const int y = 10;

    char a = x;                 // 收窄,但可以通过编译
    char* b = new char(1024);   // 收窄,但可以通过编译

    char c = { x };             // err, 收窄,无法通过编译
    char d = { y };             // 可以通过编译
    unsigned char e{ -1 };      // err,收窄,无法通过编译

    float f{ 7 };               // 可以通过编译
    int g{ 2.0f };              // err,收窄,无法通过编译
    float * h = new float{ 1e48 };  // err,收窄,无法通过编译
    float i = 1.2l;                 // 可以通过编译

    return 0;
}

MinGw下g++的编译结果:

img

标签:11,初始化,收窄,int,C++,编译
来源: https://www.cnblogs.com/jemmyzhong/p/14246750.html