
Effective C++笔记
Effective C++读书笔记
持续学习,不断沉淀
C++开发工程师
展开
-
条款45:运用成员函数模板接受所有兼容类型;条款46:需要类型转换时为模板定义非成员函数
条款45:运用成员函数模板接受所有兼容类型例:template<typename T>class A{public: template<typename Y> void func1(A<Y>& y1); A(const A& a); //复制构造函数 template<typename Y> A(const A&...原创 2020-03-23 17:03:50 · 161 阅读 · 0 评论 -
条款43:学习处理模板化基类内的名称(调用模板基类内函数的方法)
1、存在的问题:template<typename T1>class Class_A{public: void send1(T1 var);};template <typename T1>class Class_B:public Class_A< T1 >{public: void send2(T1 var) { send1(var); } ...原创 2020-03-23 11:06:58 · 357 阅读 · 0 评论 -
模板与泛型编程知识点:编译期多态、typename标识嵌套从属类型名称
1、隐式接口与编译期多态:显式接口:一般类成员函数定义的接口。隐式接口:模板函数/类中定义的函数,由于参数类型、返回类型可能不定,因此为隐式接口。运行时多态:virtual函数引出的多态行为。编译时多态:定义模板函数/类由于在编译器根据类型参数实例化函数/类,因此称为编译期多态。2、typename的双重意义:a) 模板类型参数定义template < typename T&g...原创 2020-03-22 17:11:22 · 357 阅读 · 0 评论 -
条款37:绝不重新定义继承而来的缺省参数值:虚函数缺省参数为静态绑定
原因:virtual函数为动态绑定,而缺省参数为静态绑定。当使用基类指针/引用指向派生类对象,调用派生类函数时,派生类函数中的缺省参数不会被使用,而是使用基类函数的参数,例:1、重复定义存在的问题:class A{public: virtual void func1(int a = 2){...}};class B: public A{public: virtual void f...原创 2020-03-21 18:05:54 · 248 阅读 · 0 评论 -
类继承设计中:纯虚函数,非纯虚函数、非虚函数如何选择。
1、纯虚函数(pure virtual function):声明一个pure virtual函数的目的是为了让derived classes只继承函数接口,派生类必须提供实现。可以为pure virtual函数提供定义,但使用时需要指明所属类,如://.hclass A{public: virtual void func1() = 0;};class B : public A{p...原创 2020-03-21 17:19:38 · 797 阅读 · 0 评论 -
C++继承中的同名覆盖问题
1、同名覆盖的理论关键:继承中同名覆盖问题的核心知识点:作用域问题,例子:int a;void dosomething(){ double a; cin>>a; //使用double a}现象:内层作用域会覆盖外层作用域的同名变量,而无论变量的类型。原因:当编译器遇到a时,首先在local作用域查找该变量,找到则停止向外查找,而无论这个变量的类型,这就是C++名称遮掩...原创 2020-03-21 12:15:49 · 3835 阅读 · 3 评论 -
条款18-25:设计与声明:函数传递引用、自定义高效swap函数、namespace可以跨越多个源文件
18、让接口容易被正确使用,不易被误用。19、设计class犹如设计type。20、宁以pass_by_reference_to_const替换pass_by_value。21、必须返回对象时,不要返回引用。22、将成员变量声明为private。23、宁以non_member、non_friend代替member函数。24、若一个函数所有参数都需要类型转换,那么这个函数必须为non_member函数。25、考虑写出一个不抛异常的swap函数。原创 2020-03-19 11:20:10 · 176 阅读 · 0 评论 -
条款13-17:资源管理,std::shared_ptr
1、以对象管理资源:在构造函数中获取资源,离开作用域,析构函数自动释放资源。如使用智能指针对象管理资源。2、禁止复制(私有复制、赋值运算符)、引用计数等方法管理资源的拷贝。//.hClass A{ int xx;public: void show(); operator int();};//.cppvoid express(A* a){ ... }std::shared_...原创 2020-03-18 10:39:28 · 117 阅读 · 0 评论 -
条款11:在operator=中处理“自我赋值”
存在的问题:在类的赋值运算符函数中,需要安全处理自我赋值问题,即://.cppClassA a1;a1 = a1; //自我赋值处理方法:为阻止这种现象,有三种方法:方法1:证同测试:A& A::operator=(const A& a){ if(&a == *this) return *this; //证同测试,如果是自我赋值,则不做任何事。 del...原创 2020-03-17 16:15:52 · 195 阅读 · 0 评论 -
条款10:令operator=返回一个reference to *this
赋值采用右结合律,赋值操作可以写成连锁形式:int a,b,c;a = b = c = 4;a = (b = (c = 4));// 右结合律为了实现连锁,赋值操作必须返回一个引用指向操作符的左侧实参,因此自定义的类实现赋值操作时也应遵循该协议。Class A{public: A(){} A& operator=(const A& a) { ... re...原创 2020-03-17 15:45:04 · 114 阅读 · 0 评论 -
条款9:绝不在构造与析构过程中调用virtual函数
1、绝不在构造与析构过程中调用virtual函数:在当前执行的构造与析构函数中,内部的虚函数不会下降到派生类中执行派生类重载的虚函数,因为,此时派生类还没有构建。//.hClass A{ A(){funa();} virtual void funa() { cout<<"A";};};Class B:public A{ B() {} virtual void funa...原创 2020-03-17 15:02:59 · 183 阅读 · 0 评论 -
条款2:尽量以const、enum、inline代替#define
1、const与enum代替#define定义常量:#define ABC 12.3; //宏一般全大写const Abc = 12.3;原因:a) ABC在预处理阶段被12.3代替,因此ABC不会进入符号表,调试错误只会显示12.3,因此会造成不必要的疑惑,浪费时间。b) #define的替换相比定义const常量会导致较多的代码量;c) #define不重视作用域,不能实现类内常...原创 2020-03-16 16:35:55 · 148 阅读 · 0 评论