Cpp学习笔记三
- try语句
- 函数参数
- 函数返回值
- 生命期
try语句
try语句用于处理程序异常
使用throw抛出异常,在try语句块中出现的异常使用 catch进行捕获
- 抛出异常
使用throw表达式抛出异常
例如:
throw runtime_error("message")
来抛出一个异常
每个标准库的异常类都有一个名为what
的函数,返回C风格字符串
- try语句块
语法:
try
{
...
}
catch(...)
{
...
}
抛出一个异常时,首先搜寻抛出异常的函数
若没有找到匹配的catch,则终止该函数的执行,并执行调用者的匹配的catch,若仍然没有找到,则层层上调。
若最终未找到,则函数将跳转到名为terminate的函数中。
- 异常类
C++标准库定义的常见的异常i类有:
- exception类
- runtime_error
- range_error
- logic_error
- invalid_error
- …
函数参数
C++和C语言的参数基本上都是传值,C语言可以通过传递指针来进行相应的操作
C++有一些不一样的东西
- 传引用参数
void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
优点:和指针很像,但是更安全,而且避免了复制对象
加上一个const,引用就不能被修改,更加安全
例如int len(const string &s)
-
vector等容器的形参
一般来说,沙比才会把整个vector都当成参数
那种操作会把整个vector全部复制过去
一般使用引用传参(不知道指针可不可),或者传递vector的迭代器进去,例如
void func(vector<int>::const_iterator start, vector<int>::const_iterator end)
-
数组的指针传递和引用传递
这种方式,数组大小和函数声明的不一样也没关系
void func(int a[10])
这种方式,数组大小必须和函数声明的一样
void func(int (&a)[10])
默认实参
就是在函数声明的时候就给它来一个参数
默认实参只能提供给尾部实参
在一个文件中,只能为一个实参指定默认实参一次
声明的时候给它来一个默认实参够了
函数返回值
函数可以返回对象的引用,这样子可以避免对象的复制
注意,千万不能返回局部对象的引用
类比C语言的指针,返回一个局部对象的指针是没有意义的
生命期
我觉得这个概念就是C语言的作用域,就是说得高大上了一点
但是生命期还是有和作用域不一样的地方的
例如,C++的对象出了它的作用域就会被销毁,分配的内存也会被销毁
C语言明显没有内存自动管理机制,一切都得自己动手。这样子才有掌控全局的舒爽感嘛。