C++的那些事:数据与类型(二)

2014-11-24 11:46:34 · 作者: · 浏览: 5
在处理顶层const和引用的方式与auto不同。
1 const int ci = 0, &cj = ci;
2 decltype(ci) x = 0; // x的类型是const int
3 decltype(cj) y = x; // y的类型是const int&, y绑定到变量x
4 decltype(cj) z; //error, z是一个引用,必须初始化
引用从来都是作为其所指对象的同义词出现,只有用在decltype处是个例外。
delctype((variable))(注意是双层括号)的结果永远是引用,而decltype(variable)结果只有当variable本身就是一个引用时才是引用。
13,标准库定义了2种非常重要的抽象类型,一种是string用来支持可变长的字符串;另一种是vector表示可变长的集合。
14,对于string和vector对象都可以有多种方式初始化,这取决于类的定义,但一般直接初始化和拷贝初始化都是存在的。如果使用等号“=”初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化。
1 string s1 = "hiya"; // 拷贝初始化
2 string s2("hiya"); // 直接初始化
3 string s3(10, 'c'); // 直接初始化
15,string类型和标准库容器类型都提供了一种size_type类型,它是一个无符号的值,而且足够存放下任何容器或string对象的大小。而在C++11中,我们可以用auto或decltype来让编译器自动推断出这种类型,而不用写很长的代码,比如:
1 vector>::size_type i; // 原来的方法
2 decltype(dvv.size()) i; // C++11用decltype
3 auto i = dvv.size(); // C++11用auto
16,C++11中另外为vector对象提供了一种列表初始化的方法,此时,用花括号括起来的0个或多个初始化元素值被赋予vector对象。但是值得注意的是:如果用的是花括号,可以表述成我们想列表初始化该vector对象。也是就是,初始化过程会尽可能地把花括号内的值当成是元素初始化的列表来处理,只有在无法执行列表初始化时才会考虑其他初始化方式。
1 vector v1{"hi"}; //v1有一个元素
2 vector v2("hi"); //error
3 vector v3{10}; //v3本来想用10来初始化vector,但是发现10不是strring对象,所以把v3初始化为10个元素。
4 vector v4{10,"hi"}; //v4本来想用10和“hi”初始化vector,但发现10不是string对象,所以就把v4定义为10个元素的vector
17,数组,与vector类似,数组也是存放类型相同的对象的容器,这些对象本身没有名字,需要通过其所在的位置访问。而且数组是在定义的时候就分配了大小,中间不能变化,这就给使用时带来很大的不便。
18,指针其实与迭代器具有相同的功能,在遍历数组的情况下,用指针操作就像在容器上使用迭代器一样。类似于容器类型的begin和end迭代器,C++11定义了两个函数begin和end用来获取序列的首指针和尾指针,这两个函数定义在iterator头文件中。
1 int ia[]={0,1,2,3,4,5,6,7,8,9};
2 int *beg = begin(ia); // 指向ia首元素的指针
3 int *end = end(ia); // 指向ia尾元素的下一位置的指针