C++
别忘了坚持
这个作者很懒,什么都没留下…
展开
-
C++抽象类
1.纯虚函数形式:virtual 函数原型=0;定义:在定义一个表达抽象概念的基类时,有时无法给出某些函数的具体实现方法,就可以将这些函数声明为纯虚函数。特点:无具体实现方法。2.抽象类定义:声明了纯虚函数的类,都成为抽象类。主要特点:抽象类只能作为基类来派生新类,不能声明抽象类的对象。(既然都是一个抽象概念了,纯虚函数没有具体实现方法,故不能创造该类的实际的对象)但是可以声明指向抽象类的指针变量或引用变量,通过指针或引用,就可以指向并访问派生类对象,进而访问派生类的成员。(体现了多态性)作原创 2020-10-26 19:27:14 · 582 阅读 · 0 评论 -
C++ VPTR指针的分步初始化
对象中的vptr指针什么时候被初始化对象在创建时,由编译器对vptr指针进行初始化只有在对象的构造完全结束时,vptr指针的指向才最终确定父类的vptr指针指向父类的虚函数表子类的vptr指针指向子类的虚函数表#include<iostream>using namespace std; class parent{public: parent() { cout << "parent()"<< endl; printf(); } virt转载 2020-10-26 15:58:46 · 288 阅读 · 0 评论 -
C++重载、重写、重定义
一、重载(overload)指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。(1)相同的范围(在同一个作用域中) ;(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。(5)返回值可以不同;二、重写(也称为覆盖 override)是指派生类重新定义基类的虚函数,特征是:(1)不在同一个作用域(分别位于派生类与基类) ;(2)函数名字相同;(3)参数相同;(4)基类函数必须有 virtual 关键字,不能有 static 。(5)返转载 2020-10-26 11:14:32 · 463 阅读 · 0 评论 -
C++多态的实现原理
一、多态的概念 多态就是多种形态,C++的多态分为静态多态与动态多态。静态多态就是重载,因为在编译期决议确定,所以称为静态多态。在编译时就可以确定函数地址。动态多态就是通过继承重写基类的虚函数实现的多态,因为实在运行时决议确定,所以称为动态多态。运行时在虚函数表中寻找调用函数的地址。 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是子类,就调用子类的函数;如果对象类型是父类,就调用父类的函数,(即指向父类调父类,指向子转载 2020-10-27 08:57:12 · 1608 阅读 · 0 评论 -
C++继承(多继承)之菱形继承与虚函数
一、单继承&多继承&菱形继承单继承与多继承单继承:一个子类只有一个直接父类时称这个继承关系为单继承多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承菱形继承菱形继承引发的问题:数据冗余例:B、C中的_a都是来自于A,其实两个_a是同一个,但是因为B、C各自继承,产生了两份,造成了数据冗余二义性例:由于D继承于B、C,B、C继承于A,所以D中的_a不知道是来自B还是来自C,于是产生了二义性。二、虚继承-------解决菱形继承的数据冗余与二义性将B和C的继承转载 2020-10-24 15:52:24 · 346 阅读 · 0 评论 -
C++继承和派生
一、概念1.public、protected、private,三个关键字分别修饰变量的权限: public: 修饰的成员变量 方法 在类的内部 类的外部都能使用 protected: 修饰的成员变量方法,在类的内部使用 ,在继承的子类内部中可用 ;其他 类的外部不能被使用。 private: 修饰的成员变量方法 只能在类的内部使用 不能在类的外部2.不同的继承方式会改变继承成员的访问属性1)C++中的继承方式会影响子类的对外访问属性 public继承方式: 父类成员在子类中原创 2020-10-23 14:29:54 · 348 阅读 · 0 评论 -
C++ Mystring类(构造、析构和重载)
功能实现:<基本功能>1> 实现头文件的封装:MyString.h2> 缺省构造函数对字符串的初始化( MyString() )3> 使用构造函数初始化字符串的另外两种方式 * 2( 动态指针+拷贝构造函数 )4> 析构函数( 释放动态申请的字符串空间 )5> 重载输出运算符( << )6> 重载赋值运算符 * 2( = )7> 重载下标运算符( [],索引输出 )<拓展功能>1> 字符转载 2020-10-23 10:08:35 · 1673 阅读 · 0 评论 -
C++运算符重载(类内、外重载)
1.概念 运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能。这个函数叫做运算符重载函数(常为类的成员函数)。2.运算符重载的基本格式 返回值类型 类名::operator重载的运算符(参数表) { …… } operator是关键字,它与重载的运算符一起构成函数名。3.运算符重载的两种方法1.类内重载#include <iostream>using namespa转载 2020-10-27 08:59:23 · 52118 阅读 · 9 评论 -
C++ 友元类和友元函数
1.作用我们知道类的私有属性只能在类的内部访问, 能不能通过一种途径可以在类的外部访问? 答案是有的,友元函数。2.友元函数a. 友元函数的作用: 可以在类的外部访问类的私有属性,但是会破坏类的封装。b. 友元函数的格式: friend 函数返回类型 函数名(参数列表)。c. 友元函数声明的位置和类访问修饰符无关。//对象的成员必须初始化class Test{ //声明,该函数是Test的友元函数,可以在类的外部访问类的私有成员 friend void func(Test&a转载 2020-10-22 09:35:30 · 289 阅读 · 0 评论 -
C++面向对象的转变 + this指针
1)C++类对象中的成员变量和成员函数是分开存储的成员变量:普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式静态成员变量:存储于全局数据区中成员函数:存储于代码段中。问题出来了:很多对象共用一块代码?代码是如何区分具体对象的?换句话说:int getK() const { return k; },代码是如何区分,具体obj1、obj2、obj3对象的k值?看下图对于普通成员函数,C++编译器做了一层封装,比如Test类的构造函数,其中虽然只写了一个参数i,但实际转载 2020-09-21 19:23:09 · 273 阅读 · 0 评论 -
C++类的静态成员变量和静态成员函数
1.静态成员变量1)普通成员变量 通过对象名能够访问public成员变量 每个对象的普通成员变量都是专属的,不能在对象之间共享2)静态成员变量 静态成员变量属于整个类所有,所有对象共享类的静态成员变量 静态成员变量的生命周期不依赖于任何对象 可以通过类名和对象名访问public静态成员变量3)静态成员变量的定义 静态成员变量在类的内部声明,声明时直接通过static关键字修饰 静态成员变量在类的外部定义与初始化,语法规则为Type ClassName::VarName = value;原创 2020-09-21 18:28:27 · 417 阅读 · 0 评论 -
C++new和delete(内存申请和释放内存)
大纲(复习)1.介绍1.malloc,free和new,delete区别。 a.malloc,free是C/C++的标准库函数。new,delete是c++的操作符。 b.malloc申请的是内存,严格意义不是“对象”,new申请的可以理解为“对象”,new 时会调用构造函数,返回指向该对象的指针。 c.对于class类型,必须用new/delete来创建和销毁,自动调用构造和析构函数,malloc/free无法胜任。2.使用new遵循原则: a.用new申请的内存,必须用delete释放。转载 2020-09-21 16:23:24 · 1610 阅读 · 0 评论 -
C++匿名对象
c++中的匿名对象大纲1)什么是匿名对象(也称临时对象)2)产生匿名对象的三种情况1.产生匿名对象的三种情况: 1)以值的方式给函数传参; Cat(); —> 生成了一个匿名对象,执行完Cat( )代码后,此匿名对象就此消失。这就是匿名对象的生命周期。 Cat cc = Cat(); —>首先生成了一个匿名对象,然后将此匿名对象变为了cc对象,其生命周期就变成了cc对象的生命周期。 2)类型转换; 3)函数需要返回一个对象时;return temp;2.匿名对象原创 2020-09-21 11:57:51 · 18176 阅读 · 5 评论 -
C++对象的构造和析构函数(初始化、清理、深浅拷贝、初始化列表)
1.构造函数为什么需要构造函数? 注意:类的数据成员是不能在声明类时初始化的。 而创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。 为了解决这个问题,C++编译器提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。1.构造函数定义 1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数; 2)构造函数在定义时可以有参数; 3)没有任何返回类原创 2020-09-21 11:03:56 · 706 阅读 · 1 评论 -
C++类的声明和类的实现分开写(.hpp和.cpp)
1.声明和实现为什么要分开写现在开始写项目了,你会发现我们一般都要写一个cpp,对应的还得有一个h文件,那么为什么在C++中我们要这么做?.h就是声明,.cpp就是实现,而所谓分离式实现就是指“声明”和“定义”分别保存在不同的文件中,声明保存在.h文件、定义保存在.cpp文件中。那么将声明和定义分离有什么意义吗?首先从非分离式(声明的同时给出定义)看,其内容一般保存在.h文件中,以供多个源文件引用。但是将定义放在头文件,那么当多个源文件使用#include命令包含此类的头文件便会在链接阶段出现“m转载 2020-09-12 09:33:49 · 19782 阅读 · 0 评论 -
C++类与封装的概念(属性变量和行为函数,使用方法和内部细节)
C++类与封装的概念这节我们来学习类与封装的概念,我们知道,一般电脑都是由CPU、内存、主板、硬盘等部件组合组成,但是我们组装电脑的时候,仅仅是把硬盘、内存、CPU、主板等这些部件的接口相互连接起来就行,我们不会去关注硬盘、CPU、主板等他们的内部是怎么实现的,组装电脑并不需要去了解学习硬盘的设计、主板的设计,直接用他们的接口就行,这就是封装一个生活中的例子。在C++中,类封装通常分为下边两个部分-类的实现细节-类的使用方式在我们使用别人提供的类时,我们只关心使用方式,至于类内部是怎么实现,不需要转载 2020-09-11 15:49:09 · 790 阅读 · 1 评论 -
C++函数重载(名字相同,参数类型、个数、顺序不一样)
大纲:1.函数重载我们在平时写代码中会用到几个函数但是他们的实现功能相同,但是有些细节却不同。例如:交换两个数的值其中包括(int, float,char,double)这些个类型。在C语言中我们是利用不同的函数名来加以区分。void Swap1(int* a, int* b);void Swap2(float* a, float* b);void Swap3(char* a, char* b);void Swap4(double* a, double* b);我们可以看出这样的代码不美观而转载 2020-09-11 15:37:03 · 19573 阅读 · 0 评论 -
C++const用法的总结
1.const关键字常类型是指,使用const修饰的类型,常类型的变量或对象的值是不能被更新的。 在定义的时候就要初始化初值,如:const int b = 10;1)指针所指向的内存空间,不能被修改int operatorTeacher01(const Teacher *pT){ //pT->age = 10; return 0;}2)指针变量本身不能被修改int operatorTeacher02( Teacher * const pT){ pT->age = 1原创 2020-09-22 14:36:17 · 127 阅读 · 0 评论 -
C++引用(已定义变量的别名)
大纲1 引用的概念1.引用可以看作一个已定义变量的别名2. 属于C++编译器对C的扩展,不能用c语言的语法去思考它2.引用的使用引用的语法:Type& name = var;(普通引用 必须要初始化)void main91(){ int a = 10; int &b = a; b = 100; //相当于把a修改成100了. printf("b:%d \n", b); printf("a:%d \n", a); a = 200; printf("b:%d原创 2020-09-21 13:53:07 · 2520 阅读 · 0 评论 -
C++基础一
/************************************************命名空间**********************************************************************///1 定义命名空间 namespace name { … }namespace namespaceA{ int a = 10;}namespace namespaceB{ int a = 20; namespace name.原创 2020-05-29 15:11:03 · 163 阅读 · 0 评论