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};

// 注: vs2012 不支持统一初始化方式{}

类内成员初始化

#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),具体的初始化方式如下:

#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;
}
时间: 2024-11-14 01:13:48

C++11 初始化的相关文章

C++11 初始化列表(initializer_list)

C++11对原有的初始化列表(用花括号围住的若干个值)进行了大幅的扩展.以下写法在C++11中都是被允许的: 1 int static_arr[5] = {1, 2, 3, 4}; // static_arr[4] is not initialized here 2 int static_arr2[] {1, 2, 3, 4}; // operator = can be omitted 3 4 int* dynamic_arr = new int[5] {1, 2, 3, 4}; 5 // dy

c++11之初始化列表

一.前言 C++的学习中,我想每个人都被变量定义和申明折磨过,比如我在大学笔试过的几家公司,都考察了const和变量,类型的不同排列组合,让你区别有啥不同.反正在学习C++过程中已经被折磨惯了,今天再来看看重温下那段"辉煌的历史".先来看一段代码: Player pa; // (a) Player pb(); // (b) Player pc = Player(); // (c) Player pd(Player()); // (d) pd = Player() // (e) a,b,

C++ 11 之初始化

1.4中不同初始化的形式 a.string s("zhl").int i(3);    //括号初始化 b.string s="zhl".int i= 3;      //等号初始化 c.int arr[4] = {1,2,3,4}.struct tm today ={0};    //POD数据用大括号 d.struct s { int x; s(): x(0){}};  //构造函数成员初始化: 2.C++03 中不能初始化 POD 数组的类成员,也不能在使用

RequestMappingHandlerMapping初始化源码解读

RequestMappingHandlerMapping ,用于注解@Controller,@RequestMapping来定义controller. 1 @Controller 2 @RequestMapping(value = "books") 3 public class BookController { 4 5 @RequestMapping(value = "/{id}") 6 @ResponseBody 7 public String getBook(@

[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十章 对象初始化

10.1 分配对象 向某个类发送alloc消息,能为类分配一块足够大的内存用来存放该类的全部实例变量,同时alloc还将这块内存区域全部初始化为0. 刚分配的对象并不能立即使用,需要先初始化. 初始化:从操作系统取得一块内存存储对象. init方法返回其正在初始化的对象 10.11 初始化对象 注意:初始化方法返回的对象跟分配的对象可能不同.例:字符串初始化函数可能会决定创建一个不同类的对象. 10.12 编写初始化方法 //让超类完成其自身的初始化工作 self = [super init]

linux内存源码分析 - 页表的初始化

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 本文章中系统我们假设为x86下的32位系统,暂且不分析64位系统的页表结构. linux分页 linux下采用四级分页,一个线性地址会分为5个偏移量用于寻址,具体看图: 虽然有四级,但并不是每一级都会用到,在linux中,对于硬件体系的不同可能会用到二级页表,三级页表,四级页表中的其中一个,如下: 64位系统:使用四级分页或三级分页,跟硬件有关. 未开启PAE(物理地址扩展)的32位系统:只使用二级分页,页上

03. Initializing Direct3D 11

全局变量 IDXGISwapChain* SwapChain; ID3D11Device* d3d11Device; ID3D11DeviceContext* d3d11DevCon; ID3D11RenderTargetView* renderTargetView; float red = 0.0f; float green = 0.0f; float blue = 0.0f; int colormodr = 1; int colormodg = 1; int colormodb = 1; 函

静态代码块、构造代码块、构造函数以及Java类初始化顺序

静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public HelloA(){//构造函数 } 关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的.2.构造函数的作用是用于给对象进行初始化.3.一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次. 构造代码块 {//构造代码块 }

windows下用C语言实现服务程序编写与安装

说是每学点知识就记录下,前段时间也没弄,还是自己懒惰了,今天逼着自己写写,当是在复习下,废话少说,进入正题. windows的服务程序 需要SERVICE_TABLE_ENTRY这个结构体(描述服务名和对应启动的函数eg:ServiceMain),然后StartServiceCtrlDispatcher来调用前面的结构体,在ServiceMain函数里要注册服务状态控制的方法,不然就不能控制服务的初始化.启动等,这个是基本的服务程序 主要代码如下(只有服务程序,下面会有解说安装.卸载等): 1