C++
C++学习
无情酷狗
所有帖子仅是记录自己的学习过程,缺乏严谨性仅供参考
展开
-
C++ 动态申请空间(new,delete)
在C中使用mallocfree来动态申请、释放堆区内存空间,使用时需要显式的指定申请空间的大小。而在C++中使用两个关键字:newdelete来动态申请、释放空间,同样操作的是new的使用:new申请空 间不需要指定空间大小,而是指定类型,根据类型自动计算所需要的空间大小,并返回申请内存空间的地址,地址指向的类型为new后写的类型,格式:数据类型* 指针名= new 数据类型.new数组返回的是首元素的首地址。原创 2024-06-26 14:25:11 · 268 阅读 · 0 评论 -
C++ 标准输入输出
与printf复杂的使用转换说明不同,C++插入运算符 (原创 2024-06-26 14:01:29 · 295 阅读 · 0 评论 -
C++ 命名空间
对于全局和局部作用域可以定义相同的成员,但如果是同一个作用域中存在相同的成员,则会报重定 义的错误。中的关键字,用于定义命名空间,命名空间主要用于区分同一个作用域下的相同成员。打开了多个命名空间如果成员名相同会出现二义性。) 优先代表全局变量,没有全局变量时才看打开的命名空间。3.全局和打开的命名空间都有相同的变量时候(常用的作用域有命名空间、结构体、类等。,这是一种懒惰的做法,打开一次里。用的时候都需要指明命名空间。指明了成员的归属范围,编译指令打开命名空间,显示指定命名空间成员,原创 2024-06-26 14:14:31 · 126 阅读 · 0 评论 -
结构体在C与C++中的不同
C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。在C++中这么写是直接定义了一个结构体类型紧接着又定义了这个类型结构体类型的变量。这俩的区别:complex是一个变量,newName是一个结构体类型。原创 2024-06-26 14:45:54 · 218 阅读 · 0 评论 -
C++ bool类型
类型,关键字,占用一个字节,对应的真假为。中,我们使用的时候通常只需要包含。系统给我们提供的,并不是。原创 2024-06-26 14:51:11 · 113 阅读 · 0 评论 -
C++ string
index字符串截取的下标默认从0开始如果下标超限则访问越界,len截取的长度如果长度超限则取有效长度。其天然支持字符串的初始化、赋值、比较、拼接、下标访问等操作。提供的字符串存储、操作的类需要包含头文件并打开。将string 类型转换为字符指针使用。,并返回截取后的字符串。字符串的截取需要用函数。则返回字符串的长度(原创 2024-06-26 15:10:54 · 126 阅读 · 0 评论 -
C++ 增强的范围for
通常我们遍历数组时,常用的写法。原创 2024-06-26 15:29:15 · 127 阅读 · 0 评论 -
C++ 类之间的关系(继承,组合,依赖,关联,聚合)
多个被聚合的对象聚集起来形成一个大的整体,聚合的目的是为了统一进行管理同类型的对象,聚合是一种弱所属关系,被聚合的对象还可以再被别的对象关联,所以被聚合对象是可以共享的,比关联关系更紧密。子类对象的生命周期结束后,因为是子类所以自动调用子类析构,当析构执行完了,才会回收对象分配的空间,当然这个空间包含创建的父类的成员,那么回收父类成员前,自动调用父类的析构。父类的指针只能使用父类的成员,不能使用子类的成员。如果子类和父类有同名的成员,默认使用子类的成员,如果想要使用父类的成员,需要在成员名前加上。原创 2024-06-27 15:19:18 · 1661 阅读 · 0 评论 -
C++ 引用
引用初始化后就不能再重新引用其他的变量、空间,指针可以随意指向。引用定义了就要初始化,指针可不用初始化(但不推荐)。符号定义引用,给某个变量起别名,定义引用时就要初始化。指针变量额外占用空间,引用不额外申请空间。,对引用操作就是对原变量进行操作。指针可以有多级,但引用只能有一级。原创 2024-06-26 16:16:39 · 203 阅读 · 0 评论 -
C++ 类成员
属于类的,在编译期就存在了,与是否定义对象无关。,定义多个对象,成员属性存在多份(表现为在内存中的地址不同),彼此独立,互不干扰。对象都必须具有非零大小,所以一个空类即使没有任何数据存储其大小不能为0。,是用来在内存中占位的,不同的对象在内存中的地址不同。定义对象的时候,才会真正的存在(在内存中分配空间)sizeof(类)占位用的一个字节就不会单独存在。C++标准规定,凡是一个独立的。表示,分配当前类型的变量所占用的空间大小。,因为变量的地址已经起到了占位、标识的作用。一个类中存在非静态成员变量的时。原创 2024-06-27 11:25:48 · 154 阅读 · 0 评论 -
C++ 析构函数
析构在真正回收对象内存空间之前去调用,额外的空间回收完后,才真正回收对象内存空间。malloc 申请对象空间,不会调用构造函数,free 不会调用析构函数。,编译器提供的默认析构函数函数体代码也为空,我们可以手动重构,new 对象 自动调用构造函数,delete 自动调用析构函数。空类中存在一个默认的析构函数,函数名为。析构函数:与构造函数相对应的析构函数,其作用是用来。一旦重构,编译器就不会再提供那个默认析构了。对象的生命周期结束的时候,自动调用。回收类中成员申请的额外空间。,无返回值,无参数。原创 2024-06-27 09:59:01 · 124 阅读 · 0 评论 -
C++ this指针
指针就指向了调用的对象,在函数中使用类成员属性或其他类成员函数都是默认通过。类中的非静态成员函数包括构造析构,会有一个默认的隐藏的参数。连接对象和成员函数的桥梁,可以在函数中无感知的使用成员。平时写代码的时不用显示的指明this。,当我们在用对象调用函数的时候,类 * const this。,因为编译器会默认加上。原创 2024-06-27 11:38:03 · 181 阅读 · 0 评论 -
C++ 函数传参的三种方式(值传递、地址传递、引用传递)
对于一些基本的数据类型值传递问题不大,但是对于一些复合类型来说,参数中的局部变量会占用空间(虽然调用函数结束空间会自动被回收),对于结构体、类来说会调用构造、析构,可能出现浅拷贝的问题,所以复合类型强烈不建议使用值传递。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。原创 2024-06-26 19:13:31 · 626 阅读 · 0 评论 -
C++ 函数默认值
中允许函数的参数列表指定默认值,而且这个默认值必须 从右向左依次指定,不能间断,一般在函数的声明中去指定,在函数的定义中指定编译可能不会报错,但多数情况下是毫无意义的操作。从右向左依次指定中间不能间断,如果函数声明和定义分开写, 一般在函数的声明处指定默认值,如果有多个声明,按离函数最近的声明指定默认值。在函数的定义中指定编译可能不会报错,但多数情况下是毫无意义的操作,如果在声明和定义中都给了默认值就会报重定义默认参数错误。原创 2024-06-26 15:46:39 · 215 阅读 · 0 评论 -
C++ 常量对象
常量对象不能调用普通的成员函数,只能调用常函数。这里面涉及到了 this指针的安全级别升级还是降级的操作。如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加上const关键字。,这是一个安全级别降级的非法的操作,而普通的对象调用常函数。常对象只能调用常成员函数,不能调用非常成员函数。这是一个安全级别升级的合法操作。类名 const 对象名;const 类名 对象名;const 修饰的对象,可以访问成员属性,但是。常量对象调用普通函数。原创 2024-06-27 14:14:02 · 137 阅读 · 0 评论 -
C++ 常量指针 和 指针常量
const int *”转换为“int *” 指针安全级别降级操作不允许。“int *”转换为“const int *” 指针安全级别升级操作允许。原创 2024-06-27 12:15:09 · 136 阅读 · 0 评论 -
C++练习-封装链表
/链表节点结构体int val;Node* next;val = n;int nLen;原创 2024-06-27 10:44:11 · 107 阅读 · 0 评论 -
C++ 常量成员函数
将const CTest* const this 转换成 CTest* const this。将CTest* const this 转换成 const CTest* const this。4.如果在常函数中想修改部分指定的普通成员,我们可以使用关键字。3.但在普通的成员函数中却是可以调用常函数的,作用是为了能够保护类中的成员变量、限制修改。可以查看普通的变量、常量、静态变量等,也。const 类* const this。不可以修改成员变量但可以查看成员变量。,因为静态成员不是属于对象的,并不在。原创 2024-06-27 12:29:18 · 258 阅读 · 0 评论 -
C++ 函数重载
如果重载函数产生争议时会导致报错,因为编译器不知道你要调用的是void fun2(int a) 还是 void fun2(int a,int b=10)。函数的重载使得 C++ 程序员对完成类似功能的不同函数可以统一命名,减少了命名所花的心思。在调用函数时,编译器会根据实参的类型、数量。但如果一个作用域有两个声明也会报对重载函数的调用不明确错误。这种情况可以使用函数声明来解决。原创 2024-06-26 16:08:45 · 195 阅读 · 0 评论 -
C++ 静态成员
没有隐藏的this指针参数,也就不能使用普通的成员变量和函数,只能使用静态成员变量和函数。但在普通成员函数中可以使用静态成员。3.可直接类名作用域去调用,也可以通过对象去调用。CTest::m_b;静态成员函数是否通过对象都可以调用,而普通的成员函数只能通过对象去调用。2.可直接类名作用域去调用,也可以通过对象去调用。在编译期就存在,所有的对象共享同一份静态成员函数。静态成员需要使用关键字 static 修饰。所有的对象共享这个静态变量。不参与类对象的空间占用。不参与类对象的空间占用。原创 2024-06-27 11:51:20 · 129 阅读 · 0 评论 -
浅谈面向过程与面向对象
:面向对象编程是一种编程模型,以对象(数据)为中心,它把要解决的问题分解成各个对象(变量、数据)而不是各个流程、步骤,更专注于对象与对象之间的交互(而不是数据和方法、方法与方法),建立对象的目的不是为了完成一个步骤,而是为了描述某个对象在解决整个问题步骤中的属性和行为。)是一种编程模型,也是初始踏入编程时接受的思想,过程即由一系列要执行的计算步骤,以过程为中心依次把要解决问题的步骤、流程分析出来,用函数封装好形成一个一个的模块,在主流程中按照具体的步骤调用相应的函数。不易于维护,扩展,复用。原创 2024-06-27 10:11:50 · 293 阅读 · 0 评论 -
C++ 构造函数
构造函数并不需要我们手动调用,在定义对象的时候会自动调用,这个默认的无参构造是编译器给提供的,函数体代码为空,所以在定义对象时虽然调用了,但并没有这正给成员初始化。所以多数情况下需要我们手动重构构造函数。,这就要看在定义对象时如何指定参数了,会根据参数的类型、数量自动匹配对应的构造,但。通常在定义变量时要初始化,在定义类对象时,成员属性并没有得到初始化。默认的无参数的构造,函数名为当前类名,无返回值(来符合我 们需要的初始化过程。多个对象可能会执行不同的构造。的关系,重构的构造函数。构造函数允许存在多个。原创 2024-06-26 19:58:19 · 320 阅读 · 0 评论 -
C++ nullptr空指针
我们在使用指针的时候,要尽量避免野指针的存在,即定义了就要初始化,如果暂时不知道具体指向哪块空间,那么可以初始化为空,我们有两种方式 1. NULL。新标准引入的一个关键字,代表是空指针,如果出现了多个类型的空指针,仍然会语义不明确,则需要使用强转来明确空指针的类型。的出现解决了这个问题,它明确了自己的含义,空指针。,这就导致了整型与指针的混用,原创 2024-06-26 16:13:48 · 150 阅读 · 0 评论 -
C++ 类封装,访问修饰符
中将相互关联数据和算法封装起来,形成结构体或类,无论类还是结构体都是一个抽象的概念,只有定义类的变量时,数据才会真实存在,这个变量我们称之为对象,C++程序过程中,尽量避免单独的数据和算法,而是由一个个类对象组成的,这就是面向对象。语言中一般是由数据和算法组成,数据和算法彼此独立,关联性不强,在。对于类内的私有成员,我们可以提供public的访问接口(描述了类成员的访问控制,即所能使用的一个范围, 共有的。完成某一功能的数据和算法的集合,是一个抽象的概念。类的一个实例,具体的概念,是真正存在于内存中的。原创 2024-06-26 19:39:55 · 146 阅读 · 0 评论 -
C++ 常量
定义就必须初始化,一旦初始化后就不能再去修改其值(不能通过正常手段修改)。对于普通的变量来说也可在初始化参数列表中初始化。构造函数的函数体代码中进行的操作严格来说是赋值,而并非初始化。” 的形式指定初始化值(而不是用=等号),多个成员用逗号 ‘类中有const类型的变量时,在定义的时候必须要初始化。在构造函数的参数列表后加上一个冒号。,而不是写在初始化参数列表中的顺序。后面是初始化的成员,用圆括号 “先执行初始化参数列表,在执行。一般函数没有初始化参数列表。原创 2024-06-27 11:58:23 · 151 阅读 · 0 评论 -
C++ inline 内联
这个过程中涉及到空间和时间的开销问题,如果函数体的中代码比较多,逻辑也比较复杂,那么执行函数体占用大部分时间,而函数调用、释放空间过程花费的时间占比很小可以忽略;如果函数体的中代码非常少,逻辑也非常简单,那么相比于函数体代码的执行时间 函数调用机制所花费的时间就不能忽略了。类、结构中在的类内部声明并定义的函数默认为内联函数,如果类中只给出声明,在类外定义的函数,那么默认不是内联函数,除非我们手动加上 inline 关键字。的做法,内联在一定程度上能提高函数的执行效率,这并不意味着所有函数都要成为内联函数,原创 2024-06-29 22:24:11 · 316 阅读 · 0 评论 -
C++ 重载操作符
在类内的重载操作符函数有默认的this且为自定义类型,所以在定义函数时忽略了第一个参数,但类外重载没有隐藏的参数了,一般比类内要多一个参数。但要注意是否与类内重载的函数有冲突。原创 2024-06-30 12:10:39 · 321 阅读 · 0 评论 -
C++ 虚析构
在多态的时候,父类指针指向子类对象,回收空间的时候,是按照父类的指针类型delete,只会调用父类的析构函数,子类的析构并没有执行,如果子类申请了额外的空间,会导致内存泄露。这个问题可以使用虚析构来解决,把父类的析构函数变成虚函数这样delete pFa;时,调用析构会发生多态行为,从而真正调用的是子类的析构,最后回收对象内存空间时,再调用父类的析构。 class CFather{ virtual ~CFather(); //虚析构};class CSon:public CFather原创 2024-06-28 11:00:29 · 132 阅读 · 0 评论 -
C++ 程序生成的过程
进行一系列词法分析、语法分析、语义分析及优化,产生相应的。,该文件为二进制文件,字节编码是机器指令。3. 预处理指令:解析。4. 删除所有注释。)汇编指令逐条翻译成目标机器指令,并。链接在一起生成一个完整的。生成可重定位目标程序。原创 2024-06-28 12:00:32 · 124 阅读 · 0 评论 -
C++ 头文件重复包含问题
而且需要考虑宏重名的问题,一般情况下宏的名字与当前文件名对应,但是并不能保证一定不重名,如果不同路径下存在相同的文件,也可能会重复。的作用:直接告诉编译器这个文件在源文件中只包含一次,相对来说效率比较高。,基于逻辑宏判断,在大量头文件时,编译速度降低,耗时增。原创 2024-06-28 11:47:34 · 203 阅读 · 0 评论 -
C++ 多态实现的原理
子类是否有重写父类的虚函数,如果有,在子类的虚函数列表中会替换掉父类的虚函数。如果子类没有重写的父类虚函数,父类虚函数会保留在子类的虚函数列表中。由于子类继承父类,不但继承了父类的成员,也会继承父类的虚函数列表。如果子类定义了独有的虚函数,按顺序依次添加到虚函数列表结尾。虚函数列表是属于类的,父类和子类都会有各自的虚函数列表,在子类的初始化参数列表中被初始化,指向子类的虚函数列表,,覆盖后便指向了子类的虚函数。调用虚函数时执行虚函数的调用流。:父类指针指向子类对象,属于对象的,每个对象。原创 2024-06-27 22:16:49 · 102 阅读 · 0 评论 -
C++ 编译期,运行期
执行类型检查,语法检查,以及为变量确定内存分配大小,这些变量包括全局或静态变量,栈上的变量。运行期是指将可执行文件交给操作系统执行、直到程序退出,把在磁盘中的程序二进制代码放到内存中执行起来,执行的目的是为了实现程序的功能。动态申请空间,可以为变量,运行时确定器数组大小,但是太大会导致程序崩溃,而这个是在编译期无法检测的,类是编译期的概念,包含了【访问权限】、【成员作用域】。属性的函数,那自然是通过编译的。但是在运行期时由于多态的作用,结果调用的是子类的。,所以在运行时无效,子类的。修饰符是编译期的限制。原创 2024-06-29 22:00:28 · 201 阅读 · 0 评论 -
C++ 头文件与源文件
通常我们将声明的变量、类型、函数、宏、结构体和类的定义等放于头文件(.h文件),将变量的定义初始化、函数的定义实现放于源文件中。比如在a.h里面int a = 10;两个源文件引用了这个头文件,那么就会出现重定义。默认情况下 ,头文件不参与编译,而每个源文件自上而下独立编译。(而不是头文件中),且不用加static关键字。,这样方便于我们去管理、规划,更重要的是。在对应的源文件中定义时,一定要加上。不需要保留virtual关键字。定义时去掉static。注意纯虚函数不需要定义。原创 2024-06-28 11:21:43 · 240 阅读 · 0 评论 -
C++ 宏
2.可以使用宏替换一些经常使用的常量或表达式,后期程序维护时,不用对整个程序进行修 改,只需要维护、修改一份宏定义的内容即可。3.对带参的宏而言,由于是直接替换,并不会检查参数是否合法,也并不会计算求解,存在一定的安全隐患。1.可以代替一些简单的函数,减少了函数调用的开销。,在程序编译前预处理阶段进行替换,替换后才进。一般情况下,宏替换当前这一行的内容,一个标识符被宏定义后,在用到宏。后面不能有任何字符,包括空格、取消宏定义,限制宏的作用范围。,参数的作用也是一个替换。,也不做表达式求解,原创 2024-06-29 22:11:05 · 118 阅读 · 0 评论 -
C++ 多态
相同的行为方式可能导致不同的行为结果,即产生了多种形态行为,即多态,同一行语句展现了多种不同的表现形态,定义父类的指针可以指向任何继承于该类的子类的对象,且父类的指针具有子类对象的行为。,多种子类表现为多种形态由父类的指针进行统一,那么这个父类额指针就具有了多种形态。(虚函数的详解在主页其他文章)父类类型的指针指向某个子类。子类中重写了父类的虚函数。,通过该指针调用虚函数。原创 2024-06-27 15:43:41 · 215 阅读 · 0 评论 -
C++ 虚函数,虚函数指针,虚函数列表
当一个类中定义了虚函数时,在定义对象的内存空间的首地址会多分配出一块内存,标识这块内存的变量称之为虚函数指针(2.调用效率不同:普通的成员函数通过函数名(即函数入口地址)直接调用执行函数,效率高速度。1.属于对象的,定义对象时才存在(内存空间得以分配),多个对象多份指针。虚函数的调用需要虚函数指针-虚函数列表的参与,效率低,速度慢。在虚函数列表中定位到其虚函数地址,通过地址调用真正的虚函数。是一个函数指针数组,数组每个元素为类中虚函数的地址。,这一点是普通的函数无法做到的。定义对象获取对象内存首地址中的。原创 2024-06-27 18:53:08 · 248 阅读 · 0 评论 -
C++ 类成员函数指针
类成员函数标识了所属的类,必须通过对象调用(虽然可以是空指针对象但必须得有)。或p_fun2();或p_fun2();类成员函数编译器会默认加上一个隐藏的参数。C++ 提供了三种运算符。原创 2024-06-27 15:34:22 · 221 阅读 · 0 评论 -
C++ 纯虚函数
在多态下,有时抽象出来的父类的虚函数作为接口函数,并不知道如何实现或不需要实现就是为了多态而生的,只有继承的子类才明确如何实现,可以把父类的虚函数变为。当前类不必实现,而子类必须要重写实现纯虚函数。具体类必须重写定义抽象类的里面的所有的纯虚函数。,继承这个抽象类的派生类叫。抽象类不能实例化对象。原创 2024-06-28 11:03:19 · 173 阅读 · 0 评论 -
C++练习使用模版优化链表
需要重载输出操作符,保证可以输出自定义类型。可以让链表装任意类型的数据结构。首先链表的结构体就发生了改变。原创 2024-07-01 15:58:42 · 271 阅读 · 0 评论 -
C++ STL容器之list链表
splice(iterator Where,list& Right,iterator First,iterator Last):将。构建了指定长度的链表,并且有默认的初始值。链表是序列性容器的模板类,它将其元素保持在线性排列中,链式结构,并允许在序列中的任何位置进行有效的插入和删除。//构建了指定长度的链表,并且有默认的初始值。//构建了指定长度的链表,手动指定初始值。返回链表的长度、元素的数量。原创 2024-07-02 11:57:14 · 1447 阅读 · 0 评论