
【C++】
文章平均质量分 62
Root_Smile
这个作者很懒,什么都没留下…
展开
-
【C++】多态(polymorphism)
指的是计算机自身彼此关联的过程,在这个过程中确定程序中的操作调用与之前操作的代码段之间的映射关系,比如:函数重载时,编译器会根据函数名和函数的参数来区别要执行的函数(哪一段代码) 这就是建立的一种映射关系,明确函数调用时会执行哪一个代码段。首先,我们需要额外的内存来存储V表,并且基类中要有一个成员指针指向V表,这样我们才能映射到正确的函数。指的是编译阶段不能确定将要调用的函数,只能在程序运行的时候才能确定将要调用的函数。这不是必需的,但你应该这样做。理解为,同一个接口,通过不同的对象调用,就有不同的效果。原创 2024-12-09 21:34:42 · 889 阅读 · 0 评论 -
【C++】虚函数
基类中有虚函数时,且通过父类指针去分配子类对象的时候,在释放的时候只能通过父类指针去进行释放,在delete父类指针的时候会调用父类的析构函数,而不会调用子类的析构函数;需要把父类的析构函数定义为虚析构,那么在释放父类指针的时候也就会调用子类的析构函数了。在基类中不能为虚函数给出有意义的实现,就可以把它声明为纯虚函数,然后把它的实现留给派生类去完成。析构函数也可以声明成纯虚析构,类内写声明,不用实现;类中声明函数成员的时候,在函数的前面加上。关键字,“接口”的概念靠纯虚函数实现。关键字,则该成员为虚函数。原创 2024-12-09 21:29:11 · 296 阅读 · 0 评论 -
【C++】继承(inheritance)
这样继承会导致类D继承两份类A的成员,在类D对象,想要访问类A的成员的时候,会导致访问不明确。因为类B,C各自继承类A的成员。也就是说,Dog继承了Animal,Animal所拥有的age和eat()它也就有了,就像父亲遗传给儿子一样。,虚继承之后会使在虚继承的类中多个指针(内存就会变大),但是在最后的D类,不会再继承两份A的成员了。继承方式就是类中的三种访问属性,每种访问属性通过继承方式之后在派生类中可能会有新的属性。我们发现有重复的代码,如果我们写猫类、鸟类等都要再写一遍,这样很麻烦。原创 2024-11-23 23:34:00 · 1509 阅读 · 0 评论 -
【C++】类和对象
我们要学习面向对象啦那么,什么是对象呢?比如,学校里有一个个学生,这每一个个体都可以看作对象;而这些个体都是学生,可以抽象为学生类。作为学生,你我都存在一些特征。比如都有学号,都有所在的院系,有姓名、性别、年龄等等,这些属性称为。而且都会干一些事情,比如上课、干饭、打游戏,这些行为称为。还记得结构体吗?有没有发现它和类很像?除此之外没有区别,看个人的使用习惯。原创 2024-11-21 21:43:27 · 569 阅读 · 0 评论 -
【C++】常量成员
常量成员,指的是在C++类中声明对象成员时可以加上const关键字这样声明的成员叫常量成员,常量成员分为常量数据成员和常量函数成员。原创 2024-11-21 21:11:58 · 280 阅读 · 0 评论 -
【C++】友元成员
类的特性之一就是封装,而友元就是C++为用户提供打破这种封装的手段,友元分为友元函数和友元对象。原创 2024-11-21 19:13:52 · 329 阅读 · 0 评论 -
【C++】内联函数
内联函数在这里类似于宏替换,但他们是有区别的。内联函数是一个函数,是在程序执行期间运行的,没有函数的入栈和出栈。宏替换是在预处理阶段执行的,本质是替换。内联函数有形参类型,有返回值类型和返回值。带参宏的形参没有类型,没有返回值类型也没有返回值。内存膨胀:指的是代码区的代码变多,因为使用内联函数之后,这个函数的调用就不会在栈区申请内存来运行,也就是少了入栈出栈的时间;如果是一个普通函数在调用时就会有入栈和出栈。内联函数是一个函数,是通过内存膨胀减少函数的跳转时间,以空间换时间。原创 2024-11-21 18:25:50 · 292 阅读 · 0 评论 -
【C++】从C到C++
它们也是思维方式的不同,既然讲到饭了,我们就来说说做饭。面向过程是做饭的过程,比如洗菜、开火、放菜、放调料,是一个过程。菜有品种、颜色、形状等,锅有大小、性能等,人可能是不同级别的厨师等。有这样一个比喻,面向过程是炒饭,面向对象是盖饭;1.三目运算符:在C语言中返回的是一个常量,是不能被赋值的;而C++中返回的是变量,可以被赋值。4.在C++中不要返回局部变量或临时变量的地址,虽然C++能够运行变量出作用域之后再使用一次。5.C语言中const修饰的变量不能定义数组大小,而C++中可以。原创 2024-11-21 17:21:29 · 756 阅读 · 0 评论 -
【C++】this指针
this指针并不是对象本身的一部分,它的作用域在类的内部。当类的普通函数在访问类的普通成员时,该this指针总是指向调用者对象。this指针是系统自动生成且隐藏的,我们看不到定义,但是可以使用。原创 2024-11-19 16:49:48 · 204 阅读 · 0 评论 -
【C++】拷贝构造
如果类中成员有开辟动态内存的,就要重写拷贝构造,给新对象的指针重新开辟动态内存,这种形式称为“(3)如果一个函数的返回值类型是对象,在函数调用结束,返回对象的时候调用拷贝构造。这里在函数调用的时候会调用两次拷贝构造,函数传参一次,函数返回时一次。会造成重复释放动态内存问题(两个指针的地址指向同一个内存)默认拷贝构造不会重新给指针开辟内存,这种形式称为“一种特殊的构造函数,用自身这种类型来构造自身。const 是为了防止被更改。原创 2024-11-19 16:32:39 · 238 阅读 · 0 评论 -
【C++】析构函数
在对象结束生命周期时,系统自动调用析构函数,清理对象空间(并不会释放对象)如果类中成员有开辟动态内存的,就要重写析构函数,里面写上动态内存的释放。函数名在与类名相同的基础上再在前面加一个~ 如。原创 2024-11-19 15:46:13 · 219 阅读 · 0 评论 -
【C++】构造函数
我们创建一个对象,并调用introduceMyself()方法,会报错。这样写很麻烦,当我们构造对象时,如果有办法直接运行这个初始化代码就好了。构造函数用来在创建对象时初始化对象,即为对象的成员变量赋初始值。在Java中数据基本类型如int和float会自动初始化为0。那我们定义一个初始化名字的方法。并在创建对象后首先调用它。假设你有一个Log类,它只有静态的write()方法。但在C++中你必须手动初始化所有基本类型。既然可以重载,那就说明还有带参的构造函数。构造函数在类实例化对象时会自动调用。原创 2024-11-16 22:36:13 · 372 阅读 · 0 评论 -
【C++】函数的参数缺省
在声明函数时,为某个形参指定一个默认值,在调用函数时,如果不给这个带有默认值的形参传递参数,那么这个形参就会使用指定的默认值;如果给定了参数,就以给定的为准。原创 2024-11-16 17:14:39 · 286 阅读 · 0 评论 -
【C++】函数重载
由于在C/C++中的浮点型常量默认是double类型,而double类型既可以给int型变量赋值,又可以给float型变量赋值。函数重载指的是,在同一个项目中定义的函数名字可以重复,也就是可以有同名的函数,但是要满足条件才能同名。注意:函数的返回值可以不同,但如果仅仅只有返回值不同是不可以的。加入新的重载函数,使得类型有确定的调用方式,不存在赋值兼容。赋值兼容(隐式类型转换)所导致的函数重载二义性问题。明确函数调用时的参数类型,可以使用强制类型转换。 (2)相对应位置的类型不同。原创 2024-11-16 16:56:10 · 297 阅读 · 0 评论 -
【C++】static(静态)
静态局部变量允许我们声明一个变量,它的生命周期基本上相当于整个程序的生命周期,但是它的作用域范围是被限制的。你可以在任何作用域中声明,如果在函数中声明,那么它的作用域范围被限制在这个函数中。静态变量或函数意味着,当需要将这些变量或函数与实际定义的符号链接时,链接器不会在这个翻译单元的作用域之外寻找那个符号定义,即只会在这个翻译单元内部链接(文件内可用):指的是在C++类中声明成员时,可以加上static关键字,这样声明的成员叫静态成员。上面我们说它们属于类,是指它们是类中的一部分,实质上它们和在。原创 2024-11-16 15:56:18 · 1645 阅读 · 0 评论 -
【C++】单例模式
单例模式是一种常用的软件设计模式。通过单例模式可以保证系统中应用该模式的类只有一个实例化对象。原创 2024-11-16 15:50:53 · 490 阅读 · 0 评论 -
【C++】引用(reference)
既然是对一个变量或者对象取别名,那就得先有变量或对象,不能凭空取一个别名。也就是定义引用必须初始化。假设我们想通过调用一个函数来实现一个整型变量的自增,有下面3种传递方式。我们为什么要使用引用呢?我们干嘛要起个别名而不直接用真名呢?其实引用就是指针的语法糖(syntax sugar)那么,可不可以给引用取别名呢?引用是对一个变量或者对象取的别名。:形参的改变无法改变实参的值。:形参的改变可以改变实参的值。:形参的改变可以改变实参的值。是不是比使用指针更简洁些呢。原创 2024-11-15 18:00:09 · 518 阅读 · 0 评论 -
【C++】How the C++ Linker Works
(1)标记Log函数为静态的(前面加static),这意味着在链接Log函数时,它只能是内部函数。这样Log.cpp和Math.cpp都会有自己版本的Log函数,它对任何其他的obj文件都不可见。链接器不知道它该链接哪一个Log函数,是Log.cpp中的还是Math.cpp中的?我们可以把Log函数单独放到一个文件中(Log.cpp),这样可以降低程序的耦合度。实际上我们就定义了一个Log函数,它在Log.h中。(3)将Log函数的定义放到Log.cpp中,而在Log.h中声明它。原创 2024-10-28 20:19:25 · 895 阅读 · 0 评论 -
【C++】How the C++ Compiler Works
它会将.h文件视为头文件。首先,它需要预处理我们的代码,这意味着任何预处理语句都会被处理,一旦我们的代码被预处理,我们就会继续进行或多或少的记号化和解析,并基本整理成英文的c++语言,使其成为编译器可以真正理解和推理的格式。但是,如果您只是使用单个CPP文件创建一个项目,并且您从未将它们包含在彼此中,那么每个CPP文件将是一个翻译单元,每个CPP文件将生成一个目标文件。也就是说,我们输入编译器的每个c++文件告诉它这是一个c++文件,请编译它,它会把它编译成一个翻译单元,一个翻译单元会产生一个目标文件。原创 2024-10-28 18:26:27 · 912 阅读 · 0 评论 -
【C++】HelloWorld
笔者使用的是Microsoft Visual Studio 2022社区版安装过程省略。原创 2024-10-25 21:19:08 · 4019 阅读 · 0 评论 -
【C++】命名空间(namespace)
在编写代码时写的程序不可能所有的标识符都没有重名现象,在多人协作开发时更加不可控,尤其对于库来说问题更加严重。为了解决重名现象,通过命名空间来避免冲突。(3)命名空间名称访问:直接使用命名空间名称访问其中的成员,不会开放命名空间权限。(2)using指示:开放某个命名空间中所有的成员的访问权限。命名空间用于帮助实现代码的管理(代码的封装)(1)using声明:开放单个成员的访问权限。命名空间是用来组织和重用代码的编译单元。原创 2024-10-25 20:59:33 · 316 阅读 · 0 评论 -
【STL】概述及总结(很全!!!)
STL: (Standard Template Library) 标准模板库STL广义上讲分为三类,,容器和算法通过迭代器可以进行无缝地连接,容器里面存数据,算法进行排序或查找,迭代器是用来访问容器里的数据的。STL的一个重要特点就是数据结构和算法的分离,即数据的存储和数据的访问进行了分离,如栈的栈顶指针为栈数据的常用访问,而栈的数据存储是通过栈的数据结构。原创 2024-04-07 15:06:16 · 546 阅读 · 0 评论 -
【C++】随机数rand()和srand()
实际上,rand() 函数产生的随机数是伪随机数,是根据一个数按照某个公式推算出来的(可以说这个种子产生了一个固定的数字序列),这个数我们称之为“种子”,但是这个种子在系统启动之后就是一个定值。原文链接:https://blog.youkuaiyun.com/sandalphon4869/article/details/104299936。机制:既然rand()是采用固定的种子,那么我们使用一个随当前时间变化(按秒)的种子就行。注意:这个种子是随每秒变化的,所以在同一秒的种子是相同的,种子的第一个值是一样的结果。转载 2024-04-11 16:42:07 · 91 阅读 · 0 评论 -
【C++】交换数值swap()
【代码】【C++】交换数值swap()原创 2024-04-11 16:30:15 · 172 阅读 · 0 评论 -
【C++】stringstream
定义于头文件<sstream>实现基于字符串的流上的输入与输出操作。它等效地存储一个的实例,并在其上进行输入与输出操作。原创 2024-04-11 15:50:23 · 3456 阅读 · 0 评论