C++ Primer 第五章笔记 语句
- 悬垂else
C++中规定else与离他最近的尚未匹配的if匹配
为了避免歧义,可以用花括号控制执行路径 - switch语句
如果某个case标签匹配成功,将从该标签处开始顺序执行所有case分支。如果有break语句跳出switch部分,有时故意省略break语句使得程序能够连续执行若干个case标签。
- switch内部的变量定义
在switch语句中不能跳过带初始值的变量
case true:
string file_name;//错误,不允许跳过一个初始化的变量
int ival=0;//错误,不允许跳过一个初始化的变量
int jval;//正确,因为只是声明,没有初始化
break;
case false:
jval=next_num();//正确,给jval赋初始值
if (file_name.empty())//file_name在作用域(switch)内,但是没有被初始化
可以在switch语句中定义一个变量的三种情况
a)可以在default中定义;b)可以在最后一个case中定义;c)在某个特殊的定义变量,引入块语句,块语句中是个单独的变量域。
- 范围for语句
vector<int> v = {0,1,2};
for (auto &r:v)
r*=2;
for (auto beg = v.begin(),end=v.end();beg != end;++beg){
auto &r = *beg;
r *= 2;
}
- 标准异常
自己定义异常类型
struct MyException : public exception
{
const char* what () const throw ()//第二个const指这是个常函数,throw()说明可以不抛出异常,throw(type)会抛出type异常,throw(...)可能是任何类型的异常
{
return "C++ Exception";
}
};
常函数含义是函数体的代码不能修改实参的值,但是可以修改形参的值。常函数可以被其他成员函数调用,但是不能调用其他非常函数。