异常接口声明

C++ 异常 C++11 不再建议使用异常规范 // 异常规范 只能抛出 int float char 三种类型的异常 C++11以后不再建议使用 void func1() throw(int, float, char){ throw "string"; // terminate called after throwing an instance of 'char const*' } // 不能抛出任何类型的异常 OK void func2() throw(){ throw -1; // terminate called after throwing an instance of 'int' } // 可以抛出任何类型的异常 void func3(){ throw "error"; } int main() { try{ func1(); } catch(char const * e){ cout << e << endl; } catch(....

January 15, 2022 · 1 min · Rick Cui

栈解旋 Unwinding

异常被抛出后,从进入 try 块起到异常被抛出前,这期间在栈上构造的所有对象都会被自动析构,析构的顺序与构造的顺序相反。 与 return 类似 class Test{ public: Test(string name){ m_name = name; cout << m_name << "被构造了" << endl; } ~Test(){ cout << m_name << "被析构了" << endl; } private: string m_name; }; double func1(int x, int y){ Test t1("t1"), t2("t2"); if(y == 0){ throw y; } return x / y; } int main() { try{ Test t3("t3"), t4("t4"); func1(10, 0); } catch(int e){ cout << "除数为 " << e << endl; } return 0; } t3被构造了 t4被构造了 t1被构造了 t2被构造了 t2被析构了 t1被析构了 t4被析构了 t3被析构了 除数为 0

January 15, 2022 · 1 min · Rick Cui

异常

一、try、catch、throw 可以使用 throw 语句在代码块中的任何地方抛出异常。throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型 C++ 异常机制是跨函数的,且是必须处理的。如果中间函数没有处理就一直抛到最顶层,如果 main 函数也不处理,程序就会挂掉 int main( ) { try{ throw "exception"; }catch(const char * e){ cout << e << endl; }catch(...){ // 捕获所有异常 cout << "..." << endl; } { cout << "finally" << endl; } return 0; } 输出: Start exception finally 0 Finish 二、std::exception class exception { public: exception() throw(); exception(const exception& rhs) throw(); exception& operator=(const exception& rhs) throw(); virtual ~exception() throw(); virtual const char *what() const throw(); }; 派生了两个异常类:...

January 15, 2022 · 1 min · Rick Cui

类型转换

1. static_cast<> 可以转换内置数据类型; 不可以转换没有关系的指针或引用; 可以转换有继承关系的指针或引用(父类转子类或子类转父类都可以); // static_cast<> // 1. 内置对象 int a = 97; char c = static_cast<char>(a); // OK cout << c << endl; // 2. 自定义类型对象 // Building bb; // Animal aa = static_cast<Animal>(bb); // error: no matching function for call to ‘Animal::Animal(Building&)’ // 3. 不同类型的指针转换 // int *p = &a; // char *pc = static_cast<char*>(p); // error: invalid static_cast from type ‘int*’ to type ‘char*’ // cout << pc << endl; // Animal * pa = NULL; // Building *pb = static_cast<Building*>(pa); // error: invalid static_cast from type ‘Animal*’ to type ‘Building*’ // 4....

January 15, 2022 · 2 min · Rick Cui

自定义数组实现

要求 可以对内置数据类型以及自定义数据类型的数据进行存储 将数组中的数据存储到堆区 构造函数中可以传入数组的容量 提供对应的拷贝构造函数以及 operator= 防止浅拷贝问题 提供尾插法和尾删法对数组中的数据进行增加和删除 可以通过下标的方式访问数组中的元素 可以获取数组中当前元素个数和数组的容量 实现 template<class T> class MyArray{ public: MyArray(int capacity){ this->m_capacity = capacity; this->m_size = 0; this->m_addr = new T[this->m_capacity]; } MyArray(const MyArray& arr){ if(arr.m_addr == NULL){ return; } // 深拷贝 this->m_capacity = arr.m_capacity; this->m_size = arr.m_size; this->m_addr = new T[this->m_capacity]; for(int i = 0; i < m_size; ++i){ // T 类型是可拷贝的,= 运算符也是深拷贝 this->m_addr[i] = arr.m_addr[i]; } } MyArray& operator=(const MyArray& arr){ if(this == &arr){ return *this; } if(this->m_addr !...

January 15, 2022 · 2 min · Rick Cui