/**
本代码执行平台:
硬件:
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);
}
C++11中的统一初始化
最新推荐文章于 2024-08-08 11:03:37 发布