异常的接口声明
摘要:如果想抛出特定的类型异常 ,可以利用异常的接口声明 void func() throw ( int) 只能抛出 int类型 throw() 不抛出任何类型异常 使用QT创建项目 #include "mainwindow.h" #include <QApplication> #include <QDe
阅读全文
栈解旋(unwinding)
摘要:概念 异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反,这一过程称为栈的解旋(unwinding). #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namesp
阅读全文
自定义异常
摘要:#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class myException { public: void printError() { cout << "自定义异常" << endl; } };
阅读全文
异常的基本使用
摘要:异常 异常处理就是处理程序中的错误。所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在,空指针,内存不足等等) try 试图执行 try{}中的内容 在可能出现异常的地方 抛出异常 throw try下面 catch捕获异常 catch( 捕获类型 )
阅读全文
重新解释转换(reinterpret_cast)
摘要:最不安全,最鸡肋 不推荐 class Base {}; class Child :public Base {}; class Other {}; //重新解释转换(reinterpre_cast) void test02() { int a = 10; int* p = reinterpret_ca
阅读全文
类型转换(常量转换和引用转换)
摘要:常量转换 不能对非指针或者非引用进行转换 对引用转换 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; void test01() { const int* p = NULL; //取出const int
阅读全文
类型转换(动态转换)dynamic_cast
摘要:动态转换 不可以转换基础数据类型 父子之间可以转换 父转子 不可以 子转父 可以 发生多态 都可以 1.基础类型不可以转换 2.父子关系 向上转 可以 向下转 不安全就不可以 注意: dynamic_cast如果发生了多态,那么可以让基类转成派生类,向下转换 #define _CRT_SECURE_
阅读全文
类型转换(静态转换:static_cast)
摘要:静态转换 使用方式 static_cast< 目标类型>(原始数据) 可以进行基础数据类型转换 父与子类型转换 没有父子关系的自定义类型不可以转换 1.普通类型 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace s
阅读全文
类模板碰到友元函数(类外实现)
摘要:难点 1.不注意普通函数加上template<> 就成了模板函数, 而友元函数声明的时普通函数, 找不到普通函数的实现链接 err1 2.类内声明了模板函数,但此时声明因为有 <>所以编译器看不到,需要在这之前先声明函数 3.声明了函数还是会报错,因为函数中的参数 Person类并没有声明,所以还要
阅读全文
类模板碰到友元函数(类内实现)
摘要:友元函数类内实现 friend void printPerson( Person<T1 ,T2> & p ) 友元函数类外实现 friend void printPerson<>(Person<T1, T2> & p); //没有<>普通函数 声明 加上 <>模板函数声明 让编译器看到 函数 并且看
阅读全文
类模板的分文件编写的问题和解决(要引入.cpp而不是头文件)
摘要:分文件解决 .h .cpp分别写声明和实现 但是由于 类模板的成员函数运行阶段才去创建,导致包含.h头文件,不会创建函数的实现,无法解析外部命令 解决方案 保护 .cpp文件 (不推荐) 不要进行分文件编写,写到同一个文件中,进行声明和实现,后缀名改为.hpp 约定俗成的 (.hpp文件即分文件模板
阅读全文
类模板的类外实现成员函数
摘要:1. template <class T1, class T2> Person<T1, T2>::Person(T1 name, T2 age) #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using n
阅读全文
类模板继承问题
摘要:基类如果是模板类,必须让子类告诉编译器 基类中的T到底是什么类型 如果不告诉,那么无法分配内存,编译不过 利用参数列表class Child :public Base<int> #define _CRT_SECURE_NO_WARNINGS #include <iostream> using nam
阅读全文
查看数据类型
摘要:1. typeid(T).name(); //可以查看泛型传入的时什么类型数据
阅读全文
类模板做函数参数
摘要:三种方式 显示指定类型 参数模板化 整体模板化 实例: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; //类模板 template<class NameT, cla
阅读全文
类模板基本使用
摘要:类模板 语法:template <T…> 紧跟着是类 区别: 与函数模板区别,可以有默认类型参数 函数模板可以进行自动类型推导,而类模板不可以 类模板中的成员函数 一开始不会创建出来,而是在运行时才去创建 #define _CRT_SECURE_NO_WARNINGS #include <iostr
阅读全文
函数模板的局限性级解决方法(第三代具体化)
摘要:1. #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; class Person { public: Person(string name, int age) { th
阅读全文
模板实现机制
摘要:函数模板机制结论: 编译器并不是把函数模板处理成能够处理任何类型的函数,模板不是万能的,不能通用所有的数据类型 函数模板通过具体类型产生不同的函数,模板并不能直接调用,生成后的模板函数才可以调用 编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编
阅读全文
函数模板与普通函数的区别以及调用规则
摘要:区别 普通函数可以进行隐式类型转换 模板不可以 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //1.普通函数和函数模板的区别 template<class T> T myPlus(T a, T b)
阅读全文
函数模板基本用法及泛型
摘要:函数模板 template < class / typename T> 告诉编译器紧跟的代码里出现T不要报错 mySwap( T &a T &b ) 类型也需要传入 ,类型参数化 myswap(a,b) 自动类型推导 按照a b的类型 来替换T myswap<int>(a,b) 显示指定类型 实例:
阅读全文