- 博客(30)
- 收藏
- 关注
原创 C++拷贝构造
摘要:C++类中的构造函数可以重载,其中转换构造函数允许单参数的隐式类型转换,使用explicit可以禁止隐式转换。拷贝构造函数用于对象初始化时的值复制,默认提供浅拷贝(指针复制地址),可能导致内存问题,需手动实现深拷贝(分配新内存)。赋值操作符(operator=)与拷贝构造类似但发生在赋值时,同样需要注意浅拷贝问题。空类默认包含无参构造、拷贝构造、operator=和析构函数。当类包含指针成员时,必须重写拷贝构造和operator=实现深拷贝,避免内存错误和数据不一致问题。 (149字)
2025-07-17 22:05:36
1260
原创 list和map的简单使用
本文介绍了C++标准库中list链表和map映射表的基本用法。list链表通过指针链接节点,支持头尾插入/删除(push/pop_front/back)、迭代器遍历和范围for循环。map是键值对(key-value)容器,按键自动排序,支持插入、修改、删除元素,可以通过迭代器或范围for遍历,其中键(key)不可修改。两者都提供empty()、size()等常用操作函数,且erase()操作会返回下一个有效迭代器。map还提供count()方法判断键是否存在。
2025-07-17 21:14:39
574
原创 重载操作类型
摘要:类类型转换操作符通过operator type()格式定义,无参数但需返回指定类型值。当类对象参与运算时,编译器优先查找匹配的操作符重载,若无则调用类型转换。示例中CTest类定义了operator int()转换,将对象转为成员变量m_a的值。通过显式调用operator int()或隐式类型转换,实现了类对象与整型的运算,输出结果为20、30和40。若同时存在运算符重载和类型转换,优先匹配运算符重载。
2025-07-16 21:50:37
197
原创 C++重载操作符
C++运算符重载允许对自定义类型扩展运算符功能,通过operator关键字定义特殊函数实现。分为类内重载(作为成员函数,隐含this指针)和类外重载(需包含自定义类型参数)。重载时需注意参数数量、顺序及返回值类型,且不能改变运算符原有特性(如优先级、操作数数量)。部分运算符(如=、[])必须类内重载,而sizeof、?:等运算符不可重载。使用时需避免类内类外重载冲突导致的二义性问题,示例展示了++、+等运算符的重载实现及输入输出流的友元重载方式。
2025-07-16 21:37:58
833
原创 C++宏定义-宏定义与函数的区别-宏的代替方案
本文介绍了C/C++中宏定义(Macro)的基本概念和使用方法。宏通过#define指令定义,在预处理阶段进行文本替换,适合简单常量和代码块替换。文章详细说明了宏的参数传递、多行替换、常见问题(如表达式计算错误)及解决方法(使用括号确保安全)。同时对比了宏与内联函数的优劣:宏无类型检查且难以调试,但效率高;内联函数在保持性能优势的同时解决了类型安全问题。最后总结了宏与普通函数的本质区别,并给出了不同场景下的选择建议,强调宏适合简单替换,复杂逻辑应使用函数或内联函数。
2025-07-16 15:00:23
1031
原创 C++内联函数
摘要:内联函数是C++通过空间换时间提升程序效率的优化手段,编译器会将内联函数调用处直接替换为函数体代码,避免函数调用开销。适用于代码简单、调用频繁的小函数,但不适用于含循环或递归的复杂函数。类内定义的成员函数默认为内联,外部定义需显式声明。inline关键字仅为编译器建议,最终由编译器决定是否内联优化,需权衡内存占用与执行效率。(150字)
2025-07-16 14:07:01
415
原创 程序生成过程
程序编译过程主要包括预处理、编译、汇编和链接四个阶段:预处理阶段处理头文件、宏替换等;编译阶段进行语法分析生成汇编代码;汇编阶段将代码转换为机器指令;链接阶段组合目标文件生成可执行程序。编译期完成程序构建,运行期实现程序功能。类是编译期概念,定义成员访问权限;对象是运行期实例化产物。
2025-07-16 13:16:50
522
原创 头文件与源文件及区别
摘要:头文件与源文件在代码管理中有明确分工,头文件负责声明而源文件负责实现,避免重定义问题。编译时源文件独立编译,头文件不单独参与。类成员函数实现需加类作用域,静态/虚函数需特殊处理。防止头文件重复包含可用#pragma once(效率高)或#ifndef宏(兼容性好但速度慢)。前者直接与编译器交互,后者通过预处理指令判断,在大项目中可能影响编译速度。(149字)
2025-07-15 17:26:58
719
原创 多态实现的原理-多态的缺点-虚析构-纯虚函数
C++多态机制通过虚函数实现,父类和子类各自拥有虚函数列表,对象通过__vfptr指针指向对应虚函数表。子类继承父类虚函数表,重写时会覆盖父类虚函数,新增虚函数则追加到列表末尾。虚析构函数确保父类指针删除子类对象时正确调用子类析构。纯虚函数(抽象类)强制子类实现接口,但抽象类不能实例化。多态存在空间开销(每个对象携带虚表指针)、效率损失(间接调用)和安全隐患(私有虚函数可能被外部调用)等缺点。override和final关键字分别用于强制重写和禁止重写虚函数。
2025-07-15 15:18:10
947
原创 C++多态
摘要:多态是面向对象编程的核心特性,指通过父类指针调用虚函数时,实际执行子类重写函数的行为。C++实现多态需要三个条件:继承关系、父类虚函数(virtual)和子类重写。虚函数通过虚函数指针(__vfptr)和虚函数列表(vftable)机制实现动态绑定,调用流程比普通函数复杂但支持运行时多态。典型应用场景是用父类指针统一管理不同子类对象,使同一操作产生不同结果。虽然虚函数调用效率略低,却是实现多态不可或缺的技术手段。
2025-07-14 21:07:29
862
原创 C++函数指针
本文介绍了函数指针和类成员函数指针的使用方法。函数指针分为直接调用和间接调用两种方式,可通过typedef优化定义。类成员函数指针需要使用::、.、->*运算符,且必须包含类作用域。文章还展示了如何通过函数指针实现多态性,用父类指针调用不同子类的成员函数。代码示例包括普通函数指针、typedef优化、嵌套函数指针、类成员函数指针调用以及仿写多态的实现。这些技术可以提高代码复用性、降低耦合度,实现接口与实现的分离。
2025-07-14 16:35:56
748
原创 类之间的纵向关系——继承
摘要:继承是面向对象编程的重要特性,基类(父类)成员通过public/protected/private三种继承方式被派生类(子类)继承。子类对象包含父类成员,内存分布为父类成员在前。继承方式与访问修饰符共同决定成员访问权限:public继承保持原权限,protected继承将public降为protected,private继承将所有成员变为private。子类优先访问自身成员,需用类名::区分同名成员。继承提高了代码复用性,使公共功能只需在父类维护即可作用于所有子类
2025-07-11 17:21:50
1193
原创 C++类之间的横向关系
多个被聚合的对象聚集起来形成一个大的整体,聚合的目的是为了统一进行管理同类型的对象,聚合是一种弱所属关系,被聚合的对象还可以再被别的对象关联,所以被聚合对象是可以共享的。虽然是共享的,聚合代表的是一种更亲密的关系,相当于强版本的关联。完成某个功能与被关联的对象有关,但被关联的对象可有可无。只要二者同意,就可以随时解除关系或是进行关联,被关联的对象还可以再被别的对象关联,所以关联是可以共享的。生命周期:被关联的对象与关联的对象无生命周期约束关系,被关联的对象的生命周期由谁创建就由谁来维护。
2025-07-11 13:44:35
562
原创 揭秘友元函数:访问类私有成员的秘密钥匙
友元函数是C++中允许非成员函数访问类私有成员的特殊机制。通过在类内用friend关键字声明,友元函数可以突破封装限制直接访问类的私有数据。示例代码中show()函数被声明为CTest类的友元,因此能直接输出其私有成员a的值。友元关系具有单向性和不传递性,主要用于需要频繁访问类内部数据的特殊场景。正确使用友元函数可以增强灵活性,但过度使用会破坏封装性。
2025-07-10 21:57:58
341
原创 C++类成员-静态-非静态-常函数
摘要:C++标准规定空类实例占用1字节内存保证地址唯一性。类成员分为静态和非静态:非静态成员属对象独享,非静态成员函数隐藏this指针;静态成员属类共享,无this指针。常函数通过const修饰this指针,限制修改非静态成员,但静态成员不受限。指针常量和常量指针区别在于指针本身或指向内容是否可修改。常量对象只能调用常函数,涉及this指针安全级别转换问题,mutable修饰成员可在常函数中修改。
2025-07-10 21:54:48
1503
原创 C++全局变量与局部变量
本文介绍了C++中变量的分类及其特性。全局变量定义在所有函数外部,生命周期从程序启动到结束,存储在数据段;局部变量在函数内部定义,生命周期限于函数调用期间,存储在栈区。静态全局/局部对象具有文件作用域,静态局部对象首次调用时初始化。临时对象仅存在于当前代码行。文章还对比了栈(自动管理)和堆(手动管理)的内存分配方式,解释了不同变量类型的存储位置和作用域差异。通过代码示例展示了各类变量的构造和析构时序。
2025-07-09 20:48:57
982
原创 C++中访问权限详解
本文介绍了C++类成员的三种访问控制权限:public(公有)、protected(保护)和private(私有)。public成员可以被类内和类外直接访问,适合对外接口;protected成员只能在类内及其子类中访问;private成员仅限类内访问,是默认权限。文章通过代码示例展示了各权限的具体应用场景:公有成员直接对外公开,保护成员对子类开放但对外隐藏,私有成员需通过公有方法访问。最后强调外部无法直接访问保护成员和私有成员,体现了面向对象的封装特性。
2025-07-09 15:15:10
409
原创 构造函数与析构函数
C++中的构造函数和析构函数是类的重要成员函数。构造函数用于初始化对象成员属性,空类中存在默认无参构造函数,若手动重构后编译器不再提供默认构造。一个类可存在多个重载构造函数,对象创建时根据参数自动匹配。析构函数用于清理资源,空类中有默认析构函数,重构后不再提供默认版本,且每个类只能有一个析构函数。析构函数在对象生命周期结束时自动调用,先清理成员申请的额外空间,再回收对象内存。示例中展示了如何重构构造函数初始化成员变量,以及析构函数释放动态内存。正确使用构造和析构函数对资源管理至关重要。
2025-07-09 14:43:21
424
原创 类(class)和结构体区别及访问修饰符
摘要:类(class)是面向对象编程的核心概念,将相关数据和算法封装为一个整体。它作为抽象模板,通过实例化产生具体对象。类包含成员变量(属性)和成员函数(方法),使用访问修饰符(public/protected/private)控制访问权限。私有成员通常通过公有方法提供访问接口。类与对象的关系是抽象与具体的关系,如"人"类与"小明"对象。C++中通过class关键字定义类,创建对象后可使用其成员。
2025-07-09 13:24:34
407
原创 NULL与nullptr区别
摘要:指针初始化时应避免野指针,可用NULL或nullptr。NULL是宏定义的0,而nullptr是空指针关键字。示例代码展示了二者的区别:当函数重载时,NULL可能匹配整数参数,而nullptr明确指向指针类型,需显式转换才能调用特定指针版本。这体现了nullptr在类型安全方面的优势。
2025-07-08 21:08:51
223
原创 左值与右值-左值引用与右值引用
摘要:左值(lvalue)和右值(rvalue)是C/C++中的重要概念。左值代表可寻址的持久对象,如变量;右值代表临时数据或字面量。判断标准包括能否位于赋值号左侧或获取地址。左值引用(&)只能绑定左值,右值引用(&&)专门引用右值,而常量左值引用(const&)可以引用两者。右值引用支持移动语义和完美转发,是C++11的重要特性。这些概念对于理解内存管理和性能优化至关重要。
2025-07-08 17:13:11
1050
原创 引用-引用与指针的区别
引用:使用&符号定义引用,给某个变量起别名,定义引用就要初始化引用与被引用的变量是同一块内存空间,对引用操作就是对原有变量进行操作引用不是值不占用内存空间,且引用一旦被初始化,就不能和在重新引用其他空间。
2025-07-08 17:01:32
354
原创 C++函数重载
摘要:函数重载允许在相同作用域下定义同名但参数列表不同的函数(类型、数量或顺序不同),返回值类型不影响重载。默认参数规则要求从右向左依次指定,调用时可省略右侧参数。两者都能简化代码但可能导致二义性:重载时参数匹配冲突,或默认参数引发调用歧义(如单参数调用同时匹配带默认参数和单参数版本)。使用时应避免参数设计上的冲突,确保调用明确性。
2025-07-07 21:36:29
553
原创 C++中的Const关键字
本文介绍了C++中const关键字的三种用法:1. 常量指针(const int*):可以改变指向但不能修改所指向的值;2. 指针常量(int* const):可以修改指向的值但不能改变指向;3. 常量指针常量(const int* const):既不能改变指向也不能修改指向的值。const关键字用于声明不可修改的常量,提高程序安全性和可读性。文章通过代码示例详细说明了每种类型的特性,强调常量必须初始化且不可更改的特性。
2025-07-05 16:48:04
404
原创 C++ 增强范围for
摘要:增强的范围for循环(for(auto v:arr))是C++11引入的简化数组遍历方式,适用于普通数组、string和STL容器。它等价于传统for循环,但更简洁。通过引用(for(auto &v:arr)可以修改原数组元素值,而直接使用变量v则只能读取。示例展示了两种方式的区别:普通遍历不改变原数组,引用遍历可以修改元素。这种语法提高了代码可读性和编写效率。
2025-07-05 15:18:00
407
原创 C++中的string
C++中的string类提供了字符串操作功能,需包含<string>头文件并使用std命名空间。主要操作包括:初始化(string str="123")、赋值(str="222")、比较(str1==str2)、拼接(str1+str2)和下访问(str[0]='A')。字符串截取使用substr(start,len)函数,注意下标和长度限制。获取长度可用size()或length()方法。
2025-07-02 17:03:28
450
原创 布尔(BOOL)---BOOL与bool的区别
摘要:BOOL是Windows系统中定义的int类型别名,占用4字节内存空间,使用TRUE/FALSE值;而bool是C++原生关键字,仅占1字节,使用true/false值。前者需包含windows.h头文件,后者属于标准C++。两者在内存占用和取值标识上存在明显差异,BOOL适合Windows编程接口,bool更适合标准C++开发。
2025-07-02 16:24:47
357
原创 C++动态申请空间与C申请空间区别
C和C++动态内存管理对比:C使用malloc/free函数,需显式指定空间大小并强制转换类型;C++使用new/delete关键字,自动计算空间大小并返回正确类型指针。new支持初始化,处理数组更方便,且会调用构造函数/析构函数。C++还提供智能指针减少内存泄漏风险。关键区别在于:new是运算符,malloc是函数;new自动计算大小,支持初始化;new/delete会调用构造/析构函数。二维数组申请时需注意维度声明方式。释放内存后建议将指针置空,避免重复释放。
2025-06-30 16:58:08
431
原创 【C++入门】C语言与C++的本质区别及C++拓展基本要素
摘要: C与C++的主要区别在于编程范式:C是面向过程语言,注重高效执行,适用于嵌入式开发等性能敏感场景,但缺乏模块化设计;C++是面向对象语言,通过封装、继承和多态提升代码复用性、扩展性和维护性,适合大型项目,但性能开销较大。C++的输入输出使用cin/cout(需iostream头文件),兼容C的printf/scanf。命名空间(namespace)解决作用域冲突,可通过using声明或作用域运算符::访问。C++还支持类、泛型编程和STL库,强化了代码组织能力。
2025-06-23 11:33:04
598
原创 Windows出现This application failed to start because no Qt platform plugin could be initia因为没有QT平台可以初始化
解决Windows出现This application failed to start because no Qt platform plugin could be initia因为没有QT平台可以初始化
2025-04-29 13:56:10
1120
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅