c++ 学习 8

模板

  • 函数模板(function template): 是一种模板,用来做出函数 (模板是一种声明,而不是定义,编译器只是记下模板,然后知道了具体的类型才定义)
template <typename T>
void swap1(T & x, T& y){
    T temp=x;
    x=y;
    y=temp;
}
  • 模板函数(template function): 是用模板做出来的函数,是函数模板的实例化.
    编译器推断模板类型从实际的形参类型推断;也可以在尖括号显式地表达参数的类型
int main(){
    // int x=10;
    // int y=30;
    string x="hello";
    string y="world";
    swap1(x,y); //或者swap<string>
    cout<<"x"<<x<<endl;
    cout<<"y"<<y<<endl;
    return 0;
}
  • 类模板(class template): 是一种模板,用来做出类。(声明)
template <class T>
class Vector
{
public:
    Vector(int);
    ~Vector();
    Vector(const Vector &);
    Vector &operator=(const Vector &);
    T &operator[](int i);
private :
    T* m_elements;
    int m_size;
};
template<class T>
Vector<T>::Vector(int size):m_size(size){
    m_elements = new T[m_size];
}
template<class T>
T& Vector<T>:: operator[](int index){
    if(index < m_size && index >0>){
        return m_elements[index];
    }else{
        
    }

}
  • 模板类(template class): 是用模板做出来的类。是类模板的实例化。
  • 如果没有template,能做自动类型转换时是会做的。但是一旦有了模板之后,就不再做自动类型转换了。因为模板其实就是个模具,它没那么智能,它只是直接填充。
  • 函数调用顺序
    1.首先会检查唯一的函数匹配
    2.检查唯一的函数模板匹配
    3.如果上述都没有完全匹配的,就按照普通的函数重载,参数类型转换进行就可以了。

异常

  • 异常的好处: 是把业务逻辑和错误处理分的很清楚。
  • throw : 一个类里面的对象
    在堆里:有且仅有new出来的东西
    全局数据区里:全局变量 静态本地变量 静态成员变量
    在堆栈里:本地变量 函数内部产生的对象
  • 处理过程 :一旦有异常发现就会沿着调用的链条一直找到try和匹配catch 的地方 然后事情在那里得到处理,堆栈内的东西被catch后最终会被恰当的销毁。(倾向于抛的是堆栈里的对象)
  • 异常语句:** …** 是代表所有的异常 但是拿不到对象 最好不要用
  • c中用malloc分内存,不够是会返回null c++用new分内存 不够会返回bad_alloc()的异常
    new是先分配内存 先有内存然后执行构造函数 ,把这个内存地址交给构造函数 于是构造函数去构造他,但是构造函数抛了异常 构造无法形成 所以p不存在 p不知道在哪 所以这是内存垃圾
    所以解决办法:在构造函数加上 delete this
  • 构造函数抛出异常: 构造函数出错了 抛异常 这样这个对象构造没有完成
    new是先分配内存 先有内存然后执行构造函数 ,把这个内存地址交给构造函数 于是构造函数去构造他,但是构造函数抛了异常 构造无法形成 所以p不存在 p不知道在哪 所以这是内存垃圾
    所以解决办法:在构造函数加上 delete this
#include<iostream>

class A{
    public:
    A(){
        throw 0;
    }
};
int main(){
    A* p=new A();  //因为构造函数抛出异常,所以无法得到该对象的地址,所以就成了内存垃圾,
                   //理想做法是在抛出异常前,delete this
    delete p;
    return 0;
}
  • c 语言是在运行时刻检查有没有抛出异常,java 是在编译时刻有没有抛出异常。
    c语言如果有throw,只抛出throw()列表里的异常,只是给调用者看。如果要抛出所有可能的异常throw(…).如果不抛出任何异常 ,则throw(), 而java 中没有throw 表示不会抛出异常,throw exption 表示可能会抛出所有可能异常(因为所有的异常都是exption的子类)。
void abc(): throw(MathErr){
....
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值