C++小笔记
文章平均质量分 51
Kadima°
行至水穷处,坐看云起时
展开
-
15.继承
15.继承C++的三大特性:封装,继承,多态问题1:为什么要有继承?继承存在的必要性是什么?我们先来想一个场景:现在我们需要创建一个学校管理系统,系统中有老师,学生等等,我们首先会想到使用类来创建学生老师class CTeacher{public: CTheacher(){} ~CTheacher(){}private: char m_Name[255]; int m_Gender; int m_TeaID;//老师的工号};class CStudent{publi原创 2021-02-21 18:13:29 · 89 阅读 · 0 评论 -
14.new与delete
14.new与delete1.前言在C语言中,我们写程序是总是会有动态开辟内存的需求,每到这个时候我们就会想到用malloc/free去堆空间中动态申请出来一段内存给我们用。但是对这一块申请出来的内存,往往我们还需要对它进行稍许的“加工”后(即初始化)才能为我们所用。虽然C语言中为我们提供了calloc来开辟这样一段初始化好的(初始化为0)的内存,但是面对使用类创建的对象中各式各样的数据成员的初始化,calloc同样也束手无策。但是,为了保持良好的编程习惯,我们应该对申请出来的内存进行手动初始化。那么原创 2021-02-21 12:15:12 · 97 阅读 · 0 评论 -
13.拷贝构造函数
13.拷贝构造函数1.拷贝构造函数的作用:本质上拷贝构造函也是一种构造函数2.拷贝构造函数的调用时机:与普通的构造函数不同的是,当用一个对象创建另一个对象时才调用拷贝构造函数3.缺省拷贝构造函数的作用:如果我们自己没有书写拷贝构造函数,默认情况下系统会创建默认拷贝构造函数,默认的拷贝构造函数就是完全将对象1拷贝给对象2,以memcpy的形式4.如何自己创建拷贝构造函数//前面已有CStudent的构造函数class CStudent{ CStudent(){};//构造函数 //拷贝构原创 2021-02-21 09:23:06 · 200 阅读 · 0 评论 -
12.构造函数与析构函数
12.构造函数与析构函数1.构造函数构造函数的作用:用于对象的初始化构造函数的语法:(1) 函数名是类名(2) 构造函数没有返回值类型(3) 构造函数中可以有多个形参,也可以没有形参...原创 2021-02-16 14:30:21 · 218 阅读 · 0 评论 -
11.this指针
11.this指针class CClock{ int m_Hour; int m_Minute; int m_Second; void getHour(){}; void setHour(){};}问题1:上面的类CClock占多少个字节?答案1:通过sizeof(CClock)可以知道CClock占用12个字节思考1:类的大小仅仅是数据成员的大小吗?类中的成员函数为什么不占用内存?CClock clock1;CClock clock2;clock1.getHour()原创 2021-02-16 11:11:16 · 99 阅读 · 0 评论 -
函数指针及其定义和用法
函数指针及其定义和用法1.什么是函数指针如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。那么这个指针变量怎么定义呢?虽然同样是指向一个地址,但指向函数的指针变量同我们之前讲的指向变量的指针变量的定义方式是不同的。例如: int(*p)(int, int);这个语句就定义了一个指向函数的指针变量 p原创 2021-02-16 11:10:13 · 3230 阅读 · 2 评论 -
10.类
10.类1.面向对象编程语言的三大特性封装继承多态2.类类 = 属性(数据) + 行为(函数)C语言中没有类的概念,但是可以通过结构体进行封装,但结构体中只能实现属性,并不能实现行为struct student{ int nScore; int nClass; int nSex;}//c语言中可以实现属性的封装student s1;s1.nSex;C++中对此作了改进,C++中可以使用结构体或者类实现属性和行为的封装struct student{ int原创 2021-02-15 23:24:25 · 126 阅读 · 0 评论 -
c++中->和.两种访问方式的区别
c++中->和.两种访问方式的区别如果A是类的实例化对象或结构体,则使用A.B的形式进行成员访问如果A是指向类、结构体或联合体的指针,则使用A->B的形式进行成员访问class student{ public: int a;}两种访问方式student x;student *p = x;//通过指针形式访问student类的成员p->a;//但是如果对指针进行解引用,就是该类的实例化对象,就可以通过下面方式进行访问*p.a;//如果是直接对类,结构原创 2021-02-15 17:54:55 · 638 阅读 · 2 评论 -
c++中函数的调用方式
c++中函数的调用方式编译器一般使用堆栈来实现函数调用。当一个函数被调用时,(进程内核对象为其在进程的地址空间的堆栈部分)分配一定的栈内存给函数使用,函数堆栈用于:1.在进入函数前,保存“返回地址”和环境变量。返回地址是指该函数结束后,从进入该函数之前的哪个地址继续执行下去。2.在进入函数之后,保存局部变量等。在Win32下有一下4中调用:1._cdecl:它是c/c++默认的调用方式。实参是以参数列表从右至左入栈,函数栈有调用方释放。主要用在哪些带有可变参数的函数上。2._stdcall原创 2021-02-15 16:43:58 · 5867 阅读 · 1 评论 -
09.函数重载
09.函数重载1.为什么需要函数重载当我们需要同一个功能函数实现不同类型或者不同参数个数情况下,都可以调用该函数时就需要函数重载所谓的函数重载就是多个函数使用相同的函数名int getMax(int a, int b){ return a > b ? a : b;}float getMax(float a, float b){ return a > b ? a : b;}int c1 = getMax(1,2);float c2 = getMax(1.0f,2.0原创 2021-02-15 16:36:22 · 94 阅读 · 0 评论 -
08.命名空间
08.命名空间1. 命名空间的作用命名空间是一种作用域的划分,通常用于区分项目中的模块或组件2.命名空间的使用1.命名空间namespace可以分开使用namespace abc { int nWidth = 5;}namespace abc{ int nHeight = 6;}2.命名空间可以嵌套namespace abc{ int a = 2; namespace def { int b = 3; }}abc::a = 4;abc::def:原创 2021-02-15 15:40:16 · 133 阅读 · 0 评论 -
07.作用域与数据隐藏
07.作用域与数据隐藏1.作用域有哪些?(1)全局作用域 命名空间作用域(2)局部作用域 块作用域(3)类作用域int n = 1;//全局作用域int main(){ int n = 2;//局部作用域 { int n = 3;//块作用域 }}2.数据隐藏(1)我们可以在不同的作用域定义多个相同名字的变量,但是不同作用域下会存在内部作用域对外部作用域的数据隐藏(2)当内部作用域的变量没有定义时,会向其上一级的外部作用域寻找,如果没有找到就再上一级(3)同原创 2021-02-15 14:57:21 · 209 阅读 · 0 评论 -
06.引用
06.引用1.值传递与地址传递值传递因为生存周期只在函数体内部,在函数体内部进行的任何操作都不会影响函数体外部的值地址传递一般可以通过指针和引用的方式,在函数体内部进行的操作会改变函数体外部的值2.指针和引用的对比//使用指针实现地址传递void foo(int* pN){ if(pN == nullptr { return; } *pN = 8;}//使用引用实现地址传递void fooRef(int& n){ n = 8;}int main(){原创 2021-02-15 14:26:29 · 236 阅读 · 0 评论 -
05.内联函数
05.内联函数内联函数的作用函数的作用是对会重复多次使用的代码段进行封装,而内联函数的作用是将函数体较为简单的代码片段通过内联的方式直接放在函数调用的位置,使用内联函数的目的是为了减少调用较为简单的函数时,因为进出函数而造成较大的开销因为函数体和功能较为简单的函数,实际调用函数过程中进出函数的开销远大于实际使用函数体功能,因此通过内联的方式减少开销内联函数和使用宏定义实现代码替换的对比内联函数的作用实际上与宏定义的替换非常类似,但是宏定义的替换因为直接是文本替换可能会造成一些错误#def原创 2021-02-15 11:33:50 · 91 阅读 · 0 评论 -
04.函数默认参数
04.函数默认参数函数默认参数与通过宏定义实现函数默认参数的对比//通过宏定义实现函数默认参数#define TESTFOO(m,n,k) TestFoo(m,n,k,1,2,3)int TestFoo(int n1, int n2, int n3, int n4, int n5, int n6){ return 0;}int main(){ TESTFOO(1,2,3); return 0;}//通过函数本身实现默认参数int TestFoo(int n1, int n2原创 2021-02-15 10:33:46 · 362 阅读 · 0 评论 -
03.const指针
03.const指针const与指针共有3中组合const TYPE* / TYPE const* 表示不能修改指针指向的内容,指针本身可以修改TYPE* const表示该指针是一个常量,意味指针本身不能被修改,但是指针指向的内容可以被修改const TYPE* const表示指针指向的内容及指针本身都不可以被修改const char* p1 = "Hello World!";char const* p2 = "Hello World!";char* const p3 = "Hello原创 2021-02-15 09:28:32 · 101 阅读 · 0 评论 -
02.const常量限制
02.const常量限制c语言中常量一般通过宏定义使用:# define PI 3.14但是宏定义实际上是字符的替换,宏定义的缺点是没有指明所定义常量类型c++中使用const关键字来定义常量const int PI = 3.14;const关键字用于修饰变量,将变量变为常量常量一旦定义就没有办法进行修改,因此在使用const进行修饰变量时一定要给变量赋值const关键字修饰的变量不能修改是指在程序的编译过程中不能修改,但是在程序运行过程中仍然可以通过修改地址的方式进行修改原创 2021-02-14 22:29:44 · 205 阅读 · 0 评论 -
01.bool类型
01.bool类型c语言中没有bool类型,bool类型是c++中的新类型c语言中一般使用int表示布尔类型:typedef int BOOLbool类型只有真和假,bool类型占1个字节,BOOL类型占4个字节bool类型本身就是一个条件表达式,使用中一定不要出现bool bRet = (4 > 2);if(bRet == true)或者while(bRet == true)或者for(;bRet == true;)bool类型本身就可以作为条件表达式进行判断..原创 2021-02-14 21:59:04 · 3313 阅读 · 0 评论 -
【经典逆向思维】二进制转十进制从高位向低位转化
【经典逆向思维】二进制转十进制从高位向低位转化问题来源:leetcode给出的答案:class Solution {public: int getDecimalValue(ListNode* head) { ListNode* cur = head; int ans = 0; while (cur != nullptr) { ans = ans * 2 + cur->val; cur =原创 2020-12-20 09:42:22 · 1192 阅读 · 2 评论 -
C++小笔记——srand(time(null))函数
C++小笔记——srand(time(null))函数背景介绍在C/C++中,rand函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,它是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系数,但这不是真正的随机数,当计算机正常开机后,这个种子的值便是固定的,除非重新启动系统,否则这个数的值并不会发生改变。因此,为了解决伪随机数的问题,C/C++提供了srand()函数,它的函数原型是 void srand( int a)。可以用来改变这个种子的值。进入正题sra原创 2020-09-27 17:04:09 · 5679 阅读 · 0 评论