04 2022 档案
摘要:使用new的意义是申请堆空间(heap)中的内存。heap比起栈空间(stack)的优势在于容量巨大,通常一个程序的stack空间的大小都只有2m左右,具体数值取决于编译器。使用heap需要手动释放内存,但是随时可以释放,使用stack必须等到生命周期结束才会释放内存。对于生命周期短且占用空间小的变
阅读全文
摘要:char ch; ifs >> ch ifs.eof() 用来判断文件是否为空,如果为1,那就是空的,思路就是先只读一个字符,然后判断这个字符是不是EOF,如果为空那就是空文件
阅读全文
摘要:worker** = new worker*【5】 意思是保存指针的数组的首地址,用这个**来维护保存指针的数组 如果数组超了,那就开辟一的新的堆区,注意开辟新堆区的时候要销毁旧的堆区,删除旧的堆区的时候,堆区变量的类型不变,只是指向的地址并不是堆区了。 注意堆区一定要用后删除,而且这种时候要先把堆
阅读全文
摘要:exit()函数本身表示退出程序。 其中: exit(0):表示正常退出 exit(1):表示出错(或非正常)退出。当然,exit()的参数可以不只是1,也可以是其他整型数,如2,3等,作为标识
阅读全文
摘要:#pragma onc写在头文件开始,用于防止重复加载头文件
阅读全文
摘要:使用的时候打开方式要指定ios::binary 二进制方式写文件主要利用流对象调用成员函数write函数原型 :ostream& write(const char * buffer,int len);参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数 ofstream o ;
阅读全文
摘要:c++的文件处理也是看为一个对象,使用文件流的类,使用头文件<fstream>,处理的时候有文本文件和二进制文件之分,主要的区别就是存储的形式 操作文件有三个大类,ofstream,写文件,ifstream,读文件,fstream,读写文件 使用时首先要用这三个大类来创建流对象,然后使用open打开
阅读全文
摘要:主要是为了解决多态使用时子类有属性开辟到堆区的问题 解决方式:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性:可以解决父类指针释放子类对象都需要有具体的函数实现虚析构和纯虚析构区别:如果是纯虚析构,该类属于抽象类,无法实例化对象 虚析构语法:virtual ~类名(){}纯虚析构语法
阅读全文
摘要:在多态中,父类的虚函数实际上没啥用,主要在使用子类中自己重写的函数 所以这个虚函数可以直接写成纯虚函数 virtual 返回值类型 函数名 (参数列表) = 0 如果类中有了纯虚函数,那就成了抽象类,抽象类无法实例化对象,且子类必须重写纯虚函数 因为如果实例化了对象,那么这个纯虚函数就会因为无法调用
阅读全文
摘要:在基类中使用虚函数的时候,空类占一个字节,空类中有虚函数有四个字节,也就是说明虚函数在空类中加入了一个指针对象 这个指针叫vfptr,virtual function ptr,虚函数表指针,指向的是虚函数表vftable,就像之前提的那样,这个虚函数表中保存的是当前这个虚函数的地址。 当从基类生成子
阅读全文
摘要:多态是C++面向对象三大特性之一多态分为两类静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别:静态多态的函数地址早绑定 - 编译阶段确定函数地址动态多态的函数地址晚绑定 - 运行阶段确定函数地址 比如 void DoSpea
阅读全文
摘要:两个派生类继承自同一个基类 又有某个类同时继承两个派生类 这种继承被称为菱形继承 这种继承会有一个问题,就是最后一个继承时,会将最开始的基类复制两次 所以在两个父类有相同数据的时候,要通过作用域进行区分 为了彻底解决这个问题,可以使用虚继承,在继承方式前加virtual。class person :
阅读全文
摘要:c++支持一个类支持多个类 class 子类:继承方式 父类,继承方式,父类 不过这样会导致重名等问题变得很麻烦,要在使用是指定参数所在定义域,所以一般不推荐使用
阅读全文
摘要:静态成员和非静态成员处理一致,静态成员类内声明,类外初始化,只有一个值,因为虽然同名,但是因为作用域不同,所以两者本质上并不相同。 可以通过对象访问,也可以通过类名的方式访问
阅读全文
摘要:同名成员属性的时候直接调用的是自身的数据,也就是this直接指向的数据 调用父类的数据要加作用域,同名的函数也与之类似,同时注意,只要子类中存在于父类中同名的成员函数,那么子类的同名成员会隐藏父类的所有同名成员,包括重载函数。因此,调用父类中同名的重载函数时,也需要加一个作用域 s.Base::m_
阅读全文
摘要:子类继承父类后,当初始化和销毁时,父类中的数据初始化和销毁会由父类的构造和析构函数进行 顺序是先构造父类成员,再构造子类成员,先销毁子类成员,再销毁父类成员
阅读全文
摘要:继承方式有公共继承,保护继承,私有继承,对应三种不同的权限 注意,基类中的私类不管什么权限都不可继承,继承的其他权限与继承方式取最严权限 简单说就是继承的方式无法决定继承的内容,只能决定继承过来后的权限 但是在继承的时候,子类会继承父类的静态成员外的所有数据,哪怕是私有数据也是一样,只不过继承后编译
阅读全文
摘要:继承是面向对象三大特性之一 子类继承父类代码,减少重复的代码 class persona :public person {} class 子类 :继承方式 父类 这样编译器在编译的时候就可以将person中public的部分展开到persona中,子类也可以叫派生类,父类也可以叫基类
阅读全文
摘要:c++编译器至少给一个类添加4个函数1. 默认构造函数(无参,函数体为空)2. 默认析构函数(无参,函数体为空)3. 默认拷贝构造函数,对属性进行值拷贝4. 赋值运算符 operator=, 对属性进行值拷贝 这个重载主要是为了防止有堆区的时候会有重复删除地址的问题,所以要有重载函数,进行深拷贝 跟
阅读全文
摘要:要注意递增递减运算符有前置和后置的问题,使用类内定义,在形参上使用给一个int站位符,编译器会把有占位符的定义为后置,前置运算正常进行,返回一个引用 后置运算要返回一个值,而不是引用,因为实际的值已经改变了,返回的值是一个改变前的,因为这个值是用局部变量保存的,所以不能返回引用,因为相同的原因,在调
阅读全文
摘要:因为cout在左边,所以<<重载一般只能用全局函数,同时输入person和输出流变量ostream,因为输出流变量ostream是一个全局只有一个的静态变量,所以必须要用引用的方式使用。同时为了实现链式编程,返回值依旧是ostream& 重载运算符配合友元可以实现自定义类型的输出 ostream&o
阅读全文
摘要:对已有运算符进行重新定义,赋予其另一种功能。 在类内创建函数,函数名为operator运算符,person operater+ (person &p),通过成员函数重载+ 在类外创建成员函数,作为+函数的一个重载版本 person operater+ (person &p1,person &p2)
阅读全文
摘要:友元的目的是让一个函数或者类访问另一个类中的私有成员,本质,是让其它不属于本类的成员(全局函数,其它类的成员函数),成为类的成员而具备了本类成员的属性。 友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字frien
阅读全文
摘要:常函数: void func() const成员函数后加const后我们称为这个函数为常函数常函数内不可以修改成员属性成员属性声明时加关键字mutable后,在常函数中依然可以修改 this指针的本质是一个指针常量person * const this,这个指针指向的位置是不可更改的,而在函数后加了
阅读全文
摘要:c++中的空指针也是可以调用成员函数的 但是只能调用成员函数和静态成员变量,因为这些成员不需要this'指针指向 其他的成员会隐式由this指向,而此时this = NULL,所以无法调用
阅读全文
摘要:c++会提供特殊的对象指针,this指针,指针指向被调用的成员函数所属的对象 this指针是隐含每一个非静态成员函数内的一种指针this指针不需要定义,直接使用即可 this指针的用途:当形参和成员变量同名时,可用this指针来区分,解决名声冲突在类的非静态成员函数中返回对象本身,可使用return
阅读全文
摘要:c++类中,成员变量和成员函数分开存储,只有非静态成员才属于类的对象中的,因为静态成员在一个对象之上,相当于总揽全局 如果用sizeof来计算类的大小,函数的大小是不计算在内的,只计算成员变量的 如果空类也有一个字节,为了区分不同的空对象所站的位置。 计算类大小的时候,静态变量同样不计算在内,因为静
阅读全文
摘要:静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员静态成员分为: 静态成员变量所有对象共享同一份数据在编译阶段分配内存类内声明,类外初始化静态成员函数所有对象共享同一个函数静态成员函数只能访问静态成员变量 要注意定义在main( )函数之前的全局对象、静态对象的构造函数在main
阅读全文
摘要:类中成员可以是另一个类对象 构造顺序构造在其中的类对象,在构造自身,析构函数顺序相反,线删除自身,再删除其中的对吸纳风格
阅读全文
摘要:构造函数():属性(值),属性(值),。。。{} 类中初始化函数的简化写法
阅读全文
摘要:浅拷贝,编译器提供的简单的复制拷贝操作 深拷贝,在堆区重新申请空间,进行拷贝 当有指针和堆区存在时浅拷贝可能会造成重复释放问题,这种时候要自己定义深拷贝函数防止出现错误 、/拷贝构造函数 Person(const Person& p) { //如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复
阅读全文
摘要:person(const person & p) {} 默认情况下,c++编译器至少给一个类添加3个函数1.默认构造函数(无参,函数体为空)2.默认析构函数(无参,函数体为空)3.默认拷贝构造函数,对属性进行值拷贝 构造函数调用规则如下:如果用户定义有参构造函数,c++不在提供默认无参构造,但是会提
阅读全文
摘要:两种分类方式:按参数分为: 有参构造和无参构造按类型分为: 普通构造和拷贝构造(const person &p)三种调用方式:括号法,通过()中的参数确定重载初始化函数调用哪一个,如果是默认构造函数的话不要加(),否则会被看为函数声明。显示法,显示说明变量的值,person p = person(p
阅读全文
摘要:c++类中的构造函数用来初始化对象,在创建对象和赋值是使用 析构函数用来清理对象,在对象销毁前使用 一般会有编译器自动调用,如果有特殊要求可以手动实现 构造函数语法:类名(){}1. 构造函数,没有返回值也不写void2. 函数名称与类名相同3. 构造函数可以有参数,因此可以发生重载4. 程序在调用
阅读全文
摘要:定义了头文件include“head.h”,也确实加载了,但是一直显示头文件中声明的函数未定义,因为我定义到另一个cpp文件中了,vscode没有自动连接两个cpp文件,要手动添加,或者在tasks.json里边加 cd "d:\desk\cpp\" ; if ($?) { g++ c++_1-16
阅读全文
摘要:1、VSCode代码缩进快捷键选中需要缩进的代码块,然后使用下面的快捷键:Ctrl + [ 和 Ctrl + ]可以实现代码的向左移动或者向右移动。2、VSCode代码对齐快捷键先选中需要代码对齐的代码块,然后使用下面的快捷键:Shift + Alt + F
阅读全文
摘要:在使用时,一般将成员属性设置为私有,以方便自己控制读写权限,通过public函数来进行
阅读全文
摘要:两者都可以用来定义类,唯一的不同就是默认权限不同 class默认是public,struct是private
阅读全文
摘要:public公共权限 protected 保护权限 private 私有权限 public成员类内可以访问,类外也可以访问 private,类内可以访问,类外不可以访问,在继承时,子类不可访问 protected,类内可以访问,类外不可以访问,在继承时,子类可以访问
阅读全文
摘要:#define和那两个都不一样,它属于宏,是预处理器的一部分。预处理是在编译之前的一道,简单地进行字符串替换。它不按照语言的语法,而是直观自己的语法。你#define里面写的东西会被简单粗暴地塞进去 1、static全局变量 与#define普通全局变量 有什么区别?全局变量(外部变量)的说明之前再
阅读全文
摘要:c++面向对象三大特性,封装,继承,多态 具有相同性质的对象,可以抽象为类 封装:将属性和行为作为一个整体,表示一个对象,并将其加以权限控制 设计类:class 类名 {访问权限:属性/行为} 类可以认为是结构体的一种超进化,相比于结构体有更多的特性
阅读全文
摘要:函数名相同的时候重载,可以提高复用性 主要通过不同类型,个数,顺序的函数参数来进行区分 函数返回值不可以作为重载 引用也可以作为函数重载条件 而当函数中有默认参数时,重载中默认参数也是默认加入的,没有优先级 底层的实现原理是使用重命名技术来区分参数不同的同名函数
阅读全文
摘要:函数默认参数 返回类型 函数名(函数变量 = 默认值){} 默认值可以修改,如果不传入则默认使用默认值,设置为默认值的变量右边必须全部都是默认值 如果函数声明有了默认参数,那么函数的实现就不能有默认参数,主要为了防止二义性 函数站位参数 函数形参列表中可以有站位参数,站位参数也可以有默认参数 返回值
阅读全文
摘要:主要用来修饰形参,防止误操作 const int&ref = 10合法 相当于int temp = 10; const int & ref = temp 单纯的引用是不能引用右值的 一般是在函数参数列表中,const int &a,主要是为了防止对引用的值进行了修改
阅读全文
摘要:c++引用的本质就是一个引用常量 int &ref=a;int * const ref = a,两者等价
阅读全文
摘要:左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量(或表达式) 通常来说有名字的变量就是左值,而由运算操作所产生的中间结果(没有名字)就是右值 对于基础类型,右值是不可被修改的(non-modifiable),也不可被 const, volati
阅读全文
摘要:返回值为值类型时。使用临时对象(temporary object)来保存函数的返回值。函数的返回值用于初始化调用点的一个临时对象,该临时对象就是函数调用的结果。其返回值为右值。不能作为左值。 返回值是引用类型时,其返回值即为return的变量,所以不需要临时对象保存其返回值。所以,对于返回值为引用类
阅读全文
摘要:将引用作为形参也可以直接改变实参 因为引用相当于对再次进行了一个变量名到变量地址的映射,这时使用的形参改变值的时候改变的也是真实实参地址中的值,当函数结束后,局部变量会销毁,但是因为引用生成变量代表的那快地址此时依旧有其他的变量名在占用,所以只会销毁形参的变量名,不会销毁地址中的值
阅读全文
摘要:引用:给变量取一个别名 数据类型 & 新名 = 原名,数据类型与原名一致。 这样新名与原名都对应到同一段地址中存放的数据,只不过有了两个名字,并不是拷贝操作 引用在使用时必须要进行初始化,并且初始化之后不可改变 可以定义数组引用,不能定义引用数组,可以定义指针数组 int a, b, c;int*
阅读全文
摘要:开辟数组 new 数据类型 【元素数】 返回一个连续空间的首地址 释放数组 delete【】 变量名
阅读全文
摘要:栈区,编译器运行程序中自动保存,自动释放 注意不要放回函数的局部变量的地址,因为函数结束后就自动的销毁了,所以此时这个局部变量得地址无用,形参也是一个局部变量,因为是拷贝过去的 堆区,程序员手动申请,手动释放 new用来申请内存 数据类型 *变量名 = new 数据类型 变量 return 变量名
阅读全文
摘要:static修饰静态变量 const修饰局部,全局常量 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间,直到程序执行完才释放,使用的时候沿用上一次的那个值 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; 在
阅读全文
摘要:代码区:存放所有代码的二进制 全局区,存放全局变量,静态变量,常量 栈区,编译器自动分配与释放,存放函数参数值和局部变量,随函数结束而释放 堆区,有程序员进行分配与释放,或者函数结束时自动释放 不同区域用于存放那个不同的数据,有不同的生命周期 在程序编写完,编译后,生成exe文件,这时已经出现两个区
阅读全文
摘要:c++中的rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。 一般性:rand() % (b-a+1)+ a ; 就表示 a~b 之间的一个随机整数 rand()的缺点:第一次运行这个程序产生的随机数,之后再运行程序的时候这个随机数不会变。为了每
阅读全文
摘要:数组本身并不支持拷贝和赋值,并且使用数组是通常将其转化成指针,在很多用到数组名字的地方,编译器都会自动地将其替换为一个指向数组首元素的指针 因为不能拷贝数组,所以我们无法以值传递的方式使用数组参数。因为数组会被转换成指针,所以当我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针 void
阅读全文
摘要:string a = “adgg” string b = “gjug” a+=b【0】 a中的值为adggg
阅读全文
摘要:正常使用时和普通const是一样的,const 结构体名 结构体变量,结构体变量中的数据无法更改
阅读全文
摘要:和正常的参数一样传递,值传递,值传递中地址传递。效果也和正常参数一样 记一下指针引用为a->age,不需要使用* 因为形参的传递与转换是在调用拷贝函数,结构体可以进行拷贝,所以可以传递
阅读全文
摘要:自定义的结构体放到数组中 struct 结构体名 数组名【元素个数】 = {{},{}, } 和普通的变量转化成数组变量差不多
阅读全文
摘要:用户自定义的数据类型 创建:struct 结构体名{结构体成员列表}; 创建变量:struct 结构体名 变量名{}未定义的为0
阅读全文
摘要:指针传入函数时,指针本事就是实参传形参,所以指针指向的位置不会改变,但是指针指向位置的值可以通过这种间接引用来改变
阅读全文
摘要:数组名相当于一个保存数组第一个元素位置的指针,所以可以使用*arr这些指针的操作,不过这个指针是指针常量,不可变 同样,指针也可以用数组式的方式来进行计算,p【i】
阅读全文
摘要:指针:用指针来指向内存,相当于是一个特别的变量,用与保存变量的地址,用*引出这一地址中的值 数据类型 *指针变量名 = 变量值的地址; 指针变量名就是一个正常的变量,保存地址,*指针变量名得到保存地址中的值 指针所占空间32位操作系统中是4字节 空指针,指针指向内存中编号为0的空间,用于初始化,但是
阅读全文
摘要:cd "d:\desk\cpp\" ; if ($?) { g++ head.cpp -o head } ; if ($?) { .\head } 改成 cd "d:\desk\cpp\" ; if ($?) { g++ head.h head.cpp -o head } ; if ($?) { .
阅读全文
摘要:返回值类型 函数名(参数列表) { 函数体语句 return返回值 } 函数调用:函数名(参数)//先声明在调用 函数定义中的参数是形参,传入实参,函数中使用的是形参,代表了实参的指,所以如果想要在函数中改变实参的值,形参的值就要间接引用实参的值 函数声明与定义可以分开,函数声明可以有多次,但是函数
阅读全文
摘要:二维数组就是在一维数组上加了一个维度 数据类型 数组名【行数】【列数】; 数据类型 数组名【行数】【列数】 = {{数据},{数据}} 数据类型 数组名【行数】【列数】= {数据},区分时先行后列 数据类型 数组名【】【列数】 = {数据},自动计算行数
阅读全文
摘要:数组是一个集合,其中保存了相同的数据类型的元素 数据类型 数组名[长度] 数组类型 数组名【数组长度】 = {值},未补齐进行0填充 数组类型 数组名【】={值} 数组名代表一个指针使用,通过下标来引用,本身可看为数组首地址 定义数组时必须有一个初始的长度 数组名是一个常量,所以不可以更改
阅读全文
摘要:在 C++ 11 标准中,随机数库定义在头文件 random 中,主要有两个类: 随机数引擎类(random-number engines) 随机数分布类(random-number distribution) 其中,一个引擎类可以生成 unsigned 随机数列,一个分布使用一个引擎类生成指定类型
阅读全文
摘要:顺序结构 选择结构 循环结构 选择:if (条件){执行},if(条件){执行}else{执行},if(条件){执行}else if(条件){执行}。。。else{执行} if(条件){执行 if(条件){执行}else(执行) 执行}else{执行 if(条件{执行}else(执行) 执行} 三目
阅读全文
摘要:cout << a&&b <<endl这一行出现了这个错误 查了下是因为运算符优先级的问题,加个()就行了 cout << (a&&b) <<endl
阅读全文
摘要:++a与--a为前置,a++,a--为后置 前置会先进行运算在做其他,后置会先做其他在递增
阅读全文
摘要:算术运算符 赋值运算 比较运算 逻辑运算 主要比较注意1./除运算,除运算会自动控制结果的类型,比如int/int结果为int,但是如果其中之一为double或者float,那么结果将为double或float,float/double结果为double,会自动的转换为更麻烦的那个类型 2.取模运算
阅读全文
摘要:类型 比特数 有效数字 数值范围 float 32 6-7 -3.4*10(-38)~3.4*10(38) double 64 15-16 -1.7*10(-308)~1.7*10(308) long double 128 18-19 -1.2*10(-4932)~1.2*10(4932) Floa
阅读全文
摘要:ctrl+/,可以对选择的代码部分或者单纯光标在的代码行进行行注释,同样操作可以解除注释 alt+shift+A可以队选中的代码部分进行块注释
阅读全文
摘要:使用语法 cin>>变量 bool flag = true; cin >> flag; cout << flag <<endl;
阅读全文
摘要:bool型只有两个值 true1 false2 bool flag = true 内存空间为1
阅读全文
摘要:c++中有两种,c风格的 char str1[] = “hellow” c++风格的 string str2 = “hello” 注意使用时加一个头文件 #include <string>
阅读全文
摘要:转义字符用于标识不能显示的ascii字符 一般以\为开头 常用的有\n换行符,\\反斜杠,\t水平制表符,一个\t代表了8个位置,一般用来输出的时候对齐,如果前面不够自动补齐,如果超了从第8个开始重新计数,效果可以叠加,但是叠加后也是8个一循环 cout << "a\n"; cout << "a\\
阅读全文
摘要:char所占内存大小为1字节(只能保存一个字符),保存时通过ascii码来记载,创建时使用单引号 char ch = ‘a’ 可以进行强制类型转换 cout<<(int)a
阅读全文
摘要:c++中使用看float定义小数时,常在小数后加f显示的定义为float类型 不管是float还是double都是保存6位小数 float f1 = 3.14f;
阅读全文
摘要:short 2 long int 4 long long 8 float 4 double 8
阅读全文
摘要:system("pause")可以实现冻结屏幕,便于观察程序的执行结果
阅读全文
摘要:包含c++的标准输入输出头文件iostream 也就是编译器先把头文件iostream中的所有内容COPY到 #include的位置,再进行编译 注意c++的这个标准输入输出头文件的名称就是iostream,没有.h的后缀 跟c的标准输入输出头文件stdio.h不一样。
阅读全文
摘要:早些的编码将标准库功能定义在全局空间里(所以并不需要注明使用什么命名空间),声明在带.h后缀的头文件里。C++标准为了和C区别开,也为了正确地使用命名空间,规定头文件不使用后缀.h。因此,当使用<iostream.h>时,相当于在C中调用库函数,使用的是全局命名空间,也就是早期的C++实现。C++标
阅读全文
摘要:看ros的第一节就有用catkin编译和组建环境空间,查了下,catkin是是由ROS社区开发的元编译系统(meta-buildsystem),最初目的是用于编译ROS社区中多个相互依赖的CMake工程,也就是在ROS中用于创建功能和编译功能包的命令,
阅读全文