·Jormungand
我会把这个不完美的故事 变成我所期望的样子
展开
-
Google 开源项目风格指南学习笔记——C++篇
虽然在 YuleFox、Yang.Y、acgtyrant等诸位大佬的努力下,Google 开源项目风格指南——中文版已经大幅减轻了我们的学习成本,但是文中部分专业的术语或者表达方式还是让过于萌新的读者(比如说我)在流畅的阅读过程中突遇卡顿,不得不查阅各种资料理清原委,这也是写学习笔记的初衷。原创 2022-08-20 12:08:15 · 4645 阅读 · 0 评论 -
指针、引用以及const限定符、constexpr限定符
文章目录复合类型引用概念与使用引用的定义注意指针概念声明方式取地址符指针值空指针利用指针访问对象赋值和指针void* 指针指向指针的指针指向指针的引用初始化所有指针有多重含义的某些符号const限定符复合类型复合类型是指基于其他类型定义的类型。引用和指针都是复合类型。引用概念与使用引用: 引用并非对象,只是为一个已经存在的对象起了另一个名字,引用即别名。一般在初始化变量时,初始值会被拷贝到新建的对象中。定义引用时,程序把引用和它的初始值绑定(bind) 在一起,而非将初始值拷贝给引用。一旦原创 2021-01-14 23:29:47 · 3081 阅读 · 6 评论 -
Mac 下 CMake 的配置与使用
安装完成后,从菜单栏选择Tools–HowtoInstallForCommandLineUse。在多个目录下有着多个源文件的情况下,需要在每个目录中都编写一个。这个宏,倘若在源码中也想使用它,那么需要由。为例,演示如何导入一个本地的第三方库,(在红圈中根据自己的Mac版本任选一个。当命令执行成功后,就会在当前目录下生成。与编译单个源文件相比,难点主要是对。是默认安装的根目录,可以通过修改。命令来进行相关测试,项目根目录的。里的文件编译为一个静态库再通过。版本开始提供的功能,只需要一个。...原创 2022-07-26 10:08:20 · 9146 阅读 · 0 评论 -
C++ 运算符重载(二) | 类型转换运算符,二义性问题
文章目录类型转换运算符概念避免过度使用类型转换函数解决上述问题的方法转换为 bool显式的类型转换运算符类型转换二义性重载函数与类型转换结合导致的二义性重载运算符与类型转换结合导致的二义性类型转换运算符概念类型转换运算符(conversion operator)是类的一种特殊成员函数。负责将一个类类型的值转换成其他类型。operator type() const ;其中 type 表示某种类型。类型转换运算符可以面向任意类型(除了 void 之外)进行定义,只要该类型能作为函数的返回类型。因此原创 2021-09-17 18:47:26 · 1684 阅读 · 0 评论 -
C++ 重载函数调用运算符 | 再探lambda,函数对象,可调用对象
文章目录函数调用运算符函数调用运算符函数调用运算符必须是成员函数。 一个类可以定义多个不同版本的调用运算符,互相之间应该在参数数量or类型上有所区别。如果类定义了函数调用运算符 () ,则该类的对象称作函数对象,因为可以调用这种对象,所以我们说这些对象的行为像函数一样。class absInt {public: int operator()(int val)const { return val < 0 ? -val : val; }};...原创 2021-09-17 14:48:40 · 717 阅读 · 0 评论 -
C++ 运算符重载(一) | 输入/输出,相等/不等,复合赋值,下标,自增/自减,成员访问运算符
文章目录输出运算符<<输出运算符<<通常情况下,输出运算符的第一个形参是一个 非常量ostream对象的引用 。之所以 ostream 是非常量是因为向流写入内容会改变其状态;而该形参是引用是因为我们无法直接复制一个 ostream 对象。第二个形参一般来说是一个 常量的引用,该常量是我们想要打印的类类型。第二个形参是引用的原因是我们希望避免复制实参;而之所以该形参可以是常量是因为(通常情况下)打印对象不会改变对象的内容。为了与其他输出运算符保持一致,operator<原创 2021-09-15 14:08:48 · 1106 阅读 · 0 评论 -
C++ 多态 | 虚函数、抽象类、虚函数表
文章目录原创 2021-09-12 20:33:47 · 1004 阅读 · 0 评论 -
C++ 右值引用 | 左值、右值、move、移动语义、引用限定符
文章目录C++11为什么引入右值?区分左值引用、右值引用C++11为什么引入右值?C++11引入了一个扩展内存的方法——移动而非拷贝,移动较之拷贝有两个优点:效率更高: 在此之前,当数据结构申请的内存用尽时,一般是申请一块更大的内存,然后将旧内存中存储的元素拷贝到新内存中。但很多情况下,为了方便拷贝操作而建立的临时对象在拷贝完成后就被销毁了,因此不如直接将旧内存中的元素移动到新内存中,即省空间(临时对象也是要占内存的),还省时间(不用建立临时对象了)。IO、unique_ptr 这样的类都包含不原创 2021-09-09 14:17:10 · 971 阅读 · 0 评论 -
C++ 类的行为 | 行为像值的类、行为像指针的类、swap函数处理自赋值
文章目录概念行为像值的类行为像指针的类概念引用计数动态内存实现计数器类的swap概念swap实现自赋值概念行为像值的类和行为像指针的类这两种说法其实蛮拗口的,这也算是 《C++Primer》 翻译的缺点之一吧。。。其实两者的意思分别是:行为像值的类: 每个类的对象都有自己的实现行为像指针的类: 所有类的对象共享类的资源(类似于 shared_ptr 智能指针,每有一个对象持有该资源则引用计数+1,每有一个对象释放该资源则引用计数-1,引用计数为0时释放内存)本篇博客的内容跟 类 和 智能指原创 2021-09-08 15:38:37 · 802 阅读 · 0 评论 -
C++ 流的操作 | 初识IO类、文件流、string流的使用
文章目录IO头文件IO头文件IO 有三种头文件原创 2021-09-06 23:32:26 · 4150 阅读 · 0 评论 -
C++ 泛型编程(二):非类型模板参数,模板特化,模板的分离编译
文章目录非类型模板参数函数模板的特化类模板的特化非类型模板参数模板的参数分为两种:类型参数: 则是我们通常使用的方式,就是在模板的参数列表中在 class 后面加上参数的类型名称。非类型参数: 则是用一个常量作为模板的参数,在模板中可以当作常量来使用,通常是需要指明大小或者初始化内容的才会用到。类型参数我们在上一篇博客中讲的很详细了,不再赘述。而非类型参数比较常见的就是 c++ 中的 array :array 的底层就是直接使用的数组,而数组创建时必须指明大小,并且大小得是个常量,所以就原创 2021-08-30 11:46:11 · 398 阅读 · 0 评论 -
你真的了解静态变量、常量的存储位置吗?
文章目录引言C++对内存的划分如何落实在Linux上自由存储区和堆之间的问题栈常量区静态存储区静态局部变量静态局部变量、静态全局变量、全局变量的异同引言在动态内存的博客中,我提到:在Linux 内存管理的博客中,我提到:尽管都有尽可能完全的描述,并且两者大致意思没有冲突。而之所以令我一直感到略有不同,越看越迷糊的原因是:第一张图讲的其实是C++在概念上对内存的划分,第二张图讲的是Linux对虚拟内存进行的划分。 前者是概念上的,也是C++程序在运行时会切实执行的,而后者就是在Linux系统上原创 2021-08-29 23:30:22 · 2511 阅读 · 0 评论 -
C++ 泛型编程(一):模板基础:函数模板、类模板、模板推演成函数的机制、模板实例化、模板匹配规则
文章目录泛型编程函数模板函数模板实例化隐式实例化显式实例化函数模板的匹配规则类模板类模板的实例化泛型编程泛型编程旨在削减重复工作,如:将一个函数多次重载不如将他写成泛型。void Swap(int& left, int& right) { int temp = left; left = right; right = temp;}void Swap(double& left, double& right) { double temp = left;原创 2021-08-29 19:02:51 · 373 阅读 · 0 评论 -
C++ 继承 | 对象切割、菱形继承、虚继承、对象组合
文章目录继承继承的概念继承方式基类与派生类的赋值转换派生类的默认成员函数友元与静态成员多继承菱形继承虚继承继承继承的概念继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。当创建一个类时,我们可以继承一个已有类的成员和方法,并且在原有的基础上进行提升,这个被继承的类叫做基类,而这个继承后新建的类叫做派生类。class [派生类名] : [继承类型] [基类名]实现:class Human{public: Human(string name = "张三", int ag原创 2021-08-24 09:41:48 · 976 阅读 · 0 评论 -
动态数组的简单应用
文章目录题目注意代码输出结果题目连接两个字符串字面常量,将结果保存在一个动态分配的char数组中。重写,连接两个标准库string对象。注意使用头文件cstring的strcpy拷贝字符串、strcat连接字符串。注意释放动态数组。代码#include <iostream>#include <string>#include <cstring>using namespace std;int main(int argc, char const *arg原创 2021-04-19 20:35:08 · 330 阅读 · 0 评论 -
动态内存、智能指针(shared_ptr、unique_ptr、weak_ptr)、动态数组
文章目录三种对象的分类三种内存的区别动态内存shared_ptr类格式独有的操作make_shared函数shared_ptr的计数器使用了动态生存期的资源的类三种对象的分类三种对象:全局对象在程序启动时分配,在程序结束时销毁。局部自动对象,当我们进入其定义所在的程序块时被创建,在离开块时销毁。局部static对象在第一次使用前分配,在程序结束时销毁。三种内存的区别静态存储区:主要存放static静态变量、全局变量、常量。这些数据内存在编译的时候就已经为他们分配好了内存,生命周期是整个原创 2021-04-18 17:26:52 · 2763 阅读 · 0 评论 -
C++之关联容器
文章目录概述及类型mapset初始化map and setmultimap and multiset概述及类型关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的。顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。顺序容器的底层数据结构是数组、链表。关联容器的底层数据结构是红黑树、哈希表等。关联容器支持高效的关键字查找和访问。两个主要的关联容器(associative-container)类型是map和set:map中的元素是一些关键字-值(key-va原创 2021-04-17 17:05:15 · 2104 阅读 · 0 评论 -
泛型算法(lambda表达式、function类模板、bind函数适配器、迭代器类别、链表数据结构独有的算法)
文章目录概念find()函数迭代器令算法不依赖于容器但算法依赖于元素类型的操作算法永远不会执行容器的操作只读算法accumulate()函数概念一般情况下,泛型算法本身不会执行容器的操作,它们只会运行于迭代器之上,执行迭代器的操作。除了少数例外,标准库算法都对一个范围内的元素进行操作。我们将此元素范围称为“输入范围”。接受输入范围的算法总是使用前两个参数来表示此范围,两个参数分别是指向要处理的第一个元素和尾元素之后位置的迭代器。find()函数以find()函数为例来理解。传递给find的前两原创 2021-04-16 07:59:15 · 1606 阅读 · 0 评论 -
插入迭代器、流迭代器、反向迭代器、移动迭代器
文章目录前言插入迭代器inserterfront_inserterback_inserteriostream迭代器istream_iterator 读取输入流istream_iterator允许使用懒惰求值ostream_iterator操作反向迭代器reverse_iterator的base成员函数前言除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器。这些迭代器包括以下几种。插入迭代器(insert iterator):这些迭代器被绑定到一个容器上,可用来向原创 2021-04-15 21:17:57 · 887 阅读 · 0 评论 -
顺序容器(vector、list、string、deque、forward_list)及迭代器、容器适配器
文章目录概述所有容器都支持的操作迭代器迭代器支持的操作迭代器支持的算术运算迭代器范容器类型size_typeiterator 和 const_iterator类型别名容器定义和初始化拷贝初始化顺序容器独有的构造函数(array除外)array的初始化与内置数组类型的区别6种初始化方法(以vector为例)赋值和swap使用assign(仅顺序容器)使用swapswap仅交换容器内部的数据结构swap的效率容器的大小操作成员函数sizeof()size和capacity为什么list或array没有capac原创 2021-04-07 22:01:29 · 2123 阅读 · 0 评论 -
C++ 类的知识 | 构造函数再探、匿名对象、友元函数、内部类、类的const成员、类的static成员
文章目录隐式的类类型转换概念只允许一步类类型转换隐式的类类型转换概念隐式的类类型转换:能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则。示例如下:class People{ int age; string name;public: People(int a){ age = a; name = "zhangsan"; } People(string b){ age = 10; name = b; } Pe原创 2021-03-21 15:34:30 · 438 阅读 · 0 评论 -
类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则
文章目录构造函数默认构造函数的三种不适用情况第一种第二种第三种 class Date{};可以看到,上面那个类没有任何成员,是一个空类,但是它真的什么都没有吗?其实一个类在我们不写的情况下,也会生成6个默认的成员函数,分别是:构造函数,析构函数,拷贝构造函数,赋值运算符重载,取地址运算符重载,对const对象取地址运算符的重载构造函数构造函数是特殊的成员函数,它的主要功能就是初始化对象。和我们之前c语言中自己实现的init函数类似。但是有一点不同的是,init是在我们创建完后才自己调用,原创 2021-03-18 11:02:06 · 2825 阅读 · 4 评论 -
类的概念、成员函数的定义方式、类的访问控制和封装、类的大小、this指针
文章目录类的概念structclassclass和struct的区别是什么呢?类中成员函数的两种定义方式声明和定义都在类中声明和定义分离类的访问控制和封装类的封装特性类的大小结构体内存对齐规则类的存储方式this指针类的概念在C++中,类可以说是最重要的东西,因为C++一开始的定位就是c with class,也正是因为引入了类,才让c++从c的面向过程思想转变为面向对象的思想,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。C++有两种能够创建类的方法struct第一种是str原创 2021-03-13 16:50:21 · 868 阅读 · 0 评论 -
函数重载、引用再探、内联函数
文章目录函数重载为什么C++支持重载,C语言不支持呢?extern “C”引用再探引用的特性引用的使用场景引用和指针引用和指针的不同点:内联函数什么是内联函数?内联函数的特性函数重载在同一个作用域下,对于相同的函数名,函数的参数类型不同,参数顺序不同,参数的个数不同, 都可以形成函数的重载(参数名不同,返回值不同不形成重载)函数的重载主要用于处理功能相同,形参类型不同的数据。void test(int i, int j){ cout << "test" << endl;原创 2021-03-12 20:47:05 · 241 阅读 · 0 评论 -
string对象和C风格字符串
混用string对象和C风格字符串我们都知道允许使用字符串字面值来初始化string对象:string s("Hello World!");C++规定,任何出现字符串字面值的地方都可以用以空字符结束的字符数组来替代:允许使用以空字符结束的字符数组来初始化string对象或为string对象赋值。在string对象的加法运算中允许使用以空字符结束的字符数组作为其中一个运算带对象(不能两个对象都是);在string对象的复合赋值运算中允许是用以空字符结束的字符数组作为右侧的运算对象。上述性质反原创 2021-02-18 13:34:15 · 294 阅读 · 0 评论 -
C语言隐式/显式类型转换 | C++四种强制类型转换、类的隐式转换、explicit
文章目录何时发生隐式类型转换何时发生隐式类型转换在大多数表达式中,比int类型小的整数值提升为较大的整数类型在条件中,非布尔值转换成布尔类型初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转化成左侧运算对象的类型算术运算或关系运算对象有多种类型,需要转换成同一种类型函数调用时也会发生类型转换...原创 2021-02-04 23:44:52 · 2631 阅读 · 0 评论 -
sizeof运算符运算结果小汇
文章目录sizeof运算符的结果部分地依赖于其作用的类型sizeof运算符的结果部分地依赖于其作用的类型对char或者类型为char的表达式执行sizeof运算,结果得1对引用类型执行sizeof运算得到被引用对象所占空间的大小对指针执行sizeof运算得到指针本身所占空间的大小对解引用指针执行sizeof运算得到指针指向的对象所占空间的大小,指针不需有效对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得结果求和。注意,sizeo原创 2021-02-04 16:41:16 · 822 阅读 · 0 评论 -
vector的应用练习
文章目录编写一段程序,使用条件运算符从vector< int >中找出哪些元素的值是奇数,然后将奇数值翻倍。#include <iostream>#include <ctime>#include <vector>using namespace std;typedef int int_array[4];int main(){ vector<int> v; const int sz = 10; srand ( (unsigned原创 2021-02-02 21:06:45 · 157 阅读 · 0 评论 -
关于范围for语句的使用
文章目录使用范围for语句处理多维数组使用范围for语句处理多维数组举个例子,使用范围for语句输出多维数组(ia)所有值:for (const auto &row : ia) for (auto col : row) cout << col << endl;本循环中并没有任何写操作,可仍将外层循环的控制变量声明成了引用类型,这是为了避免数组被自动转换成指针。如果不用引用类型,则循环如下述形式:for (auto row : ia) for (auto原创 2021-01-30 15:46:17 · 504 阅读 · 2 评论 -
数组的部分练习
3.27:假设txt_size是一个无参数的函数,它的返回值是int。请回答下列哪个定义是非法的?为什么?unsigned buf_size=1024;(a)int ia[buf_size]; (b)int ia[4*7-14];(c)int ia[txt_size()]; (d)char st[11]=" fundamental ";a)非法定义。buf_size不是常量表达式。b)合法。c)非法定义。txt_size没有被定义为constexpr。d)非法定义。没有空间可以存放结尾空字原创 2021-01-28 17:17:29 · 1031 阅读 · 3 评论 -
string类的相关知识及部分操作
文章目录string对象的初始化string::size_type类型string对象的读写操作使用标准库中的iostream使用getline读取一整行string对象的比较操作string对象的相加操作两个string对象相加字面值和string对象相加string对象的初始化拷贝初始化(copy initialization):使用等号(=)初始化一个变量直接初始化(direct initialization):不使用等号当初始值只有一个时,使用两种初始化都行。如果用到的初始值有多个,一般来原创 2021-01-24 13:18:22 · 233 阅读 · 0 评论 -
初始化、赋值、默认初始化、列表初始化、类内初始值、直接初始化与拷贝初始化
文章目录初始化和赋值的区别列表初始化类数据成员初始化和赋值的区别初始化的含义是床关键变量时赋予其一个初始值,而赋值的含义时把对象的当前值擦除,而已一个新值来替代。列表初始化C++定义了初始化的好几种不同形式,通常定义一个变量并初始化的方式有以下四种:int x = 0;int x = {0};int x{0};int x(0);使用花括号来初始化变量在C++11新标准中得到了全面应用。这种初始化的形式被程为列表初始化(list initialization)。现在,无论是初始化对象,原创 2021-01-21 12:05:55 · 4154 阅读 · 0 评论 -
关键字typedef、关键字using、auto类型说明符和declytpe类型指示符
文章目录类型别名概念指针、常量和类型别名类型别名概念有两种方法可用于定义类型别名。关键字typedeftypedef double wages; // wages是double的同义词typedef wages base, *p; // base是double的同义词,p是double*的同义词关键字typedef作为声明语句中的基本数据类型的一部分出现。含有typedef的声明语句定义的不再是变量而是类型别名。这和以前的声明语句一样,这里的声明符也可以包含类型修饰,从而也能由基本数据原创 2021-01-17 19:18:52 · 446 阅读 · 0 评论