
C++语法相关
文章平均质量分 74
c++知识积累与学习
winds~
纸上得来终觉浅,绝知此事要躬行。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
c++函数返回值完整总结
T// 规则1:完整表达式结束时析构// 临时对象在分号处析构// 规则2:引用延长生命周期// 临时对象活到ref作用域结束// 规则3:赋值时立即拷贝并析构临时对象// 临时对象拷贝给obj后立即析构// 规则4:链式调用中的中间临时对象// method1返回的临时对象在整个表达式结束时析构。原创 2025-07-30 23:50:31 · 928 阅读 · 0 评论 -
右值引用与移动语义
在C++中,每一个表达式要么是左值,要么是右值。这是理解右值引用的基础。左值 (Lvalue):可以看作是“有名字、有固定地址”的对象。你可以对它取地址(使用运算符),并且它在表达式结束后仍然存在。简单来说,它像一个有门牌号的房子,你可以反复访问它。例子// x 是一个左值// s 是一个左值// p 是一个左值右值 (Rvalue):可以看作是“临时的、匿名的”对象。它通常是表达式计算过程中产生的中间结果,在表达式结束时就会被销毁。你不能对它取地址。简单来说,它像是你计算2+3时脑海里闪过的那个5。原创 2025-07-29 14:53:15 · 958 阅读 · 0 评论 -
c++中模板的特化与偏特化
完全特化和偏特化都是C++模板特化的重要形式,用于为模板提供特定类型或类型组合的专门实现。完全特化针对所有模板参数,适用于需要为特定类型提供完全不同实现的情况。偏特化针对部分模板参数,适用于需要处理特定类型组合但又保持一定通用性的情况。类模板支持完全特化和偏特化,而函数模板仅支持完全特化。当需要模拟函数模板的偏特化行为时,可以使用函数重载或辅助类模板来实现。理解并正确应用模板特化和偏特化,可以显著提高C++代码的灵活性和性能,同时保持代码的可读性和可维护性。原创 2024-11-28 11:13:24 · 680 阅读 · 0 评论 -
c++类模板成员函数的特化
模板成员函数是指类中的某个成员函数本身是一个模板,可以接受不同的类型参数。这意味着即使类本身不是模板,某些成员函数仍可以根据需要处理不同类型的数据。模板成员函数的声明和定义方式取决于类是否是模板类。以下将分别介绍非模板类和模板类中的模板成员函数。类成员函数作为模板函数在C++中提供了强大的灵活性,使得类在保持非模板的同时,部分成员函数可以处理多种类型的数据。这种设计模式在许多场景下非常有用,如通用打印、比较、转换等操作。原创 2024-11-28 11:08:23 · 1372 阅读 · 0 评论 -
c++如何绑定一个类与类内成员的关系
在 C++ 中,类的定义明确地声明了其成员函数和成员变量。public:// 函数实现在上述代码中,memberVar和被明确地定义为MyClass的成员。类定义与作用域:成员函数和成员变量在类定义中被明确声明,作用域解析确保了它们的归属。编译器符号表与名称查找:编译器使用符号表和名称查找规则来解析和绑定成员。虚函数表与虚函数表指针:支持多态性,确保通过基类指针调用派生类的重写函数。静态成员的存储管理:静态成员变量和静态成员函数与类本身关联,存储在数据段中。名称修饰。原创 2024-11-11 16:14:41 · 825 阅读 · 0 评论 -
c++中的变量与常量
常量(Constant):常量的值在整个程序运行过程中不可修改,通常是用const或constexpr修饰的。const变量:表示值在运行时不可修改,但它仍然是一个变量,占用内存空间,并且可以在运行时初始化。constexpr常量:表示编译时已知的常量,必须在编译时确定其值。const变量与常量的区别const变量:变量的值不可修改,但它依然是一个变量。它可以在运行时初始化,其值在程序运行期间保持不变。常量:通常是指程序中不可改变的值(如const或constexpr修饰的常量)。原创 2024-11-11 16:01:06 · 469 阅读 · 0 评论 -
c++中的左值与右值
等号右边的值可以是左值,也可以是右值,这取决于值是否具备持久的内存地址。左值:是具备持久内存地址的对象,可以取地址,可以出现在赋值语句的左边(或右边)。右值:是没有持久内存地址的临时对象,通常不可取地址。右值在表达式中通常是临时计算出来的结果。原创 2024-11-11 15:35:18 · 329 阅读 · 0 评论 -
STL-list容器的使用
std::list是C++标准模板库(STL)中的一个容器,基于双向链表实现。它允许在任意位置高效地插入和删除元素,但不支持随机访问(如通过索引访问元素)。适用于需要频繁进行中间插入和删除操作,而不需要快速随机访问的场景。std::list是一个基于双向链表的容器,适用于需要频繁在中间位置进行插入和删除操作的场景。它提供高效的插入和删除性能,但不支持随机访问,内存开销较大,且缓存局部性差。在选择使用std::list之前,应权衡其优势和劣势,并考虑是否有其他更适合的容器(如或std::deque使用建议。原创 2024-11-09 10:53:01 · 1270 阅读 · 0 评论 -
虚函数和纯虚函数
虚函数是在基类中声明的,可以在派生类中被重写(覆盖)的函数。它允许通过基类指针或引用调用派生类中的函数实现,从而实现运行时多态。public:特性虚函数(Virtual Function)纯虚函数(Pure Virtual Function)定义实现可以在基类中实现不在基类中实现,派生类必须实现类类型基类可以实例化基类是抽象类,不能实例化强制性派生类可以选择实现或使用基类实现派生类必须实现,或者继续保持抽象典型用途提供可选的默认行为定义接口,强制派生类实现特定行为。原创 2024-11-09 10:46:29 · 2251 阅读 · 0 评论 -
智能指针中的循环引用具体解决流程
参考这篇。原创 2024-11-08 11:13:15 · 182 阅读 · 0 评论 -
ubuntu中安装matplotcpp绘图
在 Ubuntu 上,你需要安装 python-matplotlib 包,该包只是使得python环境中有 matplotlib 库,如果已经安装可以跳过,包含了 Python 3 的开发头文件、静态库和编译工具,主要用于编译和构建 C/C++ 扩展模块或其他依赖 Python 3 的底层代码。:提供了 Python 3 的静态链接库文件,允许开发者将 Python 3 嵌入到 C/C++ 程序中。是为需要与 Python 3 交互的 C/C++ 扩展或其他底层开发工具提供的支持包。原创 2024-11-06 17:40:06 · 849 阅读 · 0 评论 -
c++中的类设计需要考虑哪些东西
在 C++ 中,构造函数的种类主要包括默认构造函数、带参数的构造函数、拷贝构造函数、移动构造函数和委托构造函数。每种构造函数都有其特定的使用场景和目的,可以根据需求选择合适的构造函数类型。原创 2024-10-29 15:59:59 · 404 阅读 · 0 评论 -
c++中的this指针
构造函数主要是对类内的成员变量进行初始化;一般常用初始化列表进行成员变量的初始化;这里重点是,构造函数调用之前,该对象的内存已经被分配;调用构造函数是为了对成员变量初始化。在初始化列表中,成员变量尚未初始化,因此不能使用this指针访问或修改成员变量。若不用初始化列表,在构造函数内部利用this指针进行初始化,构造函数中的成员变量在函数体执行时已经被默认初始化,但具体的初始值取决于它们的类型。故使用this指针在构造函数体内使用this指针是安全的;原创 2024-10-28 15:15:53 · 393 阅读 · 0 评论 -
c++中的可调用对象
在 C++ 中,只要一个对象可以通过()运算符调用,就被视为可调用对象。普通函数函数指针Lambda 表达式函数对象(仿函数)这些不同的可调用对象在 C++ 中提供了丰富的功能,用于实现更灵活的回调、函数参数传递和泛型编程。原创 2024-10-28 10:38:12 · 478 阅读 · 0 评论 -
c++的头文件到底应该怎么写?
因为头文件的内容会被多个 .cpp 文件包含,如果放置定义,会导致同一个符号(变量或函数)在多个文件中被定义,违反了"定义只能有一次"的规则。为了避免这个问题,我们通常在头文件中只包含变量或函数的声明,而将它们的定义放在对应的源文件中。总之,头文件的编写需要遵循一定的规则,合理划分声明和定义,并且要注意使用头文件保护措施。这就是为什么我们通常遵循这样的规则:在头文件中只写声明,而在源文件中写定义。头文件的作用是供其他的 .cpp 文件包含,它们本身不直接参与编译,但其内容会在多个 .cpp 文件中被编译。原创 2024-10-23 22:20:39 · 839 阅读 · 0 评论 -
c++中在头文件定义类为何不会导致类的重定义
在C++中,我们通常将类的定义写在头文件中,然后在多个源文件中包含该头文件。在编译过程中,预处理器会将头文件中的内容复制到包含该头文件的源文件中。因此,虽然多个源文件都包含了相同的类定义,但在编译时,每个源文件都会有一份独立的类定义副本。,我们可以安全地在多个源文件中包含同一个头文件,而不会导致类的重定义问题。为了防止在同一个源文件中多次包含同一个头文件导致的重定义问题,我们通常使用头文件保护符(header guards)或。总之,将类的定义写在头文件中是C++中的常见做法,通过头文件保护符或。原创 2024-10-23 22:08:01 · 294 阅读 · 0 评论 -
c++中虚函数表属于类还是属于对象?
虚函数表(vtable):这是一个由编译器生成的静态数据结构,用于支持运行时的动态绑定。每个包含虚函数的类(基类或派生类)都有一个对应的虚函数表。虚指针(vptr):每个对象内部通常包含一个隐藏的指针,称为虚指针,指向所属类的虚函数表。这个指针由编译器自动管理,程序员通常无需直接操作。虚函数表(vtable)是类级别的数据结构,每个具有虚函数的类都有自己的虚函数表。虚指针(vptr)是对象级别的,每个对象包含一个指向其所属类虚函数表的指针。原创 2024-10-20 10:47:40 · 895 阅读 · 0 评论 -
c++编译过程哪个阶段会进行语法检查?
【代码】c++编译过程哪个阶段会进行语法检查?原创 2024-10-20 10:16:25 · 164 阅读 · 0 评论 -
C++中库和包的区别
库是具体提供功能的代码集合,开发者在项目中调用这些功能。包是包含一个或多个库及其相关资源的整体单元,通常通过包管理器进行管理和分发。理解这两者的区别有助于更好地组织项目结构、管理依赖关系,并提升开发效率。原创 2024-10-19 11:38:38 · 632 阅读 · 0 评论 -
c++using关键字的用法
在C++中,using。原创 2024-10-16 17:17:29 · 562 阅读 · 0 评论 -
c++项目中无法跳转到头文件/无法搜索到头文件
VSCode 中无法跳转到某些头文件的问题,尽管项目可以成功编译。原创 2024-10-16 14:58:07 · 1164 阅读 · 0 评论 -
C++单例模式
使用 C++11 及以上标准,可以利用语言特性简单、高效地实现线程安全的单例模式。需要注意的是,单例模式也有其缺点,可能引入全局状态,影响代码的可测试性和可维护性。因此,在设计系统时,应权衡利弊,合理使用单例模式。单例模式(Singleton Pattern)是一种常用的设计模式,确保一个类在应用程序的生命周期内只有一个实例,并提供全局访问点。它适用于需要在整个系统中共享资源或协调行为的场景,例如日志记录、配置管理器、线程池等。下面介绍几种在 C++ 中实现单例模式的方法,包括线程安全的实现和注意事项。原创 2024-10-12 14:48:24 · 511 阅读 · 0 评论 -
C++中的常量-编译期常量与运行期常量
确定时间编译期常量:在编译时确定值。运行期常量:在运行时确定值。编译器优化编译期常量:编译器可以进行常量折叠和代码优化。运行期常量:值在运行时确定,编译器无法进行类似的优化。用途编译期常量用于那些可以在编译阶段完全确定且不会改变的值。运行期常量用于那些需要根据程序的运行时情况动态确定但一旦确定便保持不变的值。编译期常量对程序的性能有好处,因为它们的值在编译时就已经固定,可以使生成的代码更加高效。而运行期常量增加了灵活性,但代价是运行时的计算负担稍大。原创 2024-10-12 10:41:39 · 1238 阅读 · 0 评论 -
01-gcc编译c++过程
GCC将C++程序编译为可执行文件主要分为预处理、编译、汇编和链接四个步骤。每个步骤可以单独执行,也可以通过一个命令一次性完成。掌握这些步骤及其对应的命令,有助于更好地理解编译过程和优化编译选项。原创 2024-10-11 17:12:17 · 771 阅读 · 0 评论 -
c++中带参数的宏
最基本的宏是用#define指令定义的,用于简单的文本替换。#define PI3.14159// 相当于 3.14159 * radius * radiusreturn 0;使用反斜杠可以将宏定义展开为多行,便于阅读和维护。return 0;return 0;return 0;<<return 0;<<return 0;<<return 0;return 0;;return 0;\ name();\ return 0;原创 2024-10-11 17:06:46 · 1225 阅读 · 0 评论 -
c++中的内联函数具体如何展开
当内联函数传入变量作为参数时,编译器会尝试将函数体直接替换到调用点,使用变量的当前值或引用进行计算。内联展开不仅减少了函数调用的开销,还为编译器提供了更多优化机会。然而,程序员应谨慎使用。原创 2024-10-11 17:01:09 · 867 阅读 · 0 评论 -
c++中关于内存的分配时机
在 C++ 的程序运行过程中,变量和函数的内存分配发生在不同的阶段,具体取决于它们的类型及使用场景。原创 2024-10-10 15:33:15 · 847 阅读 · 0 评论 -
C++中的变量与函数的命名规则
的命名需要遵循一定的规则,以确保代码的可读性和编译器的正确解析。遵循上述命名规则和约定,可以使代码更具可读性,方便自己和他人理解和维护。:在整个项目中应保持命名风格的一致,以提高代码的可维护性。:避免过于冗长的名称,但也要确保名称具有足够的描述性。:虽然理论上标识符的长度没有限制,但为了可读性,建议。),因为这可能与系统或编译器保留的标识符冲突。:标识符(变量名和函数名)只能由。的标识符,尤其是双下划线(下划线(_)**组成。、**数字(0-9)是两个不同的标识符。原创 2024-10-08 17:27:37 · 921 阅读 · 0 评论 -
c++包管理工具conan
总的来说,Conan 包作为一个封装了 C++ 库的实体,提供了一个标准化和高效的方式来管理和使用 C++ 库,它处理了从安装、依赖解析到版本控制等多个方面的问题,极大地简化了 C++ 开发中的库管理工作。这对于大型项目和需要跨平台兼容性的开发尤为重要。Conan 的 “仓库(repository)” 概念是指存储并管理Conan包的位置。这些仓库可以是公共的或私有的,并且可以位于本地或远程服务器上。使用仓库可以方便地分享和重用C/C++库和项目。原创 2024-10-07 22:16:01 · 914 阅读 · 0 评论 -
Conan、APT 和 dpkg区分
Conan、APT 和 dpkg 都是功能强大的包管理工具,但它们服务于不同的需求和生态系统。Conan 主要面向 C/C++ 开发者,管理项目级别的库依赖;APT 是 Debian 系列 Linux 发行版的高级包管理工具,简化系统级软件的安装与维护;dpkg 则是 APT 的底层工具,负责具体的软件包操作。理解它们各自的用途和特点,可以更有效地选择和使用适合的包管理工具,提升开发和系统管理的效率。原创 2024-10-07 13:39:55 · 901 阅读 · 0 评论 -
STL-优先级队列使用总结
比较器的定义通过返回值直接影响元素在优先队列中的排列顺序。当比较器返回true时,表示第一个元素的优先级较低,优先队列会相应地调整元素顺序,以保持堆的特性,从而确保提取时总是获得优先级最高的元素。原创 2024-10-06 23:04:32 · 582 阅读 · 0 评论 -
STL-c++中的容器
这些容器各自有不同的特性和适用场景,选择合适的容器可以有效提高程序的性能和可读性。原创 2024-10-06 22:48:54 · 329 阅读 · 0 评论 -
STL-unordered_set容器总结
int x;int y;原创 2024-10-06 22:32:32 · 399 阅读 · 0 评论 -
C++-匿名空间
/ 这里的符号在文件外不可见// 函数实现匿名命名空间是 C++ 中一种有效的作用域管理工具,可以避免命名冲突,封装实现细节,并提高代码的可维护性。它是现代 C++ 编程中推荐的做法,尤其是在处理复杂项目时。原创 2024-10-06 22:21:20 · 569 阅读 · 0 评论 -
ubuntu20.04系统下,c++图形库Matplot++配置
linux下安装c++图形库Matplot++,使得c++可以可视化编程;安装Matplot++之前,需要先安装一个gnuplot,因为Matplot++是依赖于此库。原创 2024-09-28 18:14:52 · 1558 阅读 · 0 评论 -
静态链接库与动态链接库的用法
静态库是一组目标文件(.o 文件)的集合,打包成一个归档文件(.a 文件)。在编译时,静态库的代码被复制到可执行文件中。在 C++ 开发中是非常重要的知识点。以下是对它们的详细介绍,包括创建、使用方法以及它们之间的区别。多个程序可以共享同一个动态库,节省内存和磁盘空间。在运行时加载,节省磁盘和内存空间,但需要管理库的存在和版本。在编译时链接,生成的可执行文件独立性强,但体积较大。是 C++ 开发中管理代码复用和模块化的重要方式。动态库是在程序运行时加载的库,文件扩展名为。原创 2024-09-28 16:46:40 · 1065 阅读 · 0 评论 -
排序函数与lamada表达式联用实现更复杂的排序
Lambda 表达式在使用std::sort进行排序时提供了极大的灵活性,允许你在不创建额外比较函数的情况下,快速定义排序规则。这种方式使代码更简洁,也更易于维护和理解。原创 2024-09-22 13:58:39 · 610 阅读 · 0 评论 -
c++中头文件包含内容以及为何不可重复包含头文件
当一个头文件被多个源文件包含,或者在同一个源文件中被间接多次包含时,如果没有包含保护,以上提到的实体可能会被重复定义或声明,导致编译错误或链接错误。使用包含保护可以确保头文件的内容在同一个翻译单元中只被处理一次,避免重复定义和声明的问题。在头文件中通常不包含函数的具体实现(模板和内联函数除外),以避免链接时的重复定义错误。通过理解这些规则,可以编写更健壮的C++代码,避免因重复定义导致的编译和链接错误。关键字的函数,其实现通常放在头文件中。函数(即提供函数的实现)是不允许的。,防止头文件被重复包含。原创 2024-09-13 15:53:00 · 1020 阅读 · 0 评论 -
禁用拷贝构造函数和赋值构造函数
在C++中,禁用拷贝构造函数和拷贝赋值操作符的方式通常是为了防止类的对象被意外复制,这对于那些管理独占资源或不应被复制的对象尤为重要。您展示的代码确实禁用了这两种成员函数,但仅仅是声明了它们,并没有明确地禁用。这样的声明通常会在类的私有部分,防止外部直接访问,但关键是这些成员函数应该在私有部分且不提供实现,或者使用现代C++的更明确方式。从C++11开始,更推荐的方式是使用= delete关键字直接在声明时禁用这些函数。这样做不仅代码更清晰易懂,而且能够在编译时提供更好的错误消息,而不是在链接时。原创 2024-09-24 15:07:52 · 489 阅读 · 0 评论 -
递归的时间复杂度分析
确定回溯算法的时间复杂度通常比较复杂,因为它取决于搜索空间的大小以及你的剪枝效率。在提供的算法中,你正在生成从1到n的所有长度为k的组合。分析这类算法的时间复杂度时,我们通常需要考虑递归树的所有可能路径。原创 2024-09-15 15:23:26 · 459 阅读 · 0 评论