1.类模板
// 模板类派生类
// 1、派生一个具体的类
class B:public A<int>
{
public:
B(int a, int b):A(a)
{
// 1、派生一个具体的类
class B:public A<int>
{
public:
B(int a, int b):A(a)
{
}
private:
int b;
};
private:
int b;
};
// 2、派生一个模板类
template <typename T, typename T2>
class C:public A<T>
{
public:
C(T a, T2 c):A(a)
{
template <typename T, typename T2>
class C:public A<T>
{
public:
C(T a, T2 c):A(a)
{
}
private:
T2 c;
};
private:
T2 c;
};
template <typename T>
class D:public A<int>
{
public:
C(int a, T d):A(a)
{
}
private:
T d;
};
private:
T d;
};
// 类模板对象作为函数参数传递
// 1、写一个确定具体的 模板类
// 1、写一个确定具体的 模板类
// 类模板使用必须要指明类型
2.类模板的使用
// 1、类模板的成员函数在类的外部实现,则所有函数都要写成函数模板形式
// 2、在表明该函数属于哪个类的时候,要在类名后面加 <T>
// 3、函数的返回值一定要加上 <T>
// 1、运算符重载的友元函数,需要在 函数名和形参列表之间加 <T>
friend ostream& operator<< <T>(ostream& out, Complex<T> &c);
// 2.3 在函数名和形参列表之间加 <T> friend Complex<T> Sub <T>(Complex<T> &c1, Complex<T> &c2);
3.类模板中的static关键字
不同类型的类模板对应的static成员也是不同的(不同的类),但相同类型的类模板的static成员是共享的(同一个类)
4.类型转换
//static_cast : 普通数据类型之间的强转
//reinterpret_cast : 指针数据类型之间的转换
//dynamic_cast : 类层次之间数据类型的转换
//const_cast : 去掉变量的常量属性
//reinterpret_cast : 指针数据类型之间的转换
//dynamic_cast : 类层次之间数据类型的转换
//const_cast : 去掉变量的常量属性
// 根据特殊的对象做一些特殊的事情
// dynamic_cast 将基类指针转换为派生类指针
// 1、如果这个基类指针指向确实是要转换的派生类类型的对象,返回指向这个对象的指针
// 2、如果这个基类指针指向的不是要转换的派生类类型的对象,返回的是空指针 NULL
// dynamic_cast 将基类指针转换为派生类指针
// 1、如果这个基类指针指向确实是要转换的派生类类型的对象,返回指向这个对象的指针
// 2、如果这个基类指针指向的不是要转换的派生类类型的对象,返回的是空指针 NULL
5.异常
// 1、异常是需要抛的 throw异常
// 2、异常是跨函数的
// 3、捕获到异常变量后的处理方式:1、收下,不让异常变量继续抛 2、将异常变量再抛出去
// 4、异常变量的捕获是要严格匹配类型的,不允许变量的隐式转换
// 2、异常是跨函数的
// 3、捕获到异常变量后的处理方式:1、收下,不让异常变量继续抛 2、将异常变量再抛出去
// 4、异常变量的捕获是要严格匹配类型的,不允许变量的隐式转换
// 将可能发生异常的语句放到 try 块中
// 1、没有异常发生,catch语句都不执行,程序从catch语句之后接着运行
// 2、有异常,匹配catch 类型,进入到相应的 catch语句执行,执行完后从catch语句之后接着运行
// 1、没有异常发生,catch语句都不执行,程序从catch语句之后接着运行
// 2、有异常,匹配catch 类型,进入到相应的 catch语句执行,执行完后从catch语句之后接着运行
// 栈解旋:异常抛出到异常变量被接收,期间所有的栈上的变量都会被自动释放
6.异常变量的生命周期
// 1、用一个普通变量去收抛出的异常对象,会调用拷贝构造函数,异常对象直到异常处理结束以后才被释放
// 2、用一个引用去接收抛出的异常对象,不会调用拷贝构造函数,异常对象到整个异常处理结束才释放
// catch(Error3 e)
// catch(Error3 &e)
// 2、用一个引用去接收抛出的异常对象,不会调用拷贝构造函数,异常对象到整个异常处理结束才释放
// catch(Error3 e)
// catch(Error3 &e)
// 3、接收异常对象指针:
// a、如果是栈上的对象指针,则接收回来的时候栈上对象已经被释放,指针是无效指针
// b、如果是堆上的对象指针,必须手动调用delete释放,否则会造成内存泄露
// a、如果是栈上的对象指针,则接收回来的时候栈上对象已经被释放,指针是无效指针
// b、如果是堆上的对象指针,必须手动调用delete释放,否则会造成内存泄露