Effective C++
发如雪-ty
一个工作7年的程序员,一直从事C++开发方面的工作,曾有幸在安防行业深耕4年,并有幸在工业检测行业工作至今已有3年,主要负责系统软件的设计与开发,个人编程的信仰:不要盲目学习酷炫的东西,最重要的依然是内功。
展开
-
Copy and Swap技术-安全自我赋值
Copy and Swap技术原创 2023-04-08 00:34:34 · 188 阅读 · 0 评论 -
考虑virtual函数以外的其他选择
考虑virtual函数以外的其他选择原创 2022-12-11 17:20:02 · 187 阅读 · 0 评论 -
明智而审慎地使用private继承
之前说过public继承是is-a关系。如下例子class person{}class student:public person{}显然学生就是人。那private继承显然不是is-a关系,那他意味这什么呢?如果classes之间的继承关系是private,编译器不会自动将一个derived class对象,转换为一个base class对象、再有,由private base class继承而来的所有成员,在derived class中都会变成private属性,纵使他们在base中原原创 2022-03-27 00:09:33 · 613 阅读 · 0 评论 -
为什么我一直强调使用new和delete时要采取相同的形式
有如下类:class point_ty{private: int x; int y; int z;public: point_ty(int a, int b,int c) :x(a), y(b),z(c) { } point_ty() :x(0), y(0),z(0) { } void show() { cout << this << " x:" << x << " y:" << y << e原创 2022-03-19 23:01:02 · 122 阅读 · 0 评论 -
RALL再度探索
class TestObj{public: TestObj() { cout << "TestObj()\n"; } ~TestObj() { cout << "~TestObj()执行\n"; } void showMsg() { cout << "showMsg()\n"; }};class ManageObj{public: ManageObj(TestObj *pObj) :m_pObj(pObj) { }原创 2022-03-18 23:58:15 · 308 阅读 · 0 评论 -
深度探索c++对象模型-23-多继承第二基类虚函数支持、虚继承带虚函数
一、多重继承第二基类对虚函数支持的影响(this指针调整作用)子类继承了几个父类,子类就有几个虚函数表this指针调整的目的就是让对象指针正确的指向对象的首地址,从而能正确的调用对象的成员函数或者说正确确定数据成员的存储位置。看如下代码:class Base{public: Base() { printf("Base::this = %p\n",this); } virtual void f() { cout << "Base:f()" << endl原创 2021-08-01 17:21:07 · 237 阅读 · 1 评论 -
巧妙使用UnCopyable类,阻止编译器自动生成的函数
class UnCopyable{public: UnCopyable() = default; ~UnCopyable() = default;private: UnCopyable(const UnCopyable &); UnCopyable& operator=(const UnCopyable &);};//我是独一无二的,我不能被复制class MySelf:private UnCopyable{public: MySelf(string na原创 2022-03-07 23:23:05 · 237 阅读 · 0 评论 -
effective c++ 24 不要在类的构造函数与析构函数中调用虚函数
不要在类的构造函数与析构函数中调用虚函数看如下代码:class BASE{public: BASE() { myPrint(); } ~BASE() { myRelease(); }protected: virtual void myPrint(){ cout << "Base" << endl; } virtual void myRelease(){ cout << "Base Release" << endl; }};原创 2021-09-13 22:21:51 · 185 阅读 · 0 评论 -
effective c++ 24若不想使用编译器自动生成的函数,就应该明确拒绝
以拷贝构造函数、拷贝赋值为例第一种方法:将其声明为privateclass Ty{public: Ty() = default;private: Ty(const Ty &o) { } Ty &operator=(const Ty &o) { return *this; }};void main(){ Ty t1; Ty t2(t1);//出错 system("pause");}但是这种方法,不安全,因为成员函数和friend原创 2021-09-12 21:18:50 · 110 阅读 · 0 评论 -
effective c++ 23NVI手法
NVI手法(Non-Virtual Interface)令客户通过public non-virtual 成员函数间接调用private virtual函数。这一手法称为 NVI手法。代码表现如下:class GameCharacter{public:int GetHealthValue() const{...//做一些事前工作int retVal = doHealthValue();//做真真的工作...//做一些事后工作}private:virtual int DoHealth原创 2021-09-04 12:31:23 · 247 阅读 · 0 评论 -
effective c++ 22将文件间的编译依存关系降至最低<下>
下面给出第二种方式:interface class.将Person变为抽象类:客户必须有办法为这种class创建新对象,他们通常这样实现然后客户这样使用:假设有:有了RealPerson之后就可以写出PersonTy::create()了:结果;加空格前:加空格后:...原创 2021-08-31 17:21:05 · 141 阅读 · 0 评论 -
effective c++ 22将文件间的编译依存关系降至最低<上>
假设你对 C++ 程序的某个 class 实现文件做了些轻微改变,修改的不是接口,而是实现,而且只改 private 成分。然后重新建置这个程序,并预计只花数秒就好,当按下 “Build” 或键入 make,会大吃一惊,因为你意识到整个世界都被重新编译和链接了!问题是在 C++ 并没有把 “将接口从实现中分离” 做得很好。class 的定义式不只详细叙述了 class 接口,还包括十足的实现细目:class PersonEx{ public: PersonEx(const std::str原创 2021-08-30 21:17:02 · 173 阅读 · 0 评论 -
effective c++ 21在operator=中处理‘自我赋值’
class temp{private: char *m_ptrSourse = NULL;public: temp(char *ptr) { m_ptrSourse = new char[strlen(ptr) + 1]; strcpy(m_ptrSourse, ptr); } temp& operator=(const temp &o) { if (&o == this) { return *this; } else {原创 2021-08-24 23:33:59 · 94 阅读 · 0 评论 -
effective c++ 20 使用对象前先初始化
内置类型C++中的内置基本类型,比如int,double,float等,初值都是垃圾值,即声明int i,i的初值是一个垃圾值。本书建议的最佳处理方法是:永远在使用对象之前将之初始化。比如: int x = 0;const char* test = “hello world”;double d; cin >> d;STLC++提供了丰富的容器,比如vector,list,deque,map和set等,这些容器已经写好了构造函数,所以总会自动初始化成默认值,程序员可以直接使.原创 2020-09-16 00:08:39 · 131 阅读 · 0 评论 -
effective c++ 19 绝对不重新定义定义继承而来的non- virtual
看代码:#include <iostream>using namespace std;class B{public: void mf(){ cout << "B::mf\n"; }};class D : public B{ /*public: void mf(){ cout << "D::mf\n"; }*/};int main(){ D x; B* pB = &x; pB->mf();原创 2020-09-15 21:55:46 · 100 阅读 · 0 评论 -
effective c++ 18 绝不重新定义继承而来的缺省值
绝不重新定义继承而来的缺省值一、请看例子class shape{public: virtual void DoDraw(int n = 200) { cout << "parent:" << n << endl; }protected:private:};class Tangle :public shape{public: v...原创 2019-10-29 21:13:01 · 120 阅读 · 0 评论 -
effective c++ 17避免返回handles指向对象内部成分
避免返回handles指向对象内部成分请看下面例子,类1class pointY{public: pointY(int a, int b) { x = a; y = b; } pointY() = default; void setX(int ter) { x = ter; } void setY(int ter) { y = ter; } voi...原创 2019-10-23 23:47:41 · 135 阅读 · 0 评论 -
effective c++ 16 尽量少做转型动作
尽量少转型动作旧式转换仍然可以使用,但推介新式的,因为它更容易辨认。比如以下例子:class Test{public: explicit Test(int x) { a = x; } void show() { cout << a << endl; private: int a{ 0 };};Test t;t = Test(21...原创 2019-10-17 21:38:39 · 124 阅读 · 0 评论 -
effective c++ 15 内存偏移---对象是如何调用成员的
内存偏移先看看官方的解释:计算机汇编语言中的偏移量定义为:把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也称为“有效地址或偏移量”。段地址左移四位,与有效地址相加,就构成了逻辑地址。一般而言,段地址是cpu自己独立编制的,但是偏移量是程序员编写的。偏移量就是程序的逻辑地址与段首的差值。说白了偏移量也就是一个相对位置量罢了。如果某个内存区的地址使用一个明确的类型指针例如in...原创 2019-10-13 23:02:22 · 463 阅读 · 0 评论 -
effective c++ 02 const的使用
常类型一、先看看c语言中的constconst int a = 10;int *ptr = (int *)&a;*ptr = 100;cout<<a<<endl;结果竟然是100,所以C语言中的const 是一个冒牌货,可以绕过地址去修改它的值;但在C++中是无法修改的,但同样的代码可编译。二、先看看c++语言中的const在c++中看到cons...原创 2019-09-05 15:00:26 · 264 阅读 · 0 评论 -
effective c++ 03 给析构函数加个virtual关键字
一、话不多说直接看代码 #include<iostream> #include <string> using namespace std; #include <iostream> using namespace std; class CJackTang{ public: CJackTan...原创 2019-09-06 11:35:03 · 221 阅读 · 0 评论 -
effective c++ 04 多态实现01
多态-01多态涉及的内容比较多,打算分三部分今天说第一部分。一、 什么是多态?本人理解为:调用同样的语句能够有多种不同的表现形态二、 例子class person{public:virtual void WhatICanDo(){}};class Student:public person{public: virtual void WhatICanDo() { ...原创 2019-09-09 12:42:56 · 124 阅读 · 1 评论 -
effective c++ 04 多态实现02(虚函数表的证明)
虚函数表的证明虚函数表定义虚函数表示通过一块连续的内存来存储虚函数地址的,其实内存本来就是连续的。这张表解决了虚函数重写的问题。在有虚函数对象的实例中都会对应一个虚函数表,像一张地图,指向了实际调用的虚函数。接下来我就来证明一下虚函数表:证明:class annimal{public: annimal() { cout << "hello world\n"; } ...原创 2019-09-10 12:57:00 · 130 阅读 · 0 评论 -
effective c++ 04 多态实现03(不要在构造函数和析构函数中调用虚函数)
标题不要在构造函数和析构函数中执行虚函数今天的主题我用一句话总结:如果你在基类的构造函数或者析构函数中调用虚函数,那么这个虚函数会被当做普通的成员函数。1.对于构造函数:子类在执行构造函数之前会先执行父类的构造函数,此时子类的专属部分还未被初始化,所以面对那些专属部分编译器就把它视而不见,也就是子类在构造函数之前编译器将子类(派生类)当做成了父类(基类)。2.对于析构函数:析构函数的执...原创 2019-09-15 10:45:35 · 140 阅读 · 0 评论 -
effective c++ 05 operator=返回引用
operator=返回引用令operator=返回一个引用关于赋值对于普通变量如下int x,y,z;x = y = z =10;采用从右到左的结合律。也就是:X = (y = (z = 10));先赋值给z,然后将z的值赋值给y,然后再将y的值赋值给x。那么在对于对象如何实现呢?请看例子class pe{private: int x{ 0 }; int y{ 0 }...原创 2019-09-17 13:36:49 · 138 阅读 · 0 评论 -
effective c++ 06 operator=中处理自我赋值
operator=中处理自我赋值如果有指针当自我赋值时如果删除指针如delete pb;则会把自身内存释放,那么再使用(pb = new Bitmap(*rhs.pb))就会出错,因为已经释放了。解决办法:...原创 2019-09-24 23:01:03 · 95 阅读 · 0 评论 -
effective c++ 07 复制对象时勿忘其每一个成分
复制对象时勿忘其每一个成分1.Copying函数应该确保复制“对象内的所有成员变量”及所有”base class”成分 如果你为class添加一个成员变量,你必须同时修改copying函数。当一个derived 类继承自 base class,若其copying函数内没有复制base class的对象,也即derived class的copy构造函数并没有指定实参传给base class的构造...原创 2019-09-26 21:49:53 · 114 阅读 · 0 评论 -
effective c++ 08 以对象管理资源01
以对象管理资源01先看如下代码段:class Investment{•••}; //投资继承体系中的root class//程序库利用工厂函数供应给我们特定的Investment对象://这里返回的指针指向Investment继承体系内的动态分配对象,调用者有责任最后删除它Investment* createInvestment();void f(){ Investm...原创 2019-09-27 21:31:01 · 114 阅读 · 0 评论 -
effective c++ 08 以对象管理资源02
以对象管理资源02请记住:任何技术都是一层窗户纸,一捅就破。只是起了一个牛逼的名字而已,我们花老爷grape告诉我,再怎么花哨的技术,无非就是封装、继承、多态而已。话不多说开始本节的重点智能指针(以对象管理资源。自C++11起,C++标准提供两大类型的智能指针: 1. Class shared_ptr实现共享式拥有(shared ownership)概念。多个智能指针可以指向相同对象,该...原创 2019-09-27 22:52:34 · 125 阅读 · 0 评论 -
effective c++ 09 以独立语句将newed对象置入智能指针
以独立语句将newed对象置入智能指针多说无用,一切都在代码里。。。class Widget{public: Widget() { cout << "Widget()" << endl; } ~Widget() { cout << "Widget()" << endl; }};int priority(){ int...原创 2019-09-28 23:36:14 · 133 阅读 · 0 评论 -
effective c++ 10 必须返回对象时,别妄想返回其引用
必须返回对象时,别妄想返回其referenceclass Typoint{public:Typoint(int a, int b){x = a;y = b;}Typoint(const Typoint & p){ x = p.x; y = p.y;} void showpoint(){ cout << "x:" << x &l...原创 2019-10-01 17:38:00 · 137 阅读 · 0 评论 -
effective c++ 11 将成员变量声明为私有
将成员变量声明为私有这部分内容,其实看书上的介绍就完全足够。补充:今天,2019年10月1号。由于工作原因,没有回家,单位组织观看了国庆典礼,我看到祖国的强大,我很骄傲、我很激动、我以身为中国人而自豪。祝大家节日快乐!...原创 2019-10-01 18:08:05 · 153 阅读 · 0 评论 -
effective c++ 12 宁以non-member、non-friend替换member函数
宁以non-member、non-friend替换member函数书上说有一个类,是清理缓存、记录等,现在有三个函数,如下分别做不同的清理功能。class WebBrowser{ // 表示网页浏览器public: ... void clearCache(); //1,清除缓存 void clearHistory(); //2,清除历史记录...原创 2019-10-05 23:22:05 · 166 阅读 · 0 评论 -
effective c++ 13 若所有参数都需要类型转换,请采用non-member函数
若所有参数都需要类型转换,请采用non-member函数一、 请看例子,有一个TyPoint的类:class TyPointEx{private: int x{0}; int y{ 0 };public: TyPointEx(int a = 0, int b = 0) { x = a; y = b; } void showTyPointx() { cout <...原创 2019-10-07 08:41:19 · 128 阅读 · 0 评论 -
effective c++ 14 尽可能延后变量定义的出现时间
尽可能延后变量定义的出现时间如果你定义了一个对象,那么在定义的时候就会调用改造函数,离开作用域的时候就会执行析构函数。即使这个对象没有被使用,仍然在离开作用域的时候要执行析构函数。一、非循环:如上述代码,如果在if语句中出现异常,那么之后的代码就不会执行了,而前面定义了变量 string encrypted;所以抛出异常后这个变量就没有被使用过,但是却执行了构造函数和析构函数,白白增加程序...原创 2019-10-11 12:36:45 · 160 阅读 · 0 评论 -
effective C++ 01 减少使用#define
高效的c++01减少使用#define开始新的旅程吧!一、传统枚举先看看之前的代码:#define TY_UP 0#define TY_DOWN 1#define TY_LEFT 2#define TY_RIGHT 3#define TY_IN 4#define TY_O...原创 2019-09-05 12:23:43 · 229 阅读 · 2 评论