C++11中的统一初始化

/**
本代码执行平台:
硬件: 
CPU: i7-8750H
Gpu:GTX 1050ti
软件:
windows 10 + VS2015

参考:
C++ Primer Plus (第六版) 中文版
*/
#include <vector>
#include <initializer_list>
#include "opencv2/opencv.hpp"

class Stump
{
private:
    int roots;
    double weights;
public:
    Stump(int r, double w) :roots(r), weights(w) {}
};

static double SumByIntialList(std::initializer_list<double> il)
{
    double tot = 0.0;
    for (auto p = il.begin(); p != il.end(); p++)
    {
        tot += *p;
    }
    return tot;
}

/** @brief 统一的初始化

C++11扩大了用大括号括起的列表(初始化列表)的适用范围, 
使其可用于所有内置类型和用户定义的类型(即类对象). 
使用初始化列表时,可添加等号(=),也可不添加.

创建对象时, 也可使用大括号(而不是圆括号)括起的列表来调用构造函数

*/
void test_uniform_initialize()
{
    int x = { 5 };
    double y{ 2.75 };
    short quar[5] = { 4,5,2,76,1 };

    int * arr = new int[4]{ 2,4,6,7 };
    delete[] arr;

    Stump s1(3, 15.6);      // old Style
    Stump s2{ 5, 41.3 };    // C++11
    Stump s3 = { 4,32.1 };  // C++11

    /*
    初始化列表语法可防止缩窄, 即禁止将数值赋给无法存储它的数值变量.
    常规初始化运行程序执行可能没有意义的操作.
    如果使用初始化列表语法, 编译器将禁止进行这样的类型转换, 即数值存储到比它”窄“的变量中
    */
    char c1 = 1.57e27;
    char c2 = 459585821;
    //char c3{ 1.57e27 };           // 此操作会出现编译错误
    //char c4 = { 459585821 };      // 此操作会出现编译错误

    /**

    C++11提供了模板类initializer_list, 可将其用作构造函数的参数
    */
    std::vector<int> a1(10);    // uninitializer vector with 10 elements
    std::vector<int> a2{ 10 };  // initializer-list, a2 has 1 element set to 10
    double total = SumByIntialList({ 2.5,3.1,4 });
    //cv::waitKey(1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值