Vue框架:
从项目学Vue
OJ算法系列:
神机百炼 - 算法详解
Linux操作系统:
风后奇门 - linux
int a = 1; //c++98
int a = {1}; //c++11
int a{1}; //c++11
int *p = new int(5); //98
int *p = new int{5}; //11
//未规定数组长度:
int arr1[] = {1, 2, 3, 4, 5}; //98
int arr1{1, 2, 3, 4, 5}; //11
//规定数组长度,未初始化者均为0
int arr2[5] = {0};
int arr2[5]{0};
//指针初始化
int *p = new int[5]{1, 2, 3, 4}; //11
struct Point{
int x, y;
Point(int _x, int _y){
x = _x;
y = _y;
};
};
Point p1(1, 1);
Point p2 = {1, 1};
Point p3{1, 1};
struct Point{
int x, y;
Point(int _x, int _y){
x = _x;
y = _y;
};
};
Point *p = new Point[3]{{1,1}, {2,2}, {3,3}};
//注意,内部小括号不可以省略为{1, 1, 2, 2, 3, 3}
cpu对于整型的加法器是基于int的32位进行的,
任何大小小于int的类型变量在与int运算时,
会先发生整型提示,先提升到32位,再进入加法器运算
char a = 1;
short b = 2;
int c = 3;
cout<< (a+c) << (b+c) <<endl;
另一方面,当int等整型与精度更高的浮点型数运算时
整型会首先被转换为浮点型的x.000000
再携带小数位与浮点数float / double进行计算
int a = 5;
float b = 2; //1,赋值时临时变量int 2被提升为float型
cout<< (a/b)<< endl; //2,计算时a先被提升为float型,存储在临时变量中
char a = 190;
//signed char的范围为 -2^7 ~ 2^7-1
/*
整型截断过程:
190源码:0000 0000 0000 0000 0000 0000 1011 1110
190补码:0000 0000 0000 0000 0000 0000 1011 1110
截断后8位赋予变量a
a补码:1011 1110
a源码:1100 0010
a真实值:-66
*/
class A{
private:
int a;
public:
A(int _a){a = _a}
void operator=(A _a){
a = _a.a;
}
};
A a1(1); //直接构造
A a2 = 2; //先通过值2直接构造一个A对象,再通过a2的拷贝构造复制该对象值
A a3{2}; //先通过值2直接构造一个A对象,再通过a3的拷贝构造复制该对象值
string s("hello"); //直接构造
string s = "world"; //隐式:直接构造+拷贝构造
string s{"world"}; //隐式:直接构造+拷贝构造
vector<int> v1; //默认初始化
vector<int> v2(v1); //拷贝已有的vector
int a[] = {1, 2, 3, 4, 5};
vector<int> v3(a, a+sizeof(a)); //通过数组地址+数组元素个数实现初始化
vector<int> v4(7, 0); //通过明确元素个数+元素值实现初始化
vector<int> v5{1, 2, 3, 4, 5}; //类似数组int arr[] = {1,2,3,4,5}初始化
其实从98支持的后两种方式:数组地址+数组元素个数 / 明确元素个数+元素值,
就可以看出来,提供给vector<>元素个数,vector<>就能实现类似数组初始化的效果
c++11中的{}初始化其实也是通过编译器隐式构造了中间临时变量Initializer_list,
告知vector<>元素个数后,实现了类似数组初始化的功能
template<class _E>
class initializer_list
{
public:
typedef _E value_type;
typedef const _E& reference;
typedef const _E& const_reference;
typedef size_t size_type;
typedef const _E* iterator;
typedef const _E* const_iterator;
private:
iterator _M_array;
size_type _M_len;
// The compiler can call a private constructor.
constexpr initializer_list(const_iterator __a, size_type __l)
: _M_array(__a), _M_len(__l) { }
public:
constexpr initializer_list() noexcept
: _M_array(0), _M_len(0) { }
constexpr size_type size() const noexcept { return _M_len; }
constexpr const_iterator begin() const noexcept { return _M_array; }
constexpr const_iterator end() const noexcept { return begin() + size(); }
};
//vector:
vector<int> v{1, 2, 3, 4, 5};
//map:
map<string, string> m{{"1", "I"}, {"2", "II"}, {"4", "IV"}};
//pair + map:
pair<string, string> p = {"5", "v"};
m.insert({"6", "VI"}); //map的insert()和erase()
m.insert(makepair("10", "X"));
经过编译器隐式类型转化的举例,以及initializer_list的原理和使用过程,
下面我们自己实现一个基于initializer_list实现列表初始化的类
其实就是实现一下基于initializer_list的构造函数:
//迭代器版本:
template <class T>
list(initializer_list<T> ilt){
initializer_list<T>::iterator it = ilt.begin();
while(it != ilt.end()){
push_back(*it);
it++;
}
}
//范围for版本:
template <class T>
list(initializer_list<T> ilt){
for(auto i : ilt){
push_back(i);
}
}