- 博客(42)
- 收藏
- 关注
原创 c++总复习
多态(Polymorphism)是面向对象编程中的一个核心概念,它指的是同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。简单来说,就是用同一种方式去调用函数或者操作对象,但根据对象的实际类型不同,具体的行为表现不一样。例如,在一个图形绘制系统中,有圆形(Circle)、矩形(Rectangle)等不同类型的图形类,它们都继承自一个抽象的图形基类(Shape),基类中有一个名为draw()的函数用于绘制图形。当通过基类指针(或引用)分别指向圆形对象和矩形对象,然后调用draw()
2024-12-08 22:18:13
1926
原创 c++总复习
继承(Inheritance)是面向对象编程中的一个重要特性,它允许创建新的类(称为派生类或子类)从已有的类(称为基类或父类)那里获取成员变量和成员函数。派生类继承了基类的特性,并且可以在此基础上进行扩展,添加新的成员或者重写基类中的某些函数,以满足特定的应用需求。形象地说,就好比子女继承父母的某些特征,并在此基础上发展出自己独特的个性一样。例如,有一个基类Animal,它具有成员变量表示动物的年龄、体重等通用属性,以及成员函数如eat()表示吃东西这个行为。然后可以创建派生类Dog(狗类)从。
2024-12-08 22:13:33
845
原创 c++总复习
封装性(Encapsulation)是面向对象编程(Object-Oriented Programming,OOP)中的一个重要概念,它指的是将数据(通常是类的成员变量)和操作这些数据的方法(类的成员函数)组合在一起,并对外部隐藏数据的具体实现细节,只通过特定的接口(类的公有成员函数)来访问和操作这些数据。简单来说,就像是把相关的东西放在一个 “黑盒子” 里,外部使用者不需要知道里面具体是怎么运作的,只需要按照规定好的方式去使用它就能达成目的。
2024-12-06 19:27:17
834
原创 C++总复习
因为所有代码在编译时就已整合到可执行文件中,程序运行时不需要在磁盘等存储介质中查找和加载外部的动态链接库,减少了运行时因查找库文件、动态链接等操作带来的时间开销,其执行效率相对比较稳定,可预测性强。因为程序在首次运行时,需要操作系统的动态链接器去查找、加载相应的动态链接库,并进行符号解析、重定位等操作,将程序中的函数调用和动态库中的实际函数地址关联起来,这个过程会有一定的时间开销,所以相比静态链接的程序,动态链接程序首次启动时可能会稍慢一些,但后续再次运行如果动态库已经加载到内存中,速度就会变快。
2024-12-06 19:13:54
1690
原创 c++总复习
隐式类型转换(Implicit Type Conversion),也称为自动类型转换,是指在程序运行过程中,编译器自动将一种数据类型转换为另一种数据类型,而无需程序员显式地编写转换代码。这种转换通常发生在不同类型的数据进行混合运算、赋值操作或作为函数参数传递等情况下。显式类型转换(Explicit Type Conversion),也就是通常所说的强制类型转换,是指程序员通过特定的语法形式,手动将一种数据类型转换为另一种数据类型。在不同的编程语言中,强制类型转换的语法形式可能有所不同。
2024-12-03 13:54:41
670
原创 c++总复习
函数重载(Function Overloading)是指在同一个作用域内,可以定义多个同名函数,但是这些同名函数的参数列表必须不同(参数个数、参数类型或者参数顺序不同),函数的返回类型可以相同也可以不同。当调用这个同名函数时,编译器会根据传入的实际参数情况来自动判别应该调用哪一个具体的函数,从而实现不同的功能。// 函数重载示例std::cout << "整数: " << num << std::endl;std::cout << "小数: " << num << std::endl;
2024-12-03 13:49:52
818
原创 c++总复习
内存对齐(Memory Alignment)是指计算机系统在存储数据时,将数据存储在内存地址为特定值(通常是某个数的倍数)的位置上的一种机制。在现代计算机体系结构中,不同的数据类型有其默认的对齐要求。通常情况下,char类型(一般占 1 个字节)可以从任意内存地址开始存储,因为它的长度本身就很小,不存在对齐方面的特殊限制。short类型(一般占 2 个字节)通常要求存储在能被 2 整除的内存地址上,也就是内存地址是 2 的倍数。int。
2024-12-03 13:45:44
467
原创 c++总复习
传统的拷贝语义在拷贝对象时会复制对象的所有数据,而移动语义则是在某些情况下(当对象即将消逝时,如返回临时对象、函数参数传递等),将对象的资源(如内存、文件句柄等)从一个对象 “移动” 到另一个对象,而不是进行复制,从而提高程序的执行效率。在 C++ 中,右值引用是一种特殊的引用类型,用于引用那些即将消逝的值,也就是右值。关键字用于让编译器根据变量的初始化表达式自动推导出变量的类型。通过移动语义,可以在很多场景下(如容器的插入、删除操作,对象的返回等)有效利用右值的特性,提高程序的运行效率。
2024-11-29 14:40:40
345
原创 c++总复习
编译器在进行优化时,可能会对一些变量的读取操作进行优化,例如将变量的值缓存到寄存器中,后续的读取操作就直接从寄存器获取值而不是从内存中重新读取。关键字并不能完全解决多线程并发访问共享变量的所有问题,它只是确保了变量的读取和写入操作不会被编译器过度优化,要真正实现安全的多线程并发访问,还需要使用更高级的同步机制,如互斥锁、原子操作等。关键字主要用于告知编译器,被修饰的变量可能会在程序执行过程中以意想不到的方式被改变,从而防止编译器对该变量进行某些优化,确保程序能正确读取变量的实际值。在 C/C++ 中,
2024-11-29 14:18:30
514
原创 c++总复习
在 C++ 中,函数对象(Function Object)也称为仿函数(Functor),它是一个类的实例,该类重载了函数调用运算符(),使得这个类的对象可以像函数一样被调用。1. 可像函数一样调用通过重载()运算符,函数对象的实例可以像普通函数那样使用对象名加上括号及参数的形式来调用,就好像它本身就是一个函数。public:// 像调用函数一样调用函数对象2. 可携带状态函数对象是一个类的实例,它可以拥有成员变量,这使得它能够在多次调用之间保存和维护状态信息。
2024-11-29 14:08:22
469
原创 c++总复习
虚继承(Virtual Inheritance)是解决多继承中“钻石问题”的一种机制。当一个类从两个基类继承相同的父类时,虚继承可以确保这个公共的父类只有一份拷贝,而不是每个继承的类都会有一个拷贝。(Diamond Problem),即当两个基类有共同的父类时,子类会继承两份该父类的成员,从而导致不确定性和重复数据。通过虚继承,C++ 确保只有一个基类副本,避免了冲突和不一致。也就是说,一个子类可以有多个父类,这使得子类能够继承多个父类的属性和方法。通过虚继承,C++ 确保基类。
2024-11-26 14:37:27
352
原创 c++总复习
Lambda 表达式是 C++ 引入的一种简洁的方式,用来定义匿名函数(即没有名字的函数)。它允许你在代码的任何地方嵌套定义临时函数,通常用于需要短期使用的简单逻辑,避免单独定义函数的麻烦。捕获方式描述[x]按值捕获变量x,拷贝到 Lambda 内[&x]按引用捕获变量x,对其修改会影响外部[=]隐式按值捕获所有外部变量[&]隐式按引用捕获所有外部变量[this]捕获当前类对象的this指针[x, &y]混合捕获:按值捕获x,按引用捕获yC++14 捕获方式:移动捕获,捕获对象所有权。
2024-11-26 14:28:25
405
原创 c++总复习
它提供了一种更方便、更具表达力的方式来引用某个类型,使得代码在使用复杂类型或者需要根据上下文赋予类型一个更有意义的名称时更加清晰易懂。声明在 C++ 中是非常有用的工具,可以提高代码的可读性、可维护性以及在处理复杂类型场景时提供便利。,它在语法上更加清晰直观,特别是在处理复杂类型(如函数指针类型、模板类型等)时优势明显。函数的地址赋给这两种类型别名定义的函数指针变量,并通过它们调用函数得到结果。类型的别名,可以方便地用于表示容器中存储的数据类型。类型的别名,后续在代码中可以使用。函数所在的作用域,这样在。
2024-11-24 20:28:31
485
原创 c++总复习
在 C++ 中,普通指针在管理动态分配的内存等资源时存在风险,比如忘记释放内存导致内存泄漏,或者对同一块内存进行多次释放导致程序崩溃等问题。智能指针是一种类模板,它的行为类似常规指针,但能够自动管理所指向对象的生命周期,通过在合适的时候自动释放所指向的资源来避免这些常见的指针管理错误。
2024-11-22 15:39:06
663
原创 c++总复习
移动语义是 C++ 11 引入的一种重要特性,它用于优化对象的资源管理,特别是在涉及对象所有权转移的场景中。传统的 C++ 语义在对象赋值或传递给函数时,通常会进行拷贝操作,即创建源对象的一个完整副本,这在处理包含大量资源(如动态分配的内存、文件句柄、网络连接等)的对象时,可能会导致不必要的性能开销,因为拷贝这些资源往往是耗时且消耗额外内存的。移动语义则允许将一个对象的资源 “移动” 到另一个对象中,而不是进行昂贵的拷贝操作。
2024-11-22 15:33:48
633
原创 c++总复习
在 C++ 中,初始化列表是一种在类的构造函数中用于初始化类的数据成员的特殊语法形式。它出现在构造函数的参数列表之后、函数体之前,以一个冒号开始,后面跟着一系列用逗号分隔的数据成员初始化操作。public:// 构造函数体(这里可以添加其他额外的操作,但数据成员已经在初始化列表中初始化了)在上述示例中,MyClass的构造函数接受两个参数n和v,通过初始化列表分别对类中的数据成员num和value进行了初始化。
2024-11-20 17:45:10
782
原创 c++总复习
在 C++ 中,友元函数是一种在类的外部定义,但却可以访问类的私有成员和保护成员的函数。它不属于类的成员函数,却被赋予了特殊的访问权限。例如,假设有一个Rectangle类,用于表示矩形,其中包含私有成员变量length(长)和widthprivate:int length;int width;public:// 声明友元函数// 友元函数的定义在上述代码中,函数被声明为Rectangle类的友元函数,因此它可以直接访问Rectangle类中的私有成员变量length和width。
2024-11-20 17:37:21
645
原创 c++总复习
在 C++ 中,内联函数是一种特殊的函数,它在编译阶段会被编译器尝试直接嵌入到调用它的地方,而不是像普通函数那样进行常规的函数调用(即通过函数栈来传递参数、保存返回地址等一系列操作)。// 定义内联函数// 调用内联函数std::cout << "两数之和为: " << result << std::endl;return 0;在上述代码中,add函数被定义为内联函数,编译器在处理main函数中对add函数的调用时,会尝试将add函数的代码直接嵌入到调用点处,就好像把这行代码直接放在了。
2024-11-20 17:34:00
555
原创 C++总复习
使用const_cast去除const属性后修改原本是常量的对象的值是未定义行为,不同的编译器可能会有不同的处理方式,而且这种行为可能会导致程序在后续运行中出现难以预料的错误。在 C/C++ 编程中,类型转换需要谨慎使用,充分了解各种类型转换方式的特点和适用场景,以避免带来不必要的程序错误。
2024-11-20 17:22:48
953
原创 c++总复习
在 C++ 中,数组的大小必须是一个常量表达式。这里的size是一个常量表达式,它在编译时就确定了值为10,所以可以用它来定义数组array的大小。// 错误,数组大小不能用运行时确定的值。
2024-11-15 18:18:04
423
原创 c++总复习
虚拟内存是一种计算机系统的内存管理技术,它在操作系统的支持下,使得每个进程都感觉自己拥有一整片连续的内存空间,而实际上这些内存空间可能是由物理内存和磁盘上的交换空间(swap space)组合而成的。每个进程都有自己的虚拟地址空间,这个空间是一个从0到某个很大的值(如在32位系统中是0到2^32 - 1,在64位系统中是0到2^64 - 1)的地址范围。进程在运行时,会将自己的虚拟地址映射到实际的物理地址(可能是物理内存中的地址,也可能是磁盘交换空间中的地址)上,以便访问真正的内存资源。
2024-11-15 18:14:12
543
原创 C++总复习
使得代码的正常执行逻辑和错误处理逻辑分开,让主代码路径更加清晰,易于理解和维护。:通过合理地处理异常,可以避免程序因为一些未处理的错误而突然崩溃,让程序在遇到异常情况时能够采取一些适当的措施,如输出错误信息、进行一些清理工作、尝试恢复到一个稳定的状态等。:抛出和捕获异常是有一定性能开销的,尤其是在一些对性能要求极高的场景下,频繁地抛出和捕获异常可能会影响程序的整体性能。:当程序出现异常时,由于异常的传播特性,可能会导致调试变得困难,需要仔细追踪异常的抛出点和传播路径,才能准确找到问题的根源。
2024-11-15 17:57:32
445
原创 C++总复习
命名空间(Namespace)是 C++ 提供的一种机制,用于解决标识符(例如变量、函数、类等)命名冲突的问题。它通过将相关的标识符组织在一起,避免了在大型项目中不同部分使用相同标识符而发生冲突的情况。命名空间能够将不同模块或库的同名标识符区分开,保持代码的整洁和可维护性。在 C++ 中,使用namespace关键字来定义命名空间。
2024-11-13 13:45:36
279
原创 c++总复习
(1) 宏定义是文本替换宏定义是在编译时对源代码进行文本替换,宏会被展开为定义的内容。宏定义不是函数,不参与运行时的调用,在预处理阶段,宏被直接替换为它所代表的内容。示例// 展开为 ((5) * (5))宏 SQUARE(5) 会在编译时被替换为 ((5) * (5))。(2) 宏没有类型检查宏只是简单的文本替换,因此它没有类型检查。当你传递给宏的参数类型不匹配时,不会报错。示例// 编译通过,但可能得到意外结果传入3.14(浮动类型)给宏,虽然不会报错,但SQUARE宏展开后会得到不符合预期的结果。
2024-11-09 14:50:12
785
原创 c++总复习
和是C++中用于泛型编程的工具,允许你编写可以处理不同数据类型的代码。下面分别介绍如何使用函数模板和类模板。函数模板允许你定义一个通用的函数,这个函数可以接受不同类型的参数,编译器会根据函数的参数类型自动推导出函数模板的具体类型。编译器会根据传入的类型推导出T的类型,因此add(x, y)会推导为int类型,而add(a, b)会推导为double类型。类模板允许你定义一个可以使用任意数据类型的类。与函数模板类似,类模板通过类型参数化类的数据成员和成员函数。
2024-11-09 14:39:14
226
原创 c++总复习
newmalloc,具体的可申请大小取决于操作系统和硬件架构。在32位系统上,通常单个进程的最大内存限制为4GB,实际可分配的内存会受限于系统的可用物理内存、虚拟内存大小以及操作系统的限制。在64位系统上,理论上可分配的内存极为庞大,但通常受限于系统配置、内存碎片化、以及操作系统本身的限制。当超出可分配的内存时,new或malloc会返回nullptr或NULL,并且程序应该处理这种异常。
2024-11-09 14:21:22
151
原创 c++总复习
●new 的返回值不需要强制转换,malloc的返回值需要强制转换●new是运算符可以重载(重载是静态多态引导说多态),malloc是库函数(malloc不能重载因为他是c语言的库函数,可以说C和C++编译方式的区别)●new不需要传入想要申请的具体字节个数,malloc需要传入想要申请的具体字节个数●malloc申请失败例如传入参数是负数的情况下返回空,new申请失败会抛出异常(引出异常机制,以及自定义异常类如何实现)
2024-11-09 14:17:10
279
原创 c++总复习
都是C/C++语言中的数据结构,它们的目的是组合不同类型的数据,但是它们在内存布局和使用上有一些重要的区别。但是,可以在结构体外部定义与结构体相关的函数。
2024-11-05 21:38:17
692
原创 c++总复习
运算符对一个已存在的对象进行赋值时被调用的。因此,如果类涉及到动态分配的资源,就需要重载赋值运算符,确保深拷贝,避免资源泄漏或重复释放内存。:拷贝构造函数的作用是确保在对象复制时,能够正确地复制对象的所有数据,并确保资源(例如堆内存)在拷贝时不会出现重复释放的情况。是C++提供的一个强大的特性,允许我们编写与类型无关的代码,即可以在编译时根据传入的类型生成不同的代码。:重载赋值运算符能够保证对象赋值时的正确性,避免浅拷贝所带来的问题,同时防止自我赋值的情况(即对象对自己赋值时),并且正确地释放旧资源。
2024-11-05 21:32:15
710
原创 C++总复习
构造函数的作用是初始化对象的成员变量,确保对象在创建时处于有效的状态。:将数据(成员变量)和操作这些数据的方法(成员函数)封装在一起,对外界隐藏实现细节,只暴露必要的接口。:析构函数是类的另一种特殊成员函数,它在对象生命周期结束时(对象被销毁时)自动调用。析构函数的作用是释放对象占用的资源(如内存、文件句柄等),进行必要的清理工作。:允许一个类从另一个类继承成员(数据和函数),从而实现代码复用。继承可以帮助创建一个新的类(子类)来扩展或修改已有类(父类)的功能。: C++ 类的三大特性是。
2024-11-05 21:23:59
269
原创 c++总复习
返回值为0表示两个字符串相同,返回值小于0表示第一个字符串小于第二个,返回值大于0表示第一个字符串大于第二个。:除了可以使用C-style字符串(字符数组),C++还提供了。:字符串是以字符数组的形式存储,数组的最后一个元素是空字符。类,它封装了字符串的操作,动态管理内存,更加方便。函数来比较两个字符串。,用来标识字符串的结束。在C语言中,可以使用。
2024-11-02 16:07:49
175
原创 c++总复习
内存泄漏内存泄漏是指程序中动态分配的内存未被释放,导致程序在运行过程中占用越来越多的内存,最终可能耗尽可用内存。这通常发生在没有使用delete或delete[]释放不再需要的内存时。避免内存泄漏的方法每次使用new后及时使用delete确保为每个new语句配对一个delete,为每个new[]语句配对一个delete[]。使用智能指针C++11 引入了智能指针,如和,它们自动管理内存,防止内存泄漏。例如:资源管理采用 RAII(资源获取即初始化)模式,确保资源在对象生命周期内被管理,自动释放。
2024-10-31 21:57:03
330
原创 c++总复习
1)递归函数的特点和使用场景:在C语言中,递归是一种强大的编程技术,它允许函数直接或间接地调用自身。递归函数必须有一个或多个基本情况(base case),以便在达到某个条件时停止递归调用,否则它将无限循环下去。下面是一个简单的C语言递归函数示例,它计算一个给定整数的阶乘(factorial):#include <stdio.h>// 递归函数计算阶乘unsigned long long factorial(int n) { if (n == 0 || n == 1)
2024-10-29 14:46:23
144
原创 C++总复习
语句是用于多重分支选择的一种控制结构。选择适当的传递方式可以帮助优化性能和增强代码的安全性。函数参数传递主要有两种方式:值传递和引用传递。
2024-10-27 22:58:05
304
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人