C++基础
文章平均质量分 57
最爱榴莲糖
这个作者很懒,什么都没留下…
展开
-
C++ 多态详解附图与代码
上面代码Student继承了Person,Person中声明了买票的虚函数,当Student完成了对它的重写之后,子类中存储的虚表就发生了变化。派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。,重写意为只继承了父类的函数名参数返回值,然后把函数的实现给重写了, 而覆盖在原理层指明了是将虚函数表给覆盖了,没有完成重写也就不会覆盖。p如果指向父类,就会到父类的虚函数表中去找,找到的就是父类的虚函数。原创 2023-07-01 16:42:39 · 407 阅读 · 0 评论 -
C++ 模板详解附代码
比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对字符类型也是如此。别看这只是简化了两组代码,想想对于stack的实现,我们总不可能写一个int类型的,再写一个double类型,再写一个char类型的吧,使用上模板就大大优化了代码。通过使用类型特化和非类型特化,我们可以为不同的类型参数或非类型参数提供特定的行为,满足特定需求,并在代码中获得更好的性能和效果。类型参数指的是在模板中使用的类型占位符。原创 2023-06-27 10:52:03 · 219 阅读 · 0 评论 -
C++ 内存管理
而 malloc 函数在 C 中更常用,只是简单地分配内存,需要手动管理内存的分配和释放,并且不提供对象构造和析构的自动调用。忘记或错误地使用delete[]释放new分配的单个对象的内存,或使用delete释放new分配的数组对象的内存,都会导致未定义的行为。已经分配的内存块的大小。而使用 malloc 则需要手动指定所需的字节数,并且返回的是 void* 类型的指针,需要进行显式的类型转换。而使用 free 函数释放 malloc 分配的内存时,不会调用对象的析构函数,只是简单地释放内存。原创 2023-06-26 19:44:18 · 275 阅读 · 0 评论 -
C++ 匿名对象
(2) 匿名对象也可以有自己的构造函数、析构函数和成员函数,它们的行为与具名对象一样。它们通常用于在单个语句中执行一系列操作或调用某个函数,并且不需要将其结果存储到变量中。因此,无法在后续的代码中再次引用该对象。有时候我们只需对某个对象进行一次操作,这时可以使用匿名对象来创建临时的中间结果。当你调用某个函数时,可以直接使用匿名对象作为该函数的参数。它们常用于函数调用、链式调用和临时对象的场景。匿名对象的创建非常简单,只需在类名后面使用一对空括号。匿名对象是在没有被命名的情况下创建的临时对象。原创 2023-06-24 14:15:36 · 1721 阅读 · 1 评论 -
C++ 详解友元函数
友元类(Friend Class)是C++中的另一个重要概念,它允许一个类将另一个类声明为自己的友元,从而使得被声明为友元的类可以访问该类的私有成员。比如在只声明B是A友元的情况下,B可以访问A的私有成员,但是A却不可以访问B的私有成员,即A不是B的友元。友元函数提供了一种在需要时访问类的私有成员的机制,但应该慎重使用,因为过多的友元函数可能破坏类的封装性。(1)友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。:如果B是A的友元,C是B的友元,则不能说明C是A的友元。原创 2023-06-24 12:18:42 · 3589 阅读 · 0 评论 -
C++ static成员
静态成员在所有类对象之间共享,并且可以直接通过类名访问,而不需要创建类的实例。静态数据成员用于在类中存储共享的数据,而静态成员函数用于实现与类相关的功能。通过正确使用静态成员,我们可以避免重复存储和管理相同的数据,并提供更高效的类访问方式。(1) 静态成员只有一个拷贝,它不属于某个具体的实例,而是属于整个类,在类的所有实例之间共享使用。(3) 类静态成员即可用类名::静态成员或者对象.静态成员来访问。(成员变量+成员函数),但是非静态成员可以访问静态成员。,我们可以直接调用并使用静态成员函数。原创 2023-06-24 11:32:29 · 128 阅读 · 0 评论 -
C++ 运算符重载
C++中的运算符重载(Operator Overloading)是一种特性,它允许我们重新定义已有的运算符(如加号、减号、乘号等)的操作行为,使其适用于自定义的类类型或用户定义的数据类型。通过重载运算符,我们可以使用自定义的语义来执行运算符操作,使得代码更直观、可读性更好,同时也提供了类似内置类型的操作方式。(4) 作为类成员的函数重载时,其形参看起来比操作数数目少1个成员函数的操作符有一个默认的形参this,限定为第一个形参。是否要重载一个运算符,看的是这个运算符是否对这个类的对象有意义。原创 2023-06-24 10:25:53 · 87 阅读 · 0 评论 -
C++ 详解构造函数&析构函数&拷贝构造
(4) 如果类中没有显式定义构造函数,则C++编译器会自动生成默认构造函数,一旦自己定义了显式构造函数,编译器将不再生成。一般涉及到动态内存开辟的,我们都需要自己实现析构函数,以便在对象的生命周期结束时,完成对空间的释放,资源的清理。在C++中,拷贝构造函数(Copy Constructor)是一种特殊的构造函数,用于创建对象的副本。与构造函数功能相反,析构函数不是完成对象销毁的,对象在销毁是会自动调用析构函数,完成类的一些。当一个对象以值传递的方式传递给函数时,会调用拷贝构造函数创建函数中的局部对象。原创 2023-06-24 00:19:08 · 452 阅读 · 0 评论 -
C++ 类和对象详解
将类中的部分成员声明为protected或者private,那么外界只能通过类中的公有部分来访问或修改数据成员,这种方式有效地隐藏了对象内部的实现细节,避免了外界的非法访问与操作,便于维护与重构。下面我们定义一个Student类,其中class为定义类的关键字,Student为类的名字,{}内为类的主体部分,类定义结束后面要有分号。,因为类可以看作一个模板,其实用它定义出来了许多对象,那些对象也只是成员变量不同,而成员函数都是相同的,所以会存放在一段公共的函数代码段。五、类的实例化与隐含的this指针。原创 2023-06-09 21:17:13 · 152 阅读 · 0 评论 -
C++11 范围for详解
范围for的迭代范围必须是确定的,对于数组而言,就是数组中第一个元素和最后一个元素的范围。C++11新标准引入了一种更简单的for语句,这种语句可以遍历容器或其它序列的所有元素。冒号右边:序列类型的特点是拥有能返回迭代器的begin()和end()成员。e是一个形参,每次循环e都会取array中的一个元素,并自动++。冒号左边:定义的一个变量,序列中每个元素都能转换成该变量的类型。范围for的本质是迭代器,凡是支持迭代器就能使用范围for。一、范围for 的定义。二、范围for的使用。原创 2023-06-04 13:40:21 · 459 阅读 · 0 评论 -
C++ auto类型说明符详解
C++11新标准引入了auto类型说明符,用它可以让编译器替我们去分析表达式所属的类型,由于auto会让编译器根据初始值来推演变量的类型,所以。2.对于含有const的类型,会忽略顶层const属性(一般赋值时),而保留底层const属性(如指针和引用,因为涉及到了修改原对象)。原本需要写一大长串的类型,这里我们可以用auto来直接推导,简化了许多代码。编译器推导出来的auto类型有时候会和初始值的类型并不完全一样,编译器会适当的改变结果类型是其更符合初始化规则。auto定义的变量必须有初始值。原创 2023-06-04 13:18:04 · 481 阅读 · 0 评论 -
C++ 内联函数详解
内联函数是C++为提高程序运行速度的一项改进,编译的最终产品是一个可执行程序(.exe文件),它由及其语言组成,我们写的每一句代码都会对应一部分的及其语言指令。对于常规函数来说,当计算机执行到函数的时候,程序执行会跳到函数指令的地址,并在函数结束的时候返回,这种来回跳跃的行为会有一定的开销。而C++内联函数提供了另一种选择,在调用函数的时候编译器将使用函数代码替换函数调用,因此,程序也就无需跳到另一处位置执行代码,然后再跳回来。所以,内联函数的运行速度比常规函数稍快,但是却占用了更多的内存,这是一种。原创 2023-06-04 11:54:07 · 484 阅读 · 0 评论 -
C++ 引用详解附代码
常规变量(比如上面的a)和 const 变量(比如上面的b) 都可视为左值,因为可通过地址访问他们,它们是在内存中确确实实的开了空间的。这里b是a的引用,也就是说,我们给a起了另一个名字——b,因此不同于赋值,a和b是同一个对象的不同名称。c出了Add函数之后就不存在了,所占用的空间也已经还给了操作系统,再返回c的引用就失去了原本的意义。总结:一个函数要使用引用返回,返回变量出了这个函数的作用域还在,就可以使用引用返回,否则就不安全。,变量a的地址是在它定义时系统随机分配的,但b不是,b的地址是。原创 2023-06-02 22:49:51 · 500 阅读 · 0 评论 -
C++ 函数重载
函数重载可以一定程度上减轻我们起名字的负担,但是不同的函数名字反而可以使得我们更好的记忆函数的功能(顾名思义)。因此,一般来说我们是否后使用函数重载还是要看怎样更容易理解记忆。至少其中一个不同,这也是对函数进行重载需要遵循的。注意:仅仅靠返回类型不同不能构成函数重载。参数列表不同体现在:函数参数的。中存在的几个函数,如果它们。,我们称之为函数重载。原创 2023-06-02 17:30:55 · 58 阅读 · 0 评论 -
C++ 缺省参数
简单来说缺省参数就是函数的默认参数,如果我们传参数,那么就使用我们传的参数,如果不传参数,就使用默认参数。顾名思义,全缺省就是函数的每个形参都有其默认值。半缺省函数缺省部分参数,但必须从右往左连续缺省。半缺省没有缺省参数的位置必须的传参数。缺省参数分为全缺省和半缺省。原创 2023-06-02 16:00:34 · 117 阅读 · 0 评论 -
C++ 命名空间
注:cin是istream类型的对象,也被称为标准输入;cout是ostream类型的对象,也被称为标准输出。指令,这样在使用命名空间时就不用再单独声明,编译器会认为后序代码,都将使用指定命名空间中的内容。我们可以注意到,上面声明的方式显得有些繁琐,这里我们可以借助一种更简单的声明途径——没有提前声明cout,所以使用cout仍然需要单独声明。3.using namespcae声明全部。来定义命名空间,后面跟空间的名称。2.使用using声明一类。原创 2023-06-02 15:38:27 · 49 阅读 · 0 评论 -
C++ 简单实现一棵二叉搜索树(递归版本与非递归版本)附代码
二叉搜索树(Binary Search Tree, 简称BST)是一种非常常用的数据结构,它是一种节点具有左右子树,它的每个节点都满足左子树所有节点小于当前节点,右子树所有节点大于当前节点。使用“V模板”可以帮助我们方便地对节点的值进行读取和修改,也可以实现一些高级操作,例如计算BST中各个节点之间的关系等。,因为我们可以通过比较节点的键值来确定需要访问的子树,这个有点类似于数组中的下标。模板K:记录当前节点的值,可以帮助我们。方便地进行节点的查找、插入和删除等操作。模板V:我们可以将“V模板”应用到。原创 2023-04-15 11:10:15 · 137 阅读 · 0 评论 -
C++ 继承(基类与派生类)详解附代码
继承是C++语言的三大特性之一,通过继承联系在一起的类构成一种层次关系。通常在层次关系的根部有一个基类,其他类则直接或间接地从基类继承而来,这些继承得到的类称为派生类。继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类型特性的基础上进行扩展,增加功能。一、继承的实例演示继承的三种方式继承的方式有三种:公有继承、私有继承、保护继承基类的private成员在派生类中不可见,如上述例子中Person中的_age成员在派生类Student中不可见。原创 2023-04-10 22:51:59 · 4343 阅读 · 1 评论