Effective C++
Effective C++学习记录
搓搓程序狗
you can you code,no can no bb
展开
-
条款12:复制对象时勿忘其每一部分
对于一个类,如果你自己定义了构造函数和复制控制函数,那么编译器就不会生成默认的构造函数和复制控制函数,而且假设你的复制控制函数漏掉了某个成员,那么编译器也不会提醒这个错误:class Date{public: Date(int d = 1,int m = 1,int w = 1):day(d),month(m),weekday(w){cout<<"基类构造函数"<<endl;} Date(const Date&); Date& ope...转载 2022-03-15 16:41:26 · 239 阅读 · 0 评论 -
条款11:在operator= 中处理“自我赋值”
自我赋值发生在对象被赋值给自己class Test{}Test t;t = t;虽然自我赋值是合理的,但是自我赋值有时依然会出现问题class Test{...};class Run{ Run& operator=(const Run& run){ delete t; t = new Test(*run.t); return *this; }private: Test* t;};上述代码问题原创 2022-03-15 11:16:25 · 319 阅读 · 0 评论 -
条款10:令operator= 返回一个reference to *this
* 只有return *this才能实现连续赋值。赋值的黑科技写法(赋值采用右结合律):int x,y,z;x = y = z = 4;如何实现上述的连续赋值?class Add{public: ... Add& operator= (const Add& add) { ... return *this; //传入的实参为等号右侧的值,返回的刚好是左侧的引用。 }};...原创 2022-03-15 10:59:59 · 148 阅读 · 0 评论 -
条款9:绝不在构造和析构过程中调用virtual函数
* 在构造和析构期间不要调用virtual函数,因为这类调用从不下降至派生类。//看下述代码需要明白一个概念:基类构造期间的virtual函数不会下降到派生类层。//也就是说基类构造期间logTransaction()还不是虚函数。class Transaction{public: Transaction(){ ... fun(); } virtual void fun() const { ... }..原创 2022-03-14 17:08:30 · 556 阅读 · 0 评论 -
条款8:别让异常逃离析构函数
* 析构函数绝对不要吐出异常。* 如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后结束程序。* 如果客户要对某个操作函数运行期间抛出的异常做出响应,那么class应该提供一个普通函数执行该操作而不是在析构函数中进行。...原创 2022-03-14 15:58:36 · 172 阅读 · 0 评论 -
条款7:为多态基类声明virtual析构函数
* 如果这这个基类在派生过程中要实现多态,那么就需要把它的析构函数设为virtual;如果这个类并不是用作基类或者并不是实现多态,那么就不要设为virtual。class A{...};class B:public A{...};第一种情况:如果析构函数不是虚函数的话,A *p = new B();delete p;对象p的内存片段会被解释成A对象,因为对于这个内存只知道是用A的指针指向的(静态绑定),也就是base对象,调用父类的析构函数,析构了base的部分,而没调用到派生类的析构函数,于是这原创 2022-03-14 15:44:11 · 206 阅读 · 0 评论 -
条款6:若不想使用编译器自动生成函数,就该明确拒绝
* 如果不想使用某个可能默认产生的函数,那么就应该显示的阻止它。可以通过把它声明为private或者通过一个特殊的基类继承下来。编译器会默默的为你生成构造函数,赋值构造函数,复制构造函数和析构函数。这条大家应该根据条款5知道了,如果我们不想让编译器自动生成,应该怎么样做?方法1(直接法):将不想编译器自动生成的函数的声明放到private,并不去定义它们。因为在private里,所以用户没发直接使用(对该类的对象进行赋值和拷贝操作);因为没有定义,所以类的public成员函数、类的友元触原创 2022-03-14 15:07:25 · 559 阅读 · 0 评论 -
条款5:了解C++默默编写并调用哪些函数
* 如果没有定义构造函数,复制构造函数,赋值构造函数,析构函数,编译器帮你定义,并把这些函数是为public。如果某些数据成员无法进行赋值,那么就不会定义赋值构造函数。这些函数包括:默认构造函数,复制构造函数,赋值构造函数,以及析构函数。这些函数都属于public部分。在有些情况下,赋值构造函数时没有意义的,此时编译器就会拒绝构造一个这样的函数,举一个例子:template <typename T>class Test{public: Test(const Type v...原创 2022-03-14 14:17:51 · 618 阅读 · 0 评论 -
条款4:确定对象被使用前已经被初始化
* 为内置型对象进行手工初始化,因为C++不保证初始化它们;* 构造函数最好使用成员初始化列表(实际初始化顺序不与列表的排列顺序有关,只取决于类中的声明顺序),而不要在构造函数体内使用赋值操作;* 未避免“跨编译单元的初始化次序”问题,请用local static代替non-local static对象。1. 内置类型C++中的内置基本类型,比如int,double,float等,初值都是垃圾值,即声明int i,i的初值是一个垃圾值。本书建议的最佳处理方法是:永远在使用对象之前将之..转载 2022-03-08 09:26:46 · 402 阅读 · 0 评论 -
条款3:尽可能的使用const
* 将某些东西声明为const可帮助编译器侦测出错误的用法。* 假如当const和non-const成员函数有着相同的用法时,non-const的成员函数调用const版本可以避免代码重复const出现在*左侧,表示被指物是常量;出现在*右侧,表示指针是常量。也可能同时出现在*两侧。被指物是常量时,const写在类型的前后都是可以的const int * num1 = 3;int const * num2 = 3;如果两个成员函数如果只是常量性不同,可以被重载class C..原创 2022-03-07 10:43:37 · 243 阅读 · 0 评论 -
条款2:尽量以const、enum、inline替换 #define
* 对于单纯常量,最好以const对象或enum 替换#define* 对于形似函数的宏,最好改用inline函数替换#define常量替换宏定义当定义 #define ASPECT_RATIO 1.653时,ASPECT_RATIO 在编译器处理之前就已经被1.653替换了。1、预处理器将代码中所有的ASPECT_RATIO都替换成了1.653.(出现多份占资源)当你认为的ASPECT_RATIO 在程序运行过程中出问题调试的时候,2、最终只会找到1.653 而不是ASPECT_RATIO。.原创 2022-03-04 17:01:22 · 452 阅读 · 0 评论