C++学习/笔记
文章平均质量分 72
记录学习重难点
Tian Meng
大二C++选手,目前在学习C++,Linux网络编程
展开
-
if constexpr
是C++17中引入的一个新特性,它在模板编程中尤其有用。这个特性使得根据模板参数在编译时选择不同的代码路径成为可能。让我们逐步了解它的工作原理和应用场景。原创 2023-11-24 19:22:25 · 639 阅读 · 0 评论 -
constexpt
是C++11引入的新的关键字,它用于在编译时而非运行时计算函数或变量的值。这个特性对于提高程序效率和优化代非常有用。编译时常量(Compile-time Constants)和运行时常量(Runtime Constants)是指常量在程序执行过程中被确定的时间点不同。编译时常量是指其值在程序编译阶段就已经确定并嵌入到代码中的常量。它们通常是直接赋值的,或者通过在编译时可解析的表达式计算得到。特点:由于它们的值在编译时就已确定,因此运行时无需再计算,这可以提升程序运行效率。编译时常量通常直接存储在程序的只读数原创 2023-11-23 22:14:29 · 256 阅读 · 0 评论 -
可调用对象的绑定器和包装器
在C++中,可调用对象是一个广泛的概念,涵盖了任何可以通过函数调用运算符()调用的实体。这些对象不仅包括普通函数和类的成员函数,还包括对象,这些对象可以像函数一样调用。原创 2023-11-03 17:22:47 · 114 阅读 · 0 评论 -
C++11线程
创建线程需要包含头文件<thread>,使用线程类。原创 2023-10-31 13:34:00 · 113 阅读 · 0 评论 -
noexcept
运算符通常与模板和通用编程一起使用,使得函数或类模板可以基于其模板参数的异常保证来调整其行为。这是一种在编译时进行异常安全性检查的方法。是 C++11 引入的一个关键字,它用于指定一个函数是否会抛出异常。具体地说,如果你知道一个函数不会或不应该抛出任何异常,你可以使用。运算符用于在编译时检查表达式是否可能抛出异常。它返回一个布尔值,如果表达式保证不抛出异常,它返回。是否可能抛出异常,并根据结果选择不同的行为。来在编译时检查传递给它的函数。原创 2023-10-25 16:43:25 · 134 阅读 · 1 评论 -
lambda函数
lambda函数是C++11中新增的非常有用的特性,它允许你在需要函数对象的地方,如for_eachsort等算法,直接定义一个匿名函数。Lambda函数简洁、高效,也为编写现代C++代码提供了更多的便利。原创 2023-10-25 16:30:16 · 182 阅读 · 0 评论 -
委托构造和继承构造
在实际开发中,为了满足不同的需求,避免代码冗余,c++11引入了一个新的构造函数——委托构造。它允许一个构造函数委托给类中另一个构造函数来进行实际的构造过工作。这样的特性主要是为了减少多个构造函数中重复代码,从而提高代码的可维护性。委托构造不好进行文字讲解。原创 2023-10-24 21:38:32 · 91 阅读 · 0 评论 -
cpp断言
Cpp中的断言是一种调试工具,用于开发过程中的假设。其主要目的是捕获程序中的逻辑错误。当某个条件为false时,断言会触发一个运行时的错误,从而使开发者能够及时地知道并处理这个错误。使用断言需要包括头文件<cassert>或<assert.h>这两个头文件都提供了一个才参数的宏,用于运行时进行断言。这里的expression是一个bool表达式,如果值为真,则断言不会有任何效果,程序会继续正常运行。但是如果他的值为假,则断言会生成一个错误信息,并使程序终止。原创 2023-10-24 21:07:52 · 281 阅读 · 0 评论 -
智能指针
unique_ptr。原创 2023-10-22 13:35:36 · 139 阅读 · 0 评论 -
时间操作chrono库
类模板表示的,它表示两个事件之间的时间差。这个模板包含两个参数:一个是代表时间的数值类型(Rep),另一个是一个比率类型(Period),表示每个时间单位代表的秒数的分数。已经定义了一些常见的duration类型,用于表示常用的时间单位,如小时、分钟、秒等。在许多情况下,开发人员需要测量特定操作的执行时间,例如性能测试、基准测试或简单的时间追踪。这个模板类在内部使用Rep类型的变量来存储时间长度,并使用Period来解释这个值代表的时间单位。结构体的指针,它包含了本地时间(考虑了时区的时间)。原创 2023-10-19 19:29:13 · 259 阅读 · 0 评论 -
C++11常用新特性——可变参数模板
可变参数模板使用一个名为"parameter pack"的概念来表示任意数量的参数。C++11中,可变参数模板是一个非常强大的特性,它允许函数和类模板接受任意数量和类型的参数,这为类型的安全编程提供了更广泛的灵活性。C++中没有直接展开参数包的内建方式,但你可以通过递归模板函数或基于逗号表达式的技巧来实现。可变参数模板允许你传递多个类型和数量不定的参数给一个函数或类。可变参数模板的一个常见用途是构建灵活的元组或类似元组的结构。这样的C风格技术来处理不定数量的参数,这些方法通常类型不安全且难以管理。原创 2023-10-19 19:28:27 · 300 阅读 · 0 评论 -
C++11常用新特性——完美转发
在早期的 C++ 中,当你通过一个函数向另一个函数传递参数时,参数的左值/右值属性会丢失,这意味着即使有可用的移动构造函数,编译器也只能调用拷贝构造函数。为了解决这个问题,C++11 引入了新的工具和概念:右值引用和移动语义,所以,能否实现完美转发,决定了该参数在传递过程使用的是拷贝语义还是移动语义。是通过模板推断得来的,那么这个参数就不是一个普通的右值引用,而是所谓的“通用引用”或“转发引用”。的参数是一个右值引用,它就会返回一个类似的右值引用,如果传递的是左值引用,它就返回一个左值引用。原创 2023-10-19 19:27:35 · 129 阅读 · 0 评论 -
C++11常用新特性—— 移动语义
*移动语义的主要目标是避免不必要的对象复制,特别是那些拥有动态分配的资源(如堆内存)的对象。**之前在C++98/03中,我们仅仅有拷贝构造和拷贝赋值,这意味着任何时候对象被复制或赋值时,其资源都会被复制,这很可能导致效率问题。在资源被移动之后,源对象仍然处于一个有效的状态,但其具体内容是未定义的。从 C++11 开始,标准库中的许多容器和算法都被优化以利用移动语义,特别是那些涉及到对象传递的操作。)或不含动态分配资源的小对象,拷贝的代价很小,移动构造并不会带来太多优势,有时甚至可能是多余的。原创 2023-10-19 19:26:50 · 115 阅读 · 0 评论 -
C++11常用新特性——右值引用&&
左值引用, 使用 T&, 只能绑定左值。右值引用, 使用 T&&, 只能绑定右值。已命名的右值引用是左值。常量左值,使用 const T&, 既可以绑定左值又可以绑定右值。原创 2023-10-19 19:26:01 · 154 阅读 · 0 评论 -
C++11常用新特性——decltype
在C++中,用于查询表达式的数据类型的操作符,该操作不是实际执行该表达式。可以与尾随返回类型结合使用,以便推断函数的返回类型。这特别适用于模板函数,因为我们可能不总是知道参数的具体类型和它们之间的操作结果。在泛型编程中,尤其是设计到复杂的操作和多种类型时,确定返回值的类型可能会变得非常复杂。但是,从C++14开始,编译器得到了加强,可以自动推断函数的返回类型,而无需使用。关键字允许对变量的类型进行自动推导,它主要是基于变量的初始化表达式来工作的。评估表达式的类型,但不实际计算表达式的值。原创 2023-10-19 19:25:08 · 140 阅读 · 1 评论 -
C++11常用新特性——自动推导类型auto
在C++中,用于查询表达式的数据类型的操作符,该操作不是实际执行该表达式。现在成了一个类型的占位符,它告诉编译器查看变量的初始化器表达式,并使用该表达式的类型来确定变量的类型。这对于避免编写冗长的类型名称,特别是涉及模板的类型名称,非常有用。表示的就是"半个"类型,而不是完整的类型,从而使得类型推导更灵活。关键字允许对变量的类型进行自动推导,它主要是基于变量的初始化表达式来工作的。关键字用于指定变量的存储期,但在C++11中,它的功能被改为类型推导。评估表达式的类型,但不实际计算表达式的值。原创 2023-10-19 19:24:06 · 522 阅读 · 0 评论 -
cpp文件操作
当你在处理文件时,经常需要控制文件的读写位置或查询其大小。C++提供了一组非常强大的工具来实现这一目的,下面将详细介绍这些功能及其用法。原创 2023-10-11 21:51:51 · 1301 阅读 · 0 评论 -
STL算法
STL算法由头文件<numeric>和组成的。其中****:这是STL中最大的头文件,包括了各种常用算法,如:比较,交换,查找,遍历,复制,修改,排序等相关操作。<numeric>这个头文件相对较小,他主要包括了序列上进行数学运算法的模板函数。如:累积,内积,部分和,相邻差异等。这个头文件定义了一些模板类,用于声明函数对象(也称为仿函数)。这些函数对象经常用于STL算法中,特别是那些需要自定义比较或操作的算法。如:比较,逻辑操作等。原创 2023-10-08 17:35:30 · 114 阅读 · 0 评论 -
STL容器
C++ STLSTL实现原理及其实现STL(Standard Template Library,标准模板库),提供了六大组件,可以相互之间组合套用,这六大组件分别是:容器(Containers),算法(Algorithms),迭代器(Iterators),仿函数(Functors),适配器(Adaptors),空间配置器(Allocator)。STL六大组件的交互关系:容器通过空间配置器取得数据存储空间。算法通过迭代器访问和处理容器中的内容。仿函数可以协助算法完成不同的策略变化。仿函数类似函数原创 2023-10-01 13:18:30 · 168 阅读 · 0 评论 -
Cpp异常概述
创建异常类自定义异常通常通过继承标准的exception类来创建。覆盖what()方法,返回描述异常的字符串。抛出自定义异常使用throw关键字,如同使用内置异常一样。捕获自定义异常使用try/catch块捕获自定义异常,与捕获内置异常相同。// 1. 创建自定义异常类public:// 2. 抛出自定义异常try {catch (const DivideByZeroException& e) { // 3. 捕获自定义异常return 0;原创 2023-08-17 16:04:37 · 306 阅读 · 1 评论 -
预处理,编译,命名空间,类型转换
define用于宏定义,宏定义可以在源文件中定义常量或函数。宏定义在预处理阶段被替换。FILEFUNCTIONLINEDATETIMETIMESTAMP当用C++编译程序时,宏__cplusplus就会被定义。如果一个宏没有参数,那么它的定义形式是#define 宏名 宏内容。如果一个宏有参数,那么它的定义形式是(x) : (y))。头文件(*.h或*.hpp):这些文件主要包含函数、结构体、类和模板的声明。此外,它们也包括#include预处理器指令(用于引入其他头文件)、#define。原创 2023-07-31 17:13:26 · 217 阅读 · 0 评论 -
C++类模板
类模板允许我们创建一个可以在工作在多种类型上的类,比如数组,链表,队列,栈等等。其工作原理就是用占位符代替实际的类型,当我们使用这个类模板时,再指定具体的类型。函数模板建议用typename描述通用数据类型,类模板建议用class。上述类模板例子中,MyArray类可以用于创建各种类型的数组。包括, 甚至是等。**需要注意的是,在创建模板类的实例时,我们必须指定模板参数。**例如,我们需要创建一个存储整数的MyArray,我们可以这样写。这里,模板参数时int,表示我们创建的MyArray将存储int。原创 2023-07-23 11:40:24 · 4921 阅读 · 0 评论 -
C++函数模板随笔总结
auto关键字是C++11中的用法。在C++11之前,auto被用作声明自动存储局部变量。最基本的,在C++11中,我们可以使用auto编译器会根据初始化的值自动推导变量的类型。autoautoautoauto然而,autoautoautoauto例如,假设我们有一个很长的类型,如,使用auto。原创 2023-07-13 00:43:37 · 104 阅读 · 0 评论 -
继承和派生 练习
【代码】继承和派生 练习。原创 2023-07-11 11:26:33 · 70 阅读 · 0 评论 -
C++的继承与派生
这是因为,如果我们用一个基类指针指向一个派生类的对象,然后删除这个指针,那么如果基类的析构函数不是虚函数,就只会调用基类的析构函数,而不会调用派生类的析构函数。所以,我们一般会将基类的析构函数声明为虚函数,这样,在删除基类指针时,就会首先调用派生类的析构函数,然后才调用基类的析构函数。如果派生类中有与基类相同的成员,那么在通过派生类对象或者派生类的成员函数树进行访问该成员时,会访问到派生类新增的成员,而不是基类的。表示具体的图形对象。基类的指针可以指向派生类的对象,基类的引用可以引用派生类的对象。原创 2023-07-11 10:33:18 · 364 阅读 · 0 评论 -
类的使用~友元 重载运算符
这意味着你可以改变已存在运算符的功能,使它们能用于你自己定义的类型,例如类。例如,原创 2023-07-04 22:32:56 · 454 阅读 · 0 评论 -
new[]&delete[]和new&delete
当你使用new[]分配一个动态数组时,你必须使用delete[]来删除它。delete[]后面应该紧跟一个指针,该指针指向要删除的动态数组。在我们的例子中,data就是这样的指针,所以我们写delete[] data。delete[] 是C++语法中的特定形式,专门用于释放动态数组的内存。与new[]相对应,delete[]被用来删除整个数组。因此,在C++中,使用new[]和delete[]的规则是:任何使用new[]分配的内存,都必须使用delete[]来释放。原创 2023-07-03 11:57:39 · 91 阅读 · 0 评论 -
类的概念 定义
类可以被认为是一种模板,它描述了如何创建对象,对象是类的实例。类定义了对象的数据(称为属性)和可以对这些数据进行的操作(称为方法或函数)public :// 学生的名字 int age;// 学生的年龄 double score;// 学生成绩 // 学习的方法 void study() {} // 考试的方法 void takeExam() {} };原创 2023-06-27 16:13:22 · 3524 阅读 · 0 评论 -
memmove函数
在这个例子中,字符串"hello world!"被移动,使得输出为 “hello hello world!是一个标准库函数,用于 C++ 中的内存操作。它主要用于在内存中移动或复制字节。可以处理源内存区和目标内存区重叠的情况。如果源内存区和目标内存区重叠,此函数会返回指向目标内存区的指针。仍然可以正确地复制字节,而。原创 2023-06-01 00:18:48 · 1236 阅读 · 0 评论 -
重载和内联函数
默认参数是指调用函数的时候,如果不写实参,那么将使用一个缺省值。使用默认参数可以使你的函数更加灵活,同时减少了在不同上下文中为相同的参数重复编写相同的代码的需要。原创 2023-05-28 09:21:02 · 878 阅读 · 0 评论 -
引用 随笔
引用的本质其实就是指针常量*const p引用的底层机制实际上是和指针一样的。不要相信有别名,不要认为引用可以节省一个指针的空间,因为这一切不会发生,编译器还是会把引用解释为指针。引用和指针本质上没有区别。输出的地址都是相同的。原创 2023-05-27 18:25:46 · 794 阅读 · 0 评论 -
C++数据类型
数据类型+原反补码原创 2022-12-18 23:15:27 · 1286 阅读 · 0 评论 -
数组&string
一维数组+字符串string原创 2023-01-03 12:32:36 · 3184 阅读 · 1 评论 -
数据类型强转+随机数实现
可以利用srand((int)(time(NULL))的方法,利用系统时钟,产生不同的随机数种子。要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。要取得(a,b]的随机整数,使用**(rand() % (b-a))+ a + 1;要取得[a,b]的随机整数,使用**(rand() % (b-a+1))+ a;**其中的a是起始值,n是整数的范围。要取得[a,b)的随机整数,使用**(rand() % (b-a))+ a;原创 2022-12-20 17:13:32 · 455 阅读 · 1 评论 -
函数 ~~~
函数概述函数类型函数定于与声明函数参数引用函数可变函数函数可变参数 使用函数默认参数函数返回值函数嵌套调用函数递归内联函数内联函数与普通函数区别函数重载原创 2023-01-04 17:14:52 · 481 阅读 · 1 评论 -
变量作用域 和 多文件编程
变量作用域概念typedef声明局部变量全局变量静态变量c++存储类auto 自动存储类static 静态存储register 注册存储类extern 外部存储类多文件编程多文件编程概念步骤include 和 #include ""的区别防止头文件重复包含使用宏定义避免重复引入使用#pragma once避免重复引用_Pragma操作符原创 2023-01-07 15:33:57 · 513 阅读 · 1 评论 -
修改C++ 中cout默认输出6位精度
默认情况下,cout默认输出6位有效数字(这6位包括小数点前的数字)原创 2023-05-22 15:56:05 · 953 阅读 · 0 评论 -
函数指针/回调函数
指向程序中某一个函数的指针。函数指针可以用来在运行时动态地调用不同的函数,这为编程提供了很大的灵活性。原创 2023-05-22 15:54:46 · 77 阅读 · 0 评论