模板
- 函数模板(function template): 是一种模板,用来做出函数 (模板是一种声明,而不是定义,编译器只是记下模板,然后知道了具体的类型才定义)
template <typename T>
void swap1(T & x, T& y){
T temp=x;
x=y;
y=temp;
}
- 模板函数(template function): 是用模板做出来的函数,是函数模板的实例化.
编译器推断模板类型从实际的形参类型推断;也可以在尖括号显式地表达参数的类型
int main(){
string x="hello";
string y="world";
swap1(x,y);
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 p;
return 0;
}
- c 语言是在运行时刻检查有没有抛出异常,java 是在编译时刻有没有抛出异常。
c语言如果有throw,只抛出throw()列表里的异常,只是给调用者看。如果要抛出所有可能的异常throw(…).如果不抛出任何异常 ,则throw(), 而java 中没有throw 表示不会抛出异常,throw exption 表示可能会抛出所有可能异常(因为所有的异常都是exption的子类)。
void abc(): throw(MathErr){
....
}