- 博客(54)
- 收藏
- 关注
原创 C++ 中多态性在实际项目中的应用
描述:在图形绘制系统中,可能有多种图形,如圆形、矩形、三角形等。通过多态性,可以定义一个基类(如Shape),其中有一个纯虚函数draw()。然后每个具体的图形类(如Circle、Rectangle、Triangle)都继承自Shape并实现自己的draw()函数。描述:C++ 通过private、protected和public访问修饰符来控制类成员的访问权限。private成员只能在类的内部访问,protected成员可以在类及其派生类的内部访问,public成员可以在任何地方访问。
2024-12-12 21:54:59
395
原创 纯虚函数抽象类
纯虚函数法:virtual 返回值 函数名 (参数列表)=0。子类必须重写抽象类中的纯虚函数,否则也属于抽象类。当类中有了纯虚函数,这个类也成为抽象类。无法实例化对象(即无法创建此类的对象)
2024-12-11 21:31:20
174
原创 C++中继承
基类定义:首先定义一个基类,它包含了一些通用的成员变量和成员函数。例如:public:int wheels;派生类定义:使用符号和publicprivate或protected关键字来指定继承方式,然后定义派生类。例如:public:继承的格式:子类 :继承方式 父类,比如 class A :public B 就表示 A 继承 B, 且为公有继承。例如:pravite/*成员属性:private:私有的 只能在本类内访问protected:受保护的 类内和子类访问。
2024-12-07 19:41:26
462
原创 C++中封装
封装可以将数据成员隐藏在类的内部,外部无法直接访问和修改,从而保证了数据的安全性和完整性。只有通过类提供的公共接口才能对数据进行操作,这样可以在接口中对数据的访问和修改进行合法性检查,防止非法操作。:封装将数据和操作数据的方法封装在类的内部,使得代码的结构更加清晰,易于理解和维护。当需要对类的内部实现进行修改或扩展时,只需要在类的内部进行修改,而不需要修改使用该类的外部代码。:封装好的类可以作为一个独立的模块被其他代码复用。通过提供公共接口,其他代码可以方便地使用类的功能,而不需要了解类的内部实现细节。
2024-12-06 19:58:57
407
原创 动态链接静态链接
可能会出现不同程序依赖同一动态库的不同版本的情况,需要进行有效的版本管理,以确保程序的正常运行。:当动态库需要更新时,只需要替换系统中的动态库文件,不需要重新编译使用该动态库的程序。
2024-12-06 19:47:45
449
原创 c++函数重载
函数重载是 C++ 中的一个特性,它允许在同一个作用域中有多个同名函数,但是这些函数的参数列表(参数的个数、类型或者顺序)不同。函数重载的目的是为了让程序员可以用一个函数名来执行相似的操作,只是操作的数据类型或者参数个数等可能不同。
2024-12-05 22:35:02
265
原创 c++内存对齐
基本定义内存对齐是一种计算机内存访问的优化技术。在计算机系统中,数据存储在内存中是以字节为单位的。内存对齐要求各种数据类型的存储地址必须是某个值(通常是该数据类型大小的倍数)的整数倍。例如,对于一个 4 字节的int类型数据,它的存储地址通常要求是 4 的倍数。假设内存地址从 0 开始编号,那么int类型数据可能存储在地址 0、4、8 等位置,而不会存储在地址 1、2、3 等位置。数据存储示例考虑一个包含char(1 字节)、short(2 字节)和int(4 字节)类型的结构体。
2024-12-04 20:26:35
451
原创 自动类型推导auto右值引用和移动语义
auto是 C++ 11 引入的关键字,用于自动类型推导。它可以根据变量的初始化表达式来推断变量的类型。这在处理复杂的类型(如迭代器、lambda 表达式返回值等)时非常有用,可以让代码更加简洁和易读。
2024-12-04 20:01:09
342
原创 C/C++ volatile 关键字的作用
防止编译器优化在 C/C++ 中,编译器会对代码进行优化。例如,当一个变量在一个循环中被频繁读取,并且编译器认为这个变量的值不会在循环过程中改变时,它可能会把这个变量的值缓存起来,而不是每次都从内存中读取。但是对于一些特殊的变量,如硬件寄存器或者被多个线程或中断服务程序访问的共享变量,这种优化是不允许的。例如,考虑一个简单的程序,它从一个硬件设备的寄存器中读取数据: 在这个例子中,关键字告诉编译器,的值可能会在程序不知情的情况下被改变(比如硬件设备更新了寄存器的值),所以编译器每次访问这个变量
2024-11-28 21:38:03
409
原创 C++ 中的 Lambda 表达式
Lambda 表达式是 C++11 引入的一种匿名函数对象的简便写法。它可以在需要函数对象的地方定义一个临时的、小型的函数。Lambda 表达式的语法形式为[capture - list](parameters) -> return - type{ function - body }。
2024-11-25 21:28:25
778
原创 C++ 中的类型别名和 using 声明
类型别名是 C++ 中用于为现有类型创建一个新的名字的机制。在早期的 C 和 C++ 编程中,主要是通过typedef关键字来实现的。例如,如果你有一个比较复杂的类型,如unsigned long long int,你可以为它创建一个更简洁的别名。
2024-11-24 23:22:38
543
原创 移动语义和拷贝语义区别、智能指针
例如,对于一个包含动态分配数组的类,移动构造函数可以将源对象中的指针直接赋值给目标对象,然后将源对象中的指针置为nullptr,这样就避免了重新分配内存和复制数组元素的开销。例如,一个被移动的std::string对象,它内部的字符数组指针可能被置为nullptr,但对象本身仍然可以被正确地析构(因为析构函数知道如何处理这种情况)。例如,一个std::vector对象包含大量元素,当进行拷贝时,需要为新的vector对象分配足够的内存空间,然后逐个复制元素。拷贝语义:适用于需要独立副本的情况,
2024-11-22 23:32:49
654
原创 C++ 中的移动语义
通过定义移动构造函数和移动赋值运算符,并使用右值引用作为参数,可以在合适的场景下(如函数返回值传递、临时对象赋值等)实现移动语义,从而提高程序的性能和资源管理效率。
2024-11-21 23:38:07
439
原创 c++初始化参数列表
类名(参数值):属性1(值1)属性2(值2)属性3(值3){}只能在构造函数中使用引用和常量必须在初始化参数列表中初始化初始化顺序和成员变量的顺序一致可以帮助对象成员调用构造函数const。
2024-11-20 20:02:14
388
原创 友元函数和友元类
在 C++ 中,友元提供了一种突破类的封装限制的机制,允许外部函数或类访问另一个类的私有成员。具体来说,友元函数是在类中被声明为友元的非成员函数,而友元类则是被声明为另一个类的友元的类。友元函数:一个普通函数可以被声明为一个类的友元函数,它虽然不是该类的成员函数,但却可以访问该类的私有和保护成员。例如:private:public:// 可以直接访问 MyClass 的私有成员 privateData友元类。
2024-11-18 21:00:53
317
原创 C++ 内联函数
定义内联函数:如前文所述,在函数声明或定义前加上关键字inline即可定义一个内联函数。既可以在函数声明时添加inline关键字,也可以在函数定义时添加,例如:// 函数声明为内联函数// 函数定义为内联函数a : b;调用return 0;
2024-11-17 21:12:31
405
原创 C/C++ 中的类型转换方式
在进行类型转换时,需要谨慎考虑转换的必要性和合理性,以避免出现上述问题。尽量遵循类型安全的原则,使用合适的类型转换方式,并对可能出现的问题进行充分的测试和验证。
2024-11-16 22:10:33
851
原创 c++虚拟内存
在多任务操作系统中,多个程序可能同时运行。使用虚拟内存为每个程序提供了独立的、从 0 开始的虚拟地址空间,使得不同程序之间的内存地址相互隔离。
2024-11-14 21:34:31
356
原创 C++函数的返回值在内存中的传递过程
在 C++ 中,函数返回值在内存中的传递过程会因返回值的类型不同而有所差异,以下是几种常见的情况:基本数据类型返回值当函数返回基本数据类型(如int、float、char等)时,函数会将返回值存储在一个临时的寄存器中。
2024-11-14 21:31:07
379
原创 c++中异常处理
基本原理:C++ 异常处理机制提供了一种在程序运行期间处理错误和异常情况的结构化方式。它基于try、catch和throw三个关键字来实现。当程序中出现异常情况时,可以使用throw表达式抛出一个异常对象,然后在可能捕获该异常的try块之后的catch块中进行处理。
2024-11-13 16:49:52
1826
原创 宏定义和函数调用的区别
宏定义:使用#define关键字进行定义,通常以一个标识符来代表一段代码片段或一个常量值。定义常量时,形式为#define 常量名 常量值;定义带参数的宏时,形式为#define 宏名(参数列表) 宏体。
2024-11-12 20:58:20
401
原创 C/C++ 中的预处理器指令是什么,有什么用途
指令#define用途:可以定义常量、函数式宏等。定义常量时,能提高代码的可读性和可维护性;定义函数式宏则可以在一定程度上提高程序的执行效率,但要注意其副作用。举例#define PI 3.1415926 // 定义常量 PI(a) : (b)) // 定义宏函数,求两个数的最大值指令#undef用途:取消之前已定义的宏,在需要重新定义宏或者避免宏的冲突时使用。举例// 一些使用 FOO 的代码#undef FOO#define FOO 200 // 重新定义 FOO。
2024-11-12 20:53:36
405
原创 宏定义和函数调用的区别
宏定义:没有参数类型检查。因为它只是简单的文本替换,宏定义中的参数可以是任何合法的表达式。例如,MAX(3 + 2, 4)会被替换为((3 + 2)>(4)?(3 + 2):(4)),不会检查参数的类型是否符合要求。
2024-11-09 18:23:02
460
原创 C++循环引用,如何解决
另一种方法是在合适的时候手动打破循环引用。例如,在对象的析构函数或者其他合适的生命周期结束的方法中,将相互引用的指针设置为nullptr。这种方法需要谨慎设计对象的生命周期和引用关系,确保在正确的时间点打破循环引用,避免内存泄漏和资源浪费。
2024-11-07 22:18:41
563
原创 new或malloc在申请空间时,超出可申请的大小就会分配异常,可申请的大小是多少
编译器在实现new和malloc时也可能会施加一些限制。例如,一些编译器可能会对动态内存分配的大小有内部的检查机制,防止分配过大的内存导致程序出现不可预测的行为。而且,编译器的内存分配策略可能会受到目标平台(如嵌入式系统)的影响。在嵌入式系统中,编译器可能会根据硬件资源的有限性,对new和malloc的可分配内存大小进行严格限制,以确保程序能够在有限的内存环境中正常运行。
2024-11-07 22:07:45
480
原创 c++运算符重载
等)新的功能,使它们能够用于用户自定义的数据类型(如类和结构体)。这样可以让自定义类型的对象像基本数据类型一样使用这些运算符,使代码更加直观和易于理解。运算符重载是指赋予运算符(如。左移运算符在类外进行重载。
2024-11-05 20:31:43
133
原创 拷贝构造(详解)
拷贝构造函数,就像他的名字一样,使来拷贝的,他的作用是把一个已经存在的对象进行拷贝后,用拷贝来的值进行给其他对象赋值和作为返回值和参数等。
2024-11-05 20:27:49
788
原创 构造函数和析构函数
主要用于对成员变量进行赋值,如果没有手动创造构造函数,编译器会自动创造,无需手动调用。4.程序在调用对象时会自动调用,无需手动调用,且只会调用一次。3.构造函数可以有参数,有参构造可以重载。名字和类名相同前面加~(~perion)1.构造函数没有返回值,不写void。在对象释放的时候自动调用析构函数。没有析构函数的时候编译器自动生成。没有返回值不写void。在对象被释放时自动调用。2.函数名与类名相同。
2024-11-04 19:35:47
332
原创 C++ 中类的三大特性
函数,并且重写了它来实现绘制圆形的具体操作。是公共成员函数,通过它可以获取矩形的面积。函数来获取面积,而不需要了解内部是如何计算的。是私有成员变量,外部代码不能直接访问它们。类中,外部代码只需要知道如何调用。)和操作数据的函数(类中进行特定的扩展。
2024-11-04 19:16:57
327
原创 结构体和联合(详解)
依次存储在后面的内存位置。编译器会根据成员的类型和对齐要求来分配内存。不同的编译器可能会有不同的对齐方式,这会影响结构体的大小。结构体成员在内存中是按照定义的顺序依次存储的。数组实际占用 20 字节,那么这个结构体可能会因为对齐而在。数组可能占据一段连续的内存空间,然后。例如,在 32 位系统下,如果。数组本身没有严格的对齐要求,但。的存储地址是 4 的倍数。也是 4 字节对齐。数组后填充一些字节,使得。类型是 4 字节对齐,
2024-11-03 15:47:15
1098
原创 数组名字有什么含义
当把数组名作为函数参数进行传递时,它会自动转换为指向数组首元素的指针。因此,函数参数既可以声明为指针类型,也可以声明为数组类型,但它们在函数内部的行为会略有不同。这表明,在使用数组名时,它会自动转化为指向数组首元素的指针,也就是数组第一个元素的地址。:一旦数组被声明,其名称便成为一个常量指针,指向数组的首个元素。在这种情况下,不能更改数组名的值,也不能将其赋值给其他数组名。运算符时,它会返回整个数组的字节数,而非指针的字节数。这是因为数组名指向的是整个数组,而非仅仅是指向单个元素的指针。
2024-11-01 16:38:47
175
原创 C/C++中数组定义和初始化的方式
动态 int* array = new int[100](1,2);静态 int array[10][10] = { {1,1} , {2,2} };//数组初始化了array[0][0,1]及array[1][0,1]int* array = new int[m][3][4];动态 int* array = new int[m][n];动态 int (*array)[n] = new int[m][n];静态 int array[10][10];
2024-11-01 16:31:50
260
空空如也
传染病sir模型matlab案例代小村亚姆
2024-06-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人