自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 虚析构和纯虚析构函数

多态时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码,则导致内存泄漏。解决方式:将父类中的析构函数改为虚析构或者纯虚析构虚析构和纯虚析构共性:1,可以解决父类指针释放子类对象2,都需要有具体的函数实现虚析构和纯虚析构区别:如果时纯虚析构,则该类属于抽象类,无法实例化对象虚析构语法:virtual ~类名() { … }纯虚析构语法:virtual ~类名() = 0;类名:: ~类名() { …}#include <iostream

2020-12-08 18:21:46 870

原创 纯虚函数和抽象类

在多态中,通常父类中的虚函数的实现是毫无意义的,主要都是调用子类中重写的内容,因此,可以将虚函数改写为纯虚函数。纯虚函数语法:virtual 返回值类型 函数名 (参数列表) = 0;当类中有了纯虚函数:这个类也称为**抽象类 **抽象类特点:1,无法实例化对象2,子类必须重写抽象类中的虚函数,否则子类也属于抽象类#include <iostream>#include <string>using namespace std;class VirtualBas

2020-12-08 16:19:41 157

原创 多态-基本语法

多态分类:静态多态 和 动态多态。静态多态: 函数重载,运算符重载均属于静态多态,即复用函数名。动态多态:由派生类重写基类方法,然后用基类引用(指针)指向派生类对象来确定具体该调用哪一个类的虚函数,调用方法时,会进行动态绑定,这就是动态多态。静态多态和动态多态的区别:静态多态的函数地址时早绑定,编译阶段就已经确定函数地址。动态多态的函数地址是晚绑定,运行阶段确定函数地址。动态多态满足条件:1,有继承关系2,子类需要重写父类的虚函数,使用virtual定义虚函数#include &lt

2020-12-08 09:40:46 161

原创 const修饰成员函数和对象

常函数成员函数后加const,称这个函数为常函数。常函数特性:1,常函数内不可修改成员属性。2,成员属性声明加关键字mutable后,在常函数中依然可以修改。常对象声明时,在对象前加const,称该对象为常对象。常对象特性: 常对象只能调用常函数。#include <iostream>#include <string>using namespace std;class Person{public: //this指针本质,是指针常量,指针的指向不可修

2020-12-07 11:51:48 244

原创 对象特性-this指针

如成员变量和成员函数内存分配所述,成员变量和成员函数分开存储,每一个非静态成员函数的实例只有一份,则多个同类型的对象都会访问同一份成员函数代码。问题来了,这份成员函数代码如何区分是哪一个对象访问呢?解决方法:C++编译器通过提供特殊对象指针,this指针;this指针指向被调用的成员函数所属的对象。this指针特性:1,this指针是隐含每一个非静态成员函数内的一种指针。2,this指针不需要定义,直接使用即可。this指针用途1,形参与成员函数变量名一样时,可通过this指针区分2,在类的

2020-12-07 10:45:31 114

原创 成员变量和成员函数内存分配

在C++中,成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上。非静态成员函数,静态成员函数,静态成员变量占用的内存均不占用类的对象空间上。示例1#include <iostream>#include <string>using namespace std;class Person{public: void func1(){} //非静态成员函数 不属于类的对象上 static void func2(){} //静态成员函数 不属于类的对象上

2020-12-04 16:22:16 247

原创 对象特性-静态成员

静态成员静态成员就是在成员变量和成员函数前加上关键字static ,分为:静态成员变量和静态成员函数。静态成员变量:所有对象共享同一份数据编译阶段分配内存类内声明,类外初始化静态成员函数所有对象共享同一函数静态成员函数只能访问静态成员变量...

2020-12-04 15:01:41 324

原创 对象特性-深拷贝与浅拷贝

深拷贝与浅拷贝浅拷贝:使用编译器默认提供的拷贝构造函数,进行简单的值拷贝。深拷贝:在堆区重新申请空间,进行拷贝工作。在编程中,有时在类中定义指针,需要为指针在堆区开辟内存,这时候需要重写拷贝构造函数,并在拷贝构造函数中为该指针重新在开辟内存。否则,如果使用编译器提供的默认拷贝构造函数,只是进行了浅拷贝,所有对象的指针都指向同一地址;导致所有实例化对象在释放内存时,都释放同一指针,即多次释放堆区内存,程序崩溃。示例1使用默认拷贝构造函数,进行浅拷贝,重复释放指针 *m_height ,导致程

2020-12-04 14:37:26 60

原创 构造函数生成与调用规则

构造函数生成规则默认情况下,C++编译器至少给一个类添加3个函数:1、默认构造函数 (无参,函数体为空)2、默认析构函数 (无参,函数体为空)3、默认拷贝构造函数,对属性进行拷贝编译器生成构造函数规则1、如果用户定义有参构造函数,C++编译器不在提供无参构造函数,但会提供默认拷贝构造2、如果用户定义拷贝构造函数,C++编译器不在提供其他构造函数#include <iostream>#include <string>using namespace std;cla

2020-12-03 23:29:49 186

原创 类与对象特性-构造函数分类与调用

构造函数分类按参数分为:有参和无参构造按类型分为:普通构造和拷贝构造调用方式调用方式有三种:括号法,显示法,隐式转换法。#include <iostream>#include <string>using namespace std;class person{public: person() //无参构造函数 { cout << "Person的无参构造函数" << endl; } person(int a) //有参构造函数

2020-12-02 22:57:01 97

原创 友元函数&友元类&友元成员函数

友元函数有些情况下,全局函数需要访问类中的私有成员,这种函数叫友元函数;如:客人可以访问客厅,但一般客人不可以去主人卧室,关系较好的朋友才能访问私有的卧室,这时就要用到友元,友元的关键字为friend示例#include <iostream>#include <string>using namespace std;/*********1、函数做友元**********/class Building{ //友元函数声明 friend void func(Buil

2020-11-23 22:26:11 324

原创 类对象作为类成员

类对象作为类成员1、含义在C语言中,一个结构体可以包含另外一个结构体。在C++中一个类的成员,也可以是另一个类的对象。例如:B类中有对象a作为成员,称a为对象成员。class A {};class B{ int i; A a;};2、构造函数和析构函数生成顺序?当其他类的对象作为本类成员,先生成对象成员的类的构造函数,再生成本类的构造函数;析构函数生成顺序和构造函数生成顺序相反。3、示例#include <iostream>#include <string&g

2020-11-22 01:40:16 677

原创 函数重载

函数重载在C++中,同一个函数名称可多次定义,即函数重载。函数重载主要作用是提高代码复用性。1、函数重载满足条件同一作用域下函数名称相同函数参数类型不同 或者个数不同或者顺序不同注意:返回值不能作为函数重载的条件2、示例#include <iostream>#include <string>using namespace std;void func(){ cout << "func 的调用" << endl;}void

2020-11-18 22:15:40 239

原创 C++引用

C++引用1、引用的本质与作用本质:是一个指针常量作用:给变量取一个别名,可通过操作别名操作变量2、注意事项(1)、不要返回局部变量的引用(2)、引用的指向不可改变(3)、如果函数返回值是引用,可作为左值3、示例int a = 10;int &b = a;cout << "a = " << a << endl;cout << "b = " << b << endl; b = 200; //通过引

2020-11-18 17:55:43 73

原创 C++中new关键字

new操作符1、作用在堆区开辟内存,由程序员手动开辟和释放;返回该数据的指针。2、内存的分配与释放分配:指针变量 = new 类型名 (初始化式);int *p = new int(10); //创建一个元素int *arr = new int[10]; //创建数组释放:delete 指针名;delete p1; //释放堆区一个数据delete[] arr; //释放堆区一个数组3、示例//例1int *p = new int(10);cout << *p

2020-11-18 10:51:42 381 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除