C++基础知识day8

1.类模板
// 模板类派生类
// 1、派生一个具体的类
class B:public A<int>
{
public:
 B(int a, int b):A(a)
 {
 }
private:
 int b;
};
// 2、派生一个模板类
template <typename T, typename T2>
class C:public A<T>
{
public:
 C(T a, T2 c):A(a)
 {
 }
private:
 T2 c;
};

template <typename T>
class D:public A<int>
{
public:
 C(int a, T d):A(a)
 {
 }
private:
 T d;
};
// 类模板对象作为函数参数传递
// 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       : 去掉变量的常量属性
// 根据特殊的对象做一些特殊的事情
 
 // dynamic_cast 将基类指针转换为派生类指针
 // 1、如果这个基类指针指向确实是要转换的派生类类型的对象,返回指向这个对象的指针
 // 2、如果这个基类指针指向的不是要转换的派生类类型的对象,返回的是空指针 NULL

5.异常
// 1、异常是需要抛的 throw异常
// 2、异常是跨函数的
// 3、捕获到异常变量后的处理方式:1、收下,不让异常变量继续抛  2、将异常变量再抛出去
// 4、异常变量的捕获是要严格匹配类型的,不允许变量的隐式转换

 // 将可能发生异常的语句放到 try 块中
 // 1、没有异常发生,catch语句都不执行,程序从catch语句之后接着运行
 // 2、有异常,匹配catch 类型,进入到相应的 catch语句执行,执行完后从catch语句之后接着运行

// 栈解旋:异常抛出到异常变量被接收,期间所有的栈上的变量都会被自动释放

6.异常变量的生命周期
// 1、用一个普通变量去收抛出的异常对象,会调用拷贝构造函数,异常对象直到异常处理结束以后才被释放
 // 2、用一个引用去接收抛出的异常对象,不会调用拷贝构造函数,异常对象到整个异常处理结束才释放
 // catch(Error3 e)
 // catch(Error3 &e)
 // 3、接收异常对象指针:
 // a、如果是栈上的对象指针,则接收回来的时候栈上对象已经被释放,指针是无效指针
 //  b、如果是堆上的对象指针,必须手动调用delete释放,否则会造成内存泄露
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值