目录
一、异常
1 C++ 异常机制:
2 使用try catch进行异常处理.
3、c++ 已经内置标准异常类,专业用于抛出的语法中
4 自定义异常:
5 函数只抛出,不处理。让上层函数处理,并且上层函数还可以不处理,让上上层函数处理,以此类推。
二、转换函数
三、智能指针
1 unique_ptr,
3 weak_ptr
可以让程序在即将发生异常前被处理,不会让程序因为发生异常而终止。
处理执行try块的代码,如果执行throw 数据, 则try中余下的代码都不执行,进行进入catch中执行,而catch中参数会收到throw 执行出的数据。catch执行结束后,程序从catch后面的代码继续执行
抛出的该数据可以是基础类型,也可是对象.
示例1: 抛出int型数据
示例2:抛出字符串
示例3:抛出对象
该示例是一个不规范的示例,此处给出,只为讲清楚异常的机制
异常类使用时, 导入,并且异常类的名称空间为std
示例1:抛出exception异常
示例2:抛出invalid_argument异常
该异常对象构造函数还字符串参数。
一般继承exception来实现,理论上也可以通过继承exception的子类来实现
示例1:
在函数后面指定能抛出的异常数据类型
指定抛出的是类时,实计抛出的可以是指定类和派生类的对象
如果函数抛出throw()则表示不能抛出异常,该方式现在已经建议使用(11版本开始) const noexcept代替,就像前面使用const char* what() const noexcept , 表示不能抛出异常。
1 概念:
转换函数的实质就是运算符重载,只是重载的运算符不是内置的运算符而是类名这个特殊的自定义类型。
2 自定义转换函数
(1)语法形式:
operator 类型名( )
{
实现转换的语句
}
(2)转换函数的基本规则:
转换函数只能是成员函数,无返回值,空参数。
不能定义到void的转换,也不允许转换成数组或者函数类型。
转换常定义为const形式,原因是它并不改变数据成员的值。
explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换
(3)示例:
//源文件,测试文件
#include
using namespace std;
class Integer {
private:
int val;
public:
Integer(int i=0) {
cout<<"Integer(int i)"<val = i;
}
//转换函数
operator int() const {
cout<<"int()"<val = val;
}
int getVal() {
return val;
}
};
int main() {
Integer i;// 触发 Integer(int u)
i.setVal(100);
int x = i;//等效书写 int x = (int)i; 触发int()。
cout<
3 标准转换函数
智能指针:
只针对堆中对象。 类名 p=new 类名。
1、unique_ptr:
只允许一个指针指向对象,指针不指向堆中对象时,堆中对象被销毁。
2、shared_ptr
在C++11中有四种智能指针,auto_ptr,shared-ptr,unique_ptr和weak-ptr。其中auto_ptr有和多不足之处,在C++11中已经建议废弃使用。都是在memory头文件中声明的。名称空间为std
当变量销毁或变量的值置NULL后,指向的对象会销毁,该对象还只能一个指针指向它。
该指针的操作
(1) p->访问对象中的成员
(2) p = NULL;
(3) p.reset();//等效于 p = NULL
(4) p.reset(new Demo); p指向新的堆中的对象, 不再指向之前的内容
示例: unique_ptr
在给shared_ptr分配内存时建议使用make_shared函数,这样最安全。make_shared会分配一个临时对象,而临时对象又会自动销毁,所以会有两次析构函数的执行。
p1.reset()会使用p1不再指向对象。等效于p1=NULL
p1.reset(new Demo),该指针指向新的对象了。
可以保存一个“弱引用”,引用一个已经用shared_ptr管理的对象。
weak_ptr可通过shared_ptr来初始化
weak_ptr.expired()判断对象是否销毁,如果有返回0,没有返回1
weak_ptr.lock()返回shared_ptr, 如果没有返回NULL