1.读取数量不定的输入数据时可以把cin语句放到条件判断语句中,如果流的状态有效则读取成功,否则读取失败。
例如:
while(cin>>value) /* do something */
2.顶层const与底层const的区别
1)顶层const表示任意的对象是const(即常量)
例如:
const int value = 0; // i是顶层const常量 int i= 0; int *const ptr = &i; //ptr是顶层const常量
2)底层const一般用在引用和指针中,表示指针所指的对象或引用所绑定的对象是常量
例如:
const int ci = 42; //顶层const const int &ref = ci //ref是底层const const int *ptr = &ci; //ptr是底层const
3.常量表达式和constexpr
常量表达式是指其值不会改变并且在编译过程中就能得到计算结果的表达式。允许将变量声明为constexpr类型以便由编译器来验证变量
的值是否是一个常量表达式,如果不是将会报错。
在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,而对指针所指的对象无关。
例如:
const int *p = nullptr; //p是一个指向整型常量的指针 const int *q = nullptr; //q是一个指向整型的常量指针
要注意以上两者的区别。
4.const与类型别名
看以下代码:
typedef char *pstring; const pstring cstr = 0; //cstr是指向char的常量指针 const pstring *ps; //ps是一个指针,它的对象是指向char的常量指针
pstring本来是一个char型指针,但加上typedef后就表示一个类型,即char*类型,记住:const是对给定类型的修饰。
const pstring cstr = 0; 中的const修饰的是cstr,而 const pstring *ps; 中 的const修饰的是派生所指向的对象,ps本身不是常量,
如果为 const pstring * const ps; 则ps是一个常量指针,它指向的对象是指向char的常量指针,即ps为二重指针。
5.decltype
decltype(表达式) 中,如果表达式的内容是解引用操作,则decltype将得到引用类型,例如:
int i = 12,*p = &i; //则decltype(*p)的结果类型是int&,而非int
切记:1) decltype((表达式)) (双层括号)的结果永远是引用而 decltype(表达式) 结果只有当表达式本身是引用时才是引用。
2)decltype作用于数组(或函数名)时得到的类型是数组(或函数)而非指向数组(或函数)的指针。(这句话在C++Primer中出现不下5次)
6.getline函数
getline函数有成员版本和非成员版本,成员版本在标准库容器之中,这里介绍非成员版本。非成员版本形式为:
getline(输入流,string对象,指定分隔符) ,函数从一个给定的输入流中读取对象,存入string对象中,直到遇到指定的分隔符为止,指定
的分隔符一般为换行符。
7.范围for语句
形式为:
for(declaration:expression) {/* do something */}
其中expression部分是一个可迭代对象,declaration部分负责定义一个变量用于逐个访问可迭代对象中的每个元素,每次迭代,declaration部分
的变量都会被初始化为expression部分的下一个元素,例如:
vector<int> vec = {1,2,3,4}; for(int i:vec) std::cout<<i<<‘ ‘; /* 将输出1 2 3 4 */
范围for语句的定义来源于与之等价的传统for语句:
for(auto beg = v.begin(),end = v.end();beg!=end;++beg) { /* do something */}
注意:1)不能通过范围for语句增加vector或其他容器的元素。因为在范围for语句中预存了end()的值,一单在序列中添加元素,end函数的值可能就变得无效了。
2)范围for语句也可以用来遍历数组中的元素。
未完待续...