C++11 初始化

C++11 初始化

統一初始化語法
        C++11新添加初始化列表 std::initializer_list<>類型,能夠經過{}語法來構造初始化列表 。初始化列表是常數;一旦被建立,其成員均不能被改變,成員中的數據也不可以被變更。函數可以使用初始化列表做爲參數。
        在引入C++ 11以前,有各類不一樣的初始化語法。在C++ 11中,仍能夠使用這些初始化語法,但也能夠選擇使用新引入的統一的初始化語法。統一的初始化語法用一對大括號{}表示。
        std::vector<string> v1 = {"hello", "world", "welcome"};
        std::vector<int> v2 = {0, 3, 8, 1, 4}; ios

 

// 注: vs2012 不支持統一初始化方式{}函數

 

類內成員初始化spa

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <vector>
#include <map>

class Mem
{
public:
    Mem(int i, int j): m(i), n(j) // 初始化列表給m初始化, 能夠給const變量賦初值, 以及引用變量賦初值
    {
        // m = i; 錯誤,不能給const變量賦值
        // n = j; 錯誤,不能給引用變量賦值
    }
    int getM()
    {
        std::cout << "m: " << m << std::endl;
    }
    const int m;
    int &n;
};


void mytest()
{
    int data = 1; // 使用"="初始化非靜態普通成員,也能夠 int data{1};
    Mem Mem{2, data}; // 對象成員,建立對象時,能夠使用{}來調用構造函數 // 注: vs2012 不支持統一初始化方式{}
    std::string name("xyz"); // 使用()來調用構造函數

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}

 

 

列表初始化
C++11引入了一個新的初始化方式,稱爲初始化列表(List Initialize),具體的初始化方式以下:code

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <vector>
#include <map>

class Person
{
public:
    std::string name;
    int age;
};

void mytest()
{
    int a[] = {4,5,6};
    int b[]{1,3,5}; // 注: vs2012 不支持
    int i = {1};
    int j{3}; // 注: vs2012 不支持

    // 初始化列表能夠用於初始化結構體類型
    Person p1 = {"Frank", 25};

    std::vector<int> ivec1(3,4);
    // 其餘一些不方便初始化的地方使用,好比std<vector>的初始化,若是不使用這種方式,只能用構造函數來初始化,難以達到效果
    std::vector<int> ivec2 = {5,5,5}; // 注: vs2012 不支持
    std::vector<int> ivec3 = {1,2,3,4,5}; // 注: vs2012 不支持

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}

 

防止類型收窄
類型收窄指的是致使數據內容發生變化或者精度丟失的隱式類型轉換。使用列表初始化能夠防止類型收窄。對象

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <vector>
#include <map>


void mytest()
{
    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.21; // 能夠經過編譯

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}
相關文章
相關標籤/搜索