From c0c6441ede8af600f22061d2b2ba566ed7a56ff4 Mon Sep 17 00:00:00 2001 From: yinkanglong_lab Date: Sun, 7 Mar 2021 16:27:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E6=80=81=E5=92=8C=E6=8C=87=E9=92=88?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- C++/C++基础/7 类.md | 8 +- .../{1 拷贝控制.md => 1 构造函数和析构函数.md} | 4 +- C++/类设计者的工具/2021-03-07-14-26-29.png | Bin 0 -> 67018 bytes C++/类设计者的工具/2021-03-07-15-55-33.png | Bin 0 -> 5654 bytes C++/类设计者的工具/2021-03-07-15-58-59.png | Bin 0 -> 8201 bytes C++/类设计者的工具/2021-03-07-16-00-43.png | Bin 0 -> 11765 bytes C++/类设计者的工具/3 面向对象程序设计.md | 461 +++++++++++++++++- C++/类设计者的工具/3.cpp | 73 +++ C++/面试/13.动态内存管理实现.md | 101 +++- C++/面试/14.空指针悬空指针野指针.md | 10 + ...{15.构造函数.md => 15.构造函数和析构函数.md} | 19 +- C++/面试/16.多态的三种实现方式.md | 80 +++ .../{8.标准库-头文件md => 8.标准库-头文件.md} | 6 +- 13 files changed, 733 insertions(+), 29 deletions(-) rename C++/类设计者的工具/{1 拷贝控制.md => 1 构造函数和析构函数.md} (93%) create mode 100644 C++/类设计者的工具/2021-03-07-14-26-29.png create mode 100644 C++/类设计者的工具/2021-03-07-15-55-33.png create mode 100644 C++/类设计者的工具/2021-03-07-15-58-59.png create mode 100644 C++/类设计者的工具/2021-03-07-16-00-43.png create mode 100644 C++/类设计者的工具/3.cpp rename C++/面试/{15.构造函数.md => 15.构造函数和析构函数.md} (55%) create mode 100644 C++/面试/16.多态的三种实现方式.md rename C++/面试/{8.标准库-头文件md => 8.标准库-头文件.md} (99%) diff --git a/C++/C++基础/7 类.md b/C++/C++基础/7 类.md index 01cd449d..32c2aadb 100644 --- a/C++/C++基础/7 类.md +++ b/C++/C++基础/7 类.md @@ -6,7 +6,7 @@ > - 继承 > - 多态 -## 1 定义抽象数据类型 +## 1 定义抽象数据类型(抽象) ### 概念 @@ -72,7 +72,7 @@ hello{ } ``` -## 2 访问控制与封装 +## 2 访问控制与封装(封装) ### 访问说明符 @@ -147,7 +147,7 @@ class Hello; * 类内查找。所有的类成员都被考虑。 * 在成员函数定义之前的作用域内查找。 -## 5 构造函数再探 +## 5 构造函数与初始化 * 当成员是常量或引用的时候,初始化是必不可少的。 * 成员初始化的书序与他们在类定义中的出现顺序一致。而非初始化列表中传入参数的顺序。 @@ -157,7 +157,7 @@ class Hello; ![](2021-03-05-13-42-02.png) -初始化执行的新婚徐 +初始化执行的顺序 1. 初始化列表 2. 委托构造函数 diff --git a/C++/类设计者的工具/1 拷贝控制.md b/C++/类设计者的工具/1 构造函数和析构函数.md similarity index 93% rename from C++/类设计者的工具/1 拷贝控制.md rename to C++/类设计者的工具/1 构造函数和析构函数.md index 7d0b18be..6237199c 100644 --- a/C++/类设计者的工具/1 拷贝控制.md +++ b/C++/类设计者的工具/1 构造函数和析构函数.md @@ -29,12 +29,12 @@ class Foo{ * 编译器自动生成的拷贝构造函数。从给定的对象中依次将每个非static成员拷贝到正在创建的对象当中。 -### 拷贝初始化 +### 赋值初始化 ``` string nies = string("efji"); ``` -* 当我门使用 赋值= 运算符时,发生拷贝初始化。 +* 当我门使用 赋值= 运算符时,发生赋值初始化,执行拷贝构造函数。 * 将一个对象作为实参传递给一个非引用类型的形参 * 从一个返回类型为费引用类型的函数返回一个对象 * 用花括号列表初始化一个数组中的元素或一个聚合类中的成员 diff --git a/C++/类设计者的工具/2021-03-07-14-26-29.png b/C++/类设计者的工具/2021-03-07-14-26-29.png new file mode 100644 index 0000000000000000000000000000000000000000..e9aa967e385af20848e71d736dc6fc0dd8fad934 GIT binary patch literal 67018 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 literal 0 HcmV?d00001 diff --git a/C++/类设计者的工具/2021-03-07-16-00-43.png b/C++/类设计者的工具/2021-03-07-16-00-43.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbfbb0a270a8c9f2b4496f95fd227a51bf9a57a GIT binary patch literal 11765 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 G@V@|+({Ez{ literal 0 HcmV?d00001 diff --git a/C++/类设计者的工具/3 面向对象程序设计.md b/C++/类设计者的工具/3 面向对象程序设计.md index 2cca8e8b..db71b0a3 100644 --- a/C++/类设计者的工具/3 面向对象程序设计.md +++ b/C++/类设计者的工具/3 面向对象程序设计.md @@ -1,7 +1,12 @@ # 面向对象程序设计 +> 参考文献 +> * [多态的三种方式](https://blog.csdn.net/qq_41306849/article/details/109081625) +> * [虚继承和虚基类](http://c.biancheng.net/view/2280.html) + + > 面向对象的基本概念 -> * 数据抽象和封装 +> * 数据抽象和封装(在语法基础部分讲解过了) > * 继承 > * 多态(动态绑定) @@ -15,25 +20,463 @@ * 继承:定义相似的类型,对相似的关系建模。实现代码重用。 * 动态绑定:可以在以一定程度上忽略相似类型的区别。 -### 继承 +### 继承概念(继承) * 继承:联系在一起的类构成以中层次关系 * 基类:层次关系的根部 * 派生类:其他类则直接或间接地从基类继承而来。 -* 虚函数: +* 派生类与基类的函数继承: + * 与类型相关的函数。基类与派生类类型不同,需要重写。 + * 与类型无关的函数。派生类直接继承,不需要修改。 -## 2 定义基类和派生类 +* 类派生列表:派生类通过类派生列表,明确指出它的基类。 + +``` +class Dog:public Animal{ +public: + double price()const override; +} +``` + +* 派生类可以通过**override关键字**注明改写基类的函数。 + + + +### 动态绑定(多态) + +* 在运行时选择函数的版本。通过使用动态绑定,我们能用同一段代码分别处理Animal和Dog的对象。 + +## 2 继承与多态详解 +## 2.1 继承 + +### 定义基类 +``` +class Quote{ +public: + Quote() = default; + Quote(string book,double sales_price):book_no(book),price(sales_price){}; + string isbn()const{ + return this.book_no; + } + virtual double net_price(int n)const{ + return n*price; + } + virtual ~Quote()=default; +private: + string book_no; +protected: + double price; +}; +``` +### 定义派生类 +``` +class Bulk_quote:public Quote{ +public: + Bulk_quote()=default; + Bulk_quote(string,double,int,double); + double net_price(int n)const override; +private: + int mn_qty = 0; + double discount=0.0; +}; +Bulk_quote::Bulk_quote(string book,double p,int qty,double disc):Quote(book,p),min_qty(qty),discount(disc){}//委托基类构造函数 +``` + + +### 继承方式 + +* 单一继承:继承一个父类,这种继承称为单一继承,一般情况尽量使用单一继承,使用多重继承容易造成混乱易出问题 +* 多重继承:继承多个父类,类与类之间要用逗号隔开,类名之前要有继承权限,假使两个或两个基类都有某变量或函数,在子类中调用时需要加类名限定符如c.a::i = 1; +* 菱形继承:多重继承掺杂隔代继承1-n-1模式,此时需要用到虚继承,例如 B,C虚拟继承于A,D再多重继承B,C,否则会出错 + + +### 继承权限 +* 继承权限:继承方式规定了如何访问继承的基类的成员。继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限 + +![](2021-03-07-14-26-29.png) + +### 注意事项 + +* 基类的静态成员变量,在整个继承体系中只存在该成员的唯一定义。 +* 派生类的声明中包含类名,但不能包含派生列表。 + +### final关键字 + +* 使用**关键字final**说明符防止类被继承 + + +* 使用**关键字final**说明符防止函数被重写 +``` +class A final{ + void f1(int) const; +}; +``` + +## 2.2 多态 + +### 多态分类 + +1. 静态多态,是只在编译期间确定的多态。静态多态在编译期间,根据函数参数的个数和类型推断出调用的函数。静态多态有两种实现的方式 + 1. 重载。(函数重载) + 2. 模板。 +2. 动态多态,是运行时多态。通过虚函数机制实现(也称为重写override),使用父类的指针或者是引用,调用一个虚函数时,会根据其指向的具体对象确定调用的函数。基类和子类维护一个虚函数表,对象当中包含的虚指针,指向基类或子类的虚函数表。如果子类没有重写父类的虚函数则会直接调用父类的方法,否则调用子类重写的方法。 + + +### 多态原理 + +* (对象的多态性)使用基类的引用或指针调用一个函数时。无法确定该函数作用的对象是什么类型。因为它可能是一个基类的对象,也可能是一个派生类的对象。 +* (函数的多态性)如果该函数是虚函数,则直到运行时才会决定执行哪个版本。判断的依据是引用或指针所绑定的对象真实类型。 +* 函数绑定。对非虚函数的调用在编译时进行绑定。我们通过对象进行的函数调用也在编译时绑定。对象的类型是确定不变的。 + +> 也就是说多态性体现在指针和引用的不确实能够性上。但对象在内存中的状态是确定的。当且晋档通过指针或引用调用虚函数是,才会在运行时解析该调用,也只有在这种情况下对动态类型才有可能与静态类型不同。 + +``` + Bulk_quote a();//定义了对象a。这时候,无法触发多态。 + Bulk_quote* b = new Bulk_quote();//指针可以指向不同的类型的对象。 + Bulk_quote &b = a;//引用可以指向不同类型的对象。 +``` + +### 重写与重定义对比 +* 重定义:基类中没有声明函数是虚函数。派生类中对普通函数进行了重定义。只是作用域上的覆盖,没有触发多态和动态绑定。 +* 重定义不能触发动态多态。无论指针或引用绑定的是什么对象,都会根据指针或引用的类型,调用该类型的函数。而不是使用虚指针查找虚函数表。只有调用虚函数的时候,才会去根据对象的虚函数指针,查找类中的虚函数表。 + +``` +class A{ +public: + int a; + A():a(10){}; + int real_ex(){ + return a; + } + virtual int virtual_ex(){ + return a; + } +}; + +class B:public A{ +public: + int b; + B():b(20){}; + int real_ex(){//重定义A的函数 + return b; + } + virtual int virtual_ex(){//重写A的函数 + return b; + } +}; +int main(){ + + Quote p(Bulk_quote());//直接初始化,拷贝构造函数 + Quote q = Bulk_quote();//赋值初始化,拷贝构造函数 + + // B test_b; + // A* test = &test_b; + A* test=new B(); + cout<real_ex()<virtual_ex()<Quote::net_price(); +``` +### 纯虚函数和抽象基类 + +``` + virtual void Eat() = 0; +``` +* 一个纯虚函数无须定义,在函数体的位置书写=0,就可以讲一个虚函数说明为纯虚函数。只能出现在类内部的函数声明语句出。在类的内部必须没有定义,在类的外部可以定义纯虚函数。 +* 含有纯虚函数的类是抽象基类。纯虚函数相当于接口,不能创建抽象基类的对象。 +* 派生类构造函数只初始化它的直接基类。 -## 6 继承中的类作用域 +### 虚函数表和虚指针原理 -## 7 构造函数与拷贝控制 +```C++ +class A +{ +public: + virtual void f(); + virtual void g(); +private: + int a +}; + +class B : public A +{ +public: + void g(); +private: + int b; +};//A、B实现省略 +``` +* 因为A有virtual void f()和g(),所以编译器为A类准备了一个虚函数表vtableA,内容如下: + + +``` +A::f 的地址 +A::g 的地址 +``` + +* B因为继承了A,所以编译器也为B准备了一个虚函数表vtableB,内容如下: +``` +A::f 的地址 +B::g 的地址 +``` +> 注意:因为B::g是重写了的,所以B的虚表的g放的是B::g的入口地址,但是f是从上面的A继承下来的,所以f的地址是A::f的入口地址。 + +* 某处有语句 B bB;的时候,编译器分配空间时,除了A的int a,B的成员int b;以外,还分配了一个虚指针vptr,指向B的虚函数表vtableB,bB的布局如下: + +``` +vptr : 指向B的虚表vtableB +int a: 继承A的成员 +int b: B成员 +``` + +## 4 访问控制与继承 + +### 访问控制 +* 派生类能够访问公有成员和受保护的成员。 +* 派生类不能访问私有成员。 + +public: +private: +protected: + +### 继承类型 + +* public 公有继承 +* private私有继承 + +### 默认的集成保护级别 + +* class关键字定义的派生类,默认是私有继承 +* struct关键字定义的派生类,默认是公有继承 + +## 5 继承中的类作用域 + +### 作用域 +* 当存在继承关系是,派生类的作用域嵌套在基类的作用域内。如果一个名字在派生类的作用域内无法解析,编译器在外层的基类作用域中寻找改名字的定义。 + + +### 编译时名字查找 + +* 引用或指针的静态类型决定了该对象有哪些成员是可见的。一个基类的引用和指针只能访问基类的成员。即是动态对象是其派生类。 + +### 名字冲突与继承 +* 派生了重用定义在直接基类或间接基类中的名字,会屏蔽定义在外层作用域基类中的名字 + +### 访问隐藏的成员 + +* 通过作用域运算符来使用一个被隐藏的基类成员。 + + +## 6 虚继承和虚基类 + +### 多继承 +* 多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。 + +* 多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示: + +### 菱形继承 + +![](2021-03-07-15-55-33.png) + +* 类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这个时候类 A 中的成员变量和成员函数继承到类 D 中变成了两份,一份来自 A-->B-->D 这条路径,另一份来自 A-->C-->D 这条路径。 + +* 下面是菱形继承的具体实现: + +``` +//间接基类A +class A{ +protected: + int m_a; +}; +//直接基类B +class B: public A{ +protected: + int m_b; +}; +//直接基类C +class C: public A{ +protected: + int m_c; +}; +//派生类D +class D: public B, public C{ +public: + void seta(int a){ m_a = a; } //命名冲突 + void setb(int b){ m_b = b; } //正确 + void setc(int c){ m_c = c; } //正确 + void setd(int d){ m_d = d; } //正确 +private: + int m_d; +}; +int main(){ + D d; + return 0; +} +``` +* 这段代码实现了上图所示的菱形继承,第 25 行代码试图直接访问成员变量 m_a,结果发生了错误,因为类 B 和类 C 中都有成员变量 m_a(从 A 类继承而来),编译器不知道选用哪一个,所以产生了歧义。 + +* 为了消除歧义,我们可以在 m_a 的前面指明它具体来自哪个类: +``` +void seta(int a){ B::m_a = a; } +``` +* 这样表示使用 B 类的 m_a。当然也可以使用 C 类的: +``` +void seta(int a){ C::m_a = a; } +``` + +### 虚继承(Virtual Inheritance) + +* 为了解决多继承时的命名冲突和冗余数据问题,C++ 提出了虚继承,使得在派生类中只保留一份间接基类的成员。 + +* 在继承方式前面加上 virtual 关键字就是虚继承,请看下面的例子: + +``` +//间接基类A +class A{ +protected: + int m_a; +}; +//直接基类B +class B: virtual public A{ //虚继承 +protected: + int m_b; +}; +//直接基类C +class C: virtual public A{ //虚继承 +protected: + int m_c; +}; +//派生类D +class D: public B, public C{ +public: + void seta(int a){ m_a = a; } //正确 + void setb(int b){ m_b = b; } //正确 + void setc(int c){ m_c = c; } //正确 + void setd(int d){ m_d = d; } //正确 +private: + int m_d; +}; +int main(){ + D d; + return 0; +} +``` +* 这段代码使用虚继承重新实现了上图所示的菱形继承,这样在派生类 D 中就只保留了一份成员变量 m_a,直接访问就不会再有歧义了。 + +* 虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类(Virtual Base Class),本例中的 A 就是一个虚基类。在这种机制下,不论虚基类在继承体系中出现了多少次,在派生类中都只包含一份虚基类的成员。 + +* 现在让我们重新梳理一下本例的继承关系,如下图所示: + +![](2021-03-07-15-58-59.png) + +* 观察这个新的继承体系,我们会发现虚继承的一个不太直观的特征:必须在虚派生的真实需求出现前就已经完成虚派生的操作。在上图中,当定义 D 类时才出现了对虚派生的需求,但是如果 B 类和 C 类不是从 A 类虚派生得到的,那么 D 类还是会保留 A 类的两份成员。 + +* 换个角度讲,虚派生只影响从指定了虚基类的派生类中进一步派生出来的类,它不会影响派生类本身。 + +### 虚继承在C++标准库中的实际应用 +* 在实际开发中,位于中间层次的基类将其继承声明为虚继承一般不会带来什么问题。通常情况下,使用虚继承的类层次是由一个人或者一个项目组一次性设计完成的。对于一个独立开发的类来说,很少需要基类中的某一个类是虚基类,况且新类的开发者也无法改变已经存在的类体系。 + +* C++标准库中的 iostream 类就是一个虚继承的实际应用案例。iostream 从 istream 和 ostream 直接继承而来,而 istream 和 ostream 又都继承自一个共同的名为 base_ios 的类,是典型的菱形继承。此时 istream 和 ostream 必须采用虚继承,否则将导致 iostream 类中保留两份 base_ios 类的成员。 + + +![](2021-03-07-16-00-43.png) + +### 虚基类成员的可见性 + +* 因为在虚继承的最终派生类中只保留了一份虚基类的成员,所以该成员可以被直接访问,不会产生二义性。此外,如果虚基类的成员只被一条派生路径覆盖,那么仍然可以直接访问这个被覆盖的成员。但是如果该成员被两条或多条路径覆盖了,那就不能直接访问了,此时必须指明该成员属于哪个类。 + +* 以图2中的菱形继承为例,假设 A 定义了一个名为 x 的成员变量,当我们在 D 中直接访问 x 时,会有三种可能性: + * 如果 B 和 C 中都没有 x 的定义,那么 x 将被解析为 A 的成员,此时不存在二义性。 + * 如果 B 或 C 其中的一个类定义了 x,也不会有二义性,派生类的 x 比虚基类的 x 优先级更高。 + * 如果 B 和 C 中都定义了 x,那么直接访问 x 将产生二义性问题。 -## 8 容器与继承 diff --git a/C++/类设计者的工具/3.cpp b/C++/类设计者的工具/3.cpp new file mode 100644 index 00000000..cecb3d46 --- /dev/null +++ b/C++/类设计者的工具/3.cpp @@ -0,0 +1,73 @@ +#include +using namespace std; + + + +class Quote{ +public: + Quote() = default; + Quote(string book,double sales_price):book_no(book),price(sales_price){}; + string isbn()const{ + return book_no; + } + virtual double net_price(int n)const{ + return n*price; + } + virtual ~Quote()=default; +private: + string book_no; +protected: + double price; +}; + +class Bulk_quote:public Quote{ +public: + Bulk_quote()=default; + Bulk_quote(string,double,int,double); + double net_price(int n)const override; +private: + int mn_qty = 0; + double discount=0.0; +}; + +Bulk_quote::Bulk_quote(string a,double b,int c,double d):Quote(a,b),mn_qty(c),discount(d){}; +double Bulk_quote::net_price(int n)const{ + return n*price*discount; +} + + +class A{ +public: + int a; + A():a(10){}; + int real_ex(){ + return a; + } + virtual int virtual_ex(){ + return a; + } +}; + +class B:public A{ +public: + int b; + B():b(20){}; + int real_ex(){//重定义A的函数 + return b; + } + virtual int virtual_ex(){//重写A的函数 + return b; + } +}; +int main(){ + + Quote p(Bulk_quote());//直接初始化,拷贝构造函数 + Quote q = Bulk_quote();//赋值初始化,拷贝构造函数 + + // B test_b; + // A* test = &test_b; + A* test=new B(); + cout<real_ex()<virtual_ex()< operator new 和 operator delete 实际上是由 malloc 和 free 来实现的,是对malloc 和 free 的封装。 +## 3 对比 + +### malloc/free 和 new/delete 区别: + +* 共同点:都在堆上申请空间,都需要手动申请 / 释放空间。 +* 不同点: + 1. malloc/free 是函数,new/delete是标识符 + 2. malloc 不会对对象进行初始化,new 可以初始化 + 3. malloc 申请空间时,需要手动计算需要申请空间的大小,而new只需在后面跟上类型,编译器会自动计算大小。 + 4. malloc 返回值是 void*,使用时必须要强制类型转换,而 new 并不需要强制类型转换,因为new后跟的就是类型。 + 5. malloc 申请空间失败返回 NULL,因此使用时必须判空,new不需要判空,但是需要捕获异常 + 6. 申请自定义类型对象时,malloc/free只会开辟空间,并不调用构造/析构函数,而 new 是先申请空间, + 然后调用构造函数完成对象的初始化,delete 在释放空间前会先清理对象占用的资源。 + 7. malloc/free 的效率会比 new/delete 的高,因为 new/delete 中封装的是malloc/free。 + diff --git a/C++/面试/14.空指针悬空指针野指针.md b/C++/面试/14.空指针悬空指针野指针.md index e69de29b..04448d03 100644 --- a/C++/面试/14.空指针悬空指针野指针.md +++ b/C++/面试/14.空指针悬空指针野指针.md @@ -0,0 +1,10 @@ +# 指针 + +### 野指针 +野指针就是未进行初始化的指针,你不知道这个指针变量里面的内容是什么,一般是最近一次这块内存上面的内容,也就是说不知道用这个指针访问的内存是哪一块,所以指针初始化的时候要typename * p = nullptr; + +### 悬空指针 +悬空指针就是将这个指针指向的内存已经释放了,却没有对指针进行赋空,因为C++并没有垃圾回收机制,你delete了一个指针只是释放了指针指向的内存空间,而指针本身依旧还在,正确的操作是delete一个指针后立马将指针赋值为nullptr + +### 空指针 +就是指向NULL的指针,但是不保证一定是空,因为NULL本质就是0,我依旧可以用*p来访问地址为0的区域啊,虽然这是会被编译器禁止的。 \ No newline at end of file diff --git a/C++/面试/15.构造函数.md b/C++/面试/15.构造函数和析构函数.md similarity index 55% rename from C++/面试/15.构造函数.md rename to C++/面试/15.构造函数和析构函数.md index 3c60151f..ef7a5e90 100644 --- a/C++/面试/15.构造函数.md +++ b/C++/面试/15.构造函数和析构函数.md @@ -1,10 +1,8 @@ +# 类的构造函数 +> 与类同名的,没有返回值的函数,用来创建、赋值、移动、销毁该类的对象。 -## 2 类的构造函数 - -与类同名的,没有返回值的函数,用来创建、管理该类。 - -### 合成构造函数 +## 合成构造函数 编译器自动生成的一系列构造函数。包括以下几种 * 合成默认构造函数 @@ -12,18 +10,19 @@ * 合成拷贝构造函数 * 即是用户定义了其他类型的构造函数,编译器还会自动生成合成拷贝构造函数。 * 合成析构函数 + * 系统自动生成的析构函数。 -### 默认构造函数 +## 默认构造函数 无参构造函数。 -### 拷贝构造函数 +## 拷贝构造函数 -唯一参数是当前类类型。 +唯一参数是当前类类型,或者当前类型的const引用。 -### 移动构造函数 +## 移动构造函数 -### 委托构造函数 +## 委托构造函数 使用已有的构造函数初始化。 diff --git a/C++/面试/16.多态的三种实现方式.md b/C++/面试/16.多态的三种实现方式.md new file mode 100644 index 00000000..ffd01347 --- /dev/null +++ b/C++/面试/16.多态的三种实现方式.md @@ -0,0 +1,80 @@ +# 多态的三种方式 + +## 0 概述 +### 定义 + +多态的定义简单来说就是使一条语句有多种状态。 + +### 实现方式 + +多态的实现方式分为三块:重载、重写、重定义。下面我们来谈一谈他们各自的实现方式和实现原理。 + +## 1 重载 +### 实现方式 + +* 重载是在同一作用域内(不管是模块内还是类内,只要是在同一作用域内),具有相同函数名,不同的形参个数或者形参类型。返回值可以相同也可以不同(在函数名、形参个数、形参类型都相同而返回值类型不同的情况下无法构成重载,编译器报错。这个道理很简单,在函数调用的时候是不看返回值类型的)。 + +### 实现原理 + +* 重载是一种静态多态,即在编译的时候确定的。C++实现重载的方式是跟编译器有关,编译过后C++的函数名会发生改变,会带有形参个数、类型以及返回值类型的信息(虽然带有返回值类型但是返回值类型不能区分这个函数),所以编译器能够区分具有不同形参个数或者类型以及相同函数名的函数。 +* 插一句,在C语言中编译器编译过后函数名中不会带有形参个数以及类型的信息,因此C语言没有重载的特性。由此带来麻烦的一点是如果想要在C++中调用C语言的库,需要特殊的操作(extern “C”{})。库中的函数经过C编译器编译的话会生成不带有形参信息的函数名,而用C++的编译器编译过后会生成带有形参信息的函数名,因此将会找不到这个函数。extern “C”{}的作用是使在这个作用域中的语句用C编译器编译,这样就不会出错。这也是一种语言兼容性的问题。 + +## 2 重写 +### 实现方式 + +* 重写是在不同作用域内(一个在父类一个在子类),函数名、形参个数、形参类型、返回值类型都相同并且父类中带有virtual关键字(换言之子类中带不带virtual都没有关系)。 +* 有一种特殊的情况:函数返回值类型可以不同但是必须是指针或者引用,并且两个虚函数的返回值之间必须要构成父子类关系。这种情况称之为协变,也是一种重写。引入协变的好处是为了避免危险的类型转换。 + +### 实现原理 + +* 重写是一种动态多态,即在运行时确定的。C++实现重写的方式也跟编译器有关,编译器在实例化一个具有虚函数的类时会生成一个vptr指针(这就是为什么静态函数、友元函数不能声明为虚函数,因为它们不实例化也可以调用,而虚函数必须要实例化,这也是为什么构造函数不能声明为虚函数,因为你要调用虚函数必须得要有vptr指针,而构造函数此时还没有被调用,内存中还不存在vptr指针,逻辑上矛盾了)。 +* vptr指针在类的内存空间中占最低地址的四字节。vptr指针指向的空间称为虚函数表,vptr指针指向其表头,在虚函数表里面按声明顺序存放了虚函数的函数指针,如果在子类中重写了,在子类的内存空间中也会产生一个vptr指针,同时会把父类的虚函数表copy一下当做自己的,然后如果在子类中重新声明了虚函数,会按声明顺序接在父类的虚函数函数指针下。而子类中重写的虚函数则会替换掉虚函数表中原先父类的虚函数函数指针。 +* 重点来了,在调用虚函数时,不管调用他的是父类的指针、引用还是子类的指针、引用,他都不管,只看他所指向或者引用的对象的类型(这也称为**动态联编**),如果是父类的对象,那就调用父类里面的vptr指针然后找到相应的虚函数,如果是子类的对象,那就调用子类里面的vptr指针然后找到相应的虚函数。 +* 当然这样子的过程相比静态多态而言,时间和空间上的开销都多了(这也是为什么内联函数为什么不能声明为虚函数,因为这和内联函数加快执行速度的初衷相矛盾)。 + +## 3 重定义 +### 实现方式 + +* 重定义是在不同作用域内的(一个在父类一个在子类),只要函数名相同,且不构成重写,均称之为重定义 + +### 实现原理 + +* 重定义的实现原理跟继承树中函数的寻找方式有关,他会从当前对象的类作用域内开始查找同名的函数,如果没有找到就一直向上查找直到基类为止。如果找到一个同名的函数就停止。这也就说明他不管函数的形参类型或者个数是不是一样,只要函数名一样,他就认为是找到了,如果这时候形参类型或者个数不一致,编译器就会报错。 +* 多重继承的查找,如果在同一层内出现一样的函数声明那么编译器会报错不知道调用哪一个函数,这类问题也叫钻石继承问题。钻石问题的解决方案可以通过虚继承来实现,这样就不会存在多个一样的函数声明。 + +``` + +class A{ +public: + int a; + A():a(10){}; + int real_ex(){ + return a; + } + virtual int virtual_ex(){ + return a; + } +}; + +class B:public A{ +public: + int b; + B():b(20){}; + int real_ex(){//重定义A的函数 + return b; + } + virtual int virtual_ex(){//重写A的函数 + return b; + } +}; +int main(){ + + // B test_b; + // A* test = &test_b; + A* test=new B(); + cout<real_ex()<virtual_ex()<`。 -1、算法 +### 1. 算法 函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使 用整型作为它的参数类性要高。而 C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL 就利用了这一点提 供了相当多的有用算法。它是在一个有效的框架中完成这些算法的——可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种 类中的其他类型。 @@ -644,7 +644,7 @@ STL 提供了大约 100 个实现算法的模版函数,比如算法 for_each 算法部分主要由头文件组 成。是所有 STL 头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上 都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。体积很 小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。中则定义了一些模板类, 用以声明函数对象。 -2、容器 +### 2. 容器 在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。 @@ -783,7 +783,7 @@ STL 提供了大约 100 个实现算法的模版函数,比如算法 for_each -3、迭代器 +3. 迭代器 迭代器从作用上来说是最基本的部分,可是理解起来比前两者都要费力一些。软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化, 这种简化在 STL 中就是用迭代器来完成的。概括来说,迭代器在 STL 中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎 STL 提供的所有算法都是通 过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。