![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 62
For Nine
这个作者很懒,什么都没留下…
展开
-
main函数结束后的调用
main函数前后还有代码需要运行转载 2022-12-03 22:56:48 · 176 阅读 · 0 评论 -
C++ 标准库函数std::unique详解
C++库函数std::unique的坑原创 2022-11-18 12:22:04 · 1096 阅读 · 2 评论 -
关于C++11中封装的lock_guard等类——粗浅记录
C++11对锁的封装原创 2022-11-09 19:53:12 · 428 阅读 · 0 评论 -
C++ 为什么编写模板类时要把方法的实现写在头文件中,而不能像写普通类一样写在源文件中?
C++模板类型转载 2022-11-09 17:10:27 · 1844 阅读 · 1 评论 -
cmake、make、或是vscode的一键编译 报错怎么办
编译时报错怎么办?原创 2022-11-05 16:40:41 · 257 阅读 · 0 评论 -
C++程序报错:std::logic_error 的可能原因
std::logic_error 报错可能的原因原创 2022-10-20 22:52:06 · 3740 阅读 · 0 评论 -
std::string::npos 常量解析
std::string::nops原创 2022-06-17 21:06:07 · 1928 阅读 · 0 评论 -
C++父类和子类指针的相互赋值和转换
父类指针和子类指针的相互转换原创 2022-06-07 19:52:32 · 3810 阅读 · 1 评论 -
《C++ Primer》 异常
C++异常原创 2022-06-07 13:09:39 · 268 阅读 · 0 评论 -
C++ 模板实现单例模式
一个通用性很强的单例模式实现原创 2022-06-06 10:48:45 · 827 阅读 · 0 评论 -
C++中全局变量,静态变量,静态局部变量 的初始化和内存分配问题
C/C++中全局变量,静态局部变量,局部变量的初始化问题原创 2022-06-06 10:07:54 · 2516 阅读 · 0 评论 -
记一个编写宏时的错误
编写宏定义时,一定要注意不要忘了写作用域。原创 2022-06-04 11:29:42 · 93 阅读 · 0 评论 -
C++ 嵌套类
嵌套类就是:在一个类的作用域里,又定义了一个类。1、为什么引入嵌套类?之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外层类的实现,同时可以对用户隐藏该底层实现。可以这样理解:有一些工作不想被用户知道怎么实现的,那么就把这些工作交给嵌套类实现,然后对外层类提供一个接口即可。class A {private: class Imp; Imp* impl;public: A(); virtual ~A(); void原创 2022-05-30 15:13:40 · 1545 阅读 · 0 评论 -
C++设计模式
面向对象编程的一些术语:延迟到子类: 定义一个虚函数,让子类来重写获实现他。这其实就是支持子类去 变化。扩展: 继承 + 多态,即,子类继承基类 并对其虚函数进行 override依赖: 一般指编译时依赖,如:A依赖B,那么在编译的时候,编译器需要先编译 B,才能再编译 A。本篇指的一般是编译时依赖,如果是运行时依赖会特别说明。1、面上对象设计的8大原则依赖倒置:隔离变化。高层模块(需要稳定)不应该依赖于低层模块(是易变化的),二者都应该依赖于抽象(稳定的)。抽象(稳定)不应该依赖于实现细原创 2022-05-30 12:22:14 · 464 阅读 · 0 评论 -
面向对象程序设计———组合、委托 与 继承
1、组合 has-a一个类中有另外一个类的对象,这种关系就叫组合。表现为 has-a1.1 组合类对象占内存的大小组合类的大小包括他组合的所有类对象的大小。1.2 组合类的构造 和 析构 构造由内而外: 先执行内部类的默认构造函数,再执行自己的构造函数。(执行内部类构造函数的过程由编译器完成,如果不想调用默认构造函数,那么必须手动在初始化列表的位置调用我们想用的构造函数) 析构由外而内: 先执行自己的析构函数,再执行内部类的析构函数。(执行内部类析构函数的过程也由编译器完成)2、委托一个类原创 2022-05-30 12:21:52 · 303 阅读 · 0 评论 -
C++ printf族函数
1、所有的printf族函数有两大类:#include<stdio.h>int printf(const char* format, ...);int fprintf(FILE* stream, const char* format, ...);int dprintf(int fd, const char* format, ...);int sprintf(char* str, const char* format, ...);int snprintf(char* str, siz原创 2022-05-15 18:23:36 · 805 阅读 · 1 评论 -
Linux 中与字符串相关的函数strpbrk、strcasecmp、strspn(不间断更新)
本篇博客旨在整理出所有Linux网络编程中常用的字符串相关的函数,这些函数普遍用在处理网络通信中的字符串数据。话不多说,直接进入正题。1、strpbrk函数#include<string.h>char* strpbrk(char* s1, char* s2);strpbrk()从第一个字符指针指向的位置 向后检查每个字符,直到遇到\0(不检查\0),如果检查到的某个字符在s2指向的字符串中,那么返回他的地址,并停止检查。如果s1 、s2没有相同字符,返回NULL。注:传入strpb原创 2022-05-15 15:29:23 · 721 阅读 · 0 评论 -
C++ STL 在算法中的应用
1、vector变长数组有clear清空操作。支持比运算,两个vector按字典序比较大小2、stringsubstrstring substr (size_t pos = 0, size_t len = npos) const;返回一个string中下标pos开始,长度为len的子字符串,若len超过最大长度则直接返回从pos到末尾。c_strc_str()返回一个string中首元素的下标。用于用scanf输出一个string:scanf("%s", a.c_str());3原创 2022-04-10 14:54:04 · 1254 阅读 · 2 评论 -
C++ std::ref————详解
想学习ref,必须先学习reference_rapper1、是什么?ref是个函数模板:用来构建一个reference_wrapper对象并返回,该对象拥有传入的elem变量的引用。如果参数本身是一个reference_wrapper类型的对象,则创建该对象的一个副本,并返回。2、为什么要有refstd::ref主要在函数式编程(如std::bind)时使用,bind是对参数直接拷贝,无法传入引用(即使你传入的实参是引用类型也不行),故引入std::ref()。使用std::ref可以在模板传参原创 2022-04-05 10:37:21 · 13019 阅读 · 3 评论 -
C++ std::reference_wrapper————详解
1、reference_wrapper是一个模板类。用类型T实例化的reference_wrapper类能包装该类型的一个对象,是引用的包装器,原创 2022-04-05 09:58:54 · 4945 阅读 · 0 评论 -
C++ 模板与泛型编程 《C++Primer》第16章(下)———— 读书笔记
1、模板特例化1.1 什么是模板实例化?为什么有这种东西?某些情况下,通用模板的定义对特定类型是不合适的,他有可能发生编译失败或做的不正确。就比如说之前编写的compare函数模板。起初编写了:template<typename T> int compare(const T& t1, const T& t2){ if (t1 < t2) return 1; if (t2 < t1) return -1; reutrn 0;}这个模板就不能用于比较字原创 2022-04-04 17:08:22 · 429 阅读 · 0 评论 -
C++ 之重学 const
1、默认状态下,const对象仅在当前文件内有效默认情况下,const对象被设定为仅在当前文件内有效。当多个文件中出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量。解决的办法是,对于const变量不管是声明还是定义都添加extern关键字,这样只需在一个文件中定义一次就可以了。2、对const的引用把引用绑定到const对象上,称之为对常量的引用。虽然引用不是对象,但是引用有地址,可以用&获取引用的地址,引用的地址就是绑定到的对象的地址。普通引用无法绑定到字面值常量原创 2022-04-03 22:37:10 · 658 阅读 · 0 评论 -
C++ 模板与泛型编程 《C++Primer》第16章(中下)———— 读书笔记
1、转发某些函数需要将其一个或多个实参连同实参的类型,完全不变的转发给其他函数。在此情况下,我们需要保持被转发实参的所有性质,包括实参类型是否是const的,以及实参是左值还是右值。作为一个例子,下面将编写一个函数,共三个参数,一个可调用对象 和 两个实参。我们的函数把后两个实参,逆序传递给可调用对象。函数的雏形如下:template<typename F, typename T1, typename T2> void flip1(F f, T1 t1, T2 t2){ f(t2, t原创 2022-04-03 18:53:13 · 559 阅读 · 3 评论 -
C++ 模板与泛型编程 《C++Primer》第16章(中上)———— 读书笔记
1、类型转换 与 模板类型参数和普通的实参类似,传递给模板类型参数的 实参也能发生类型转换,但是只能发生两种类型转换:① const转换:可把非const对象的指针或引用,传递给一个const的指针或引用 形参。② 数组和函数名向对应指针的转换:前提是函数形参不是引用类型,才可以对数组或函数类型的实参应用指针转换。数组实参可转换为指向其首元素的指针,函数实参可转换为该函数类型的指针。只这两种转换,别无其它。说的就是,算术转换、子类向父类的转换、用户自定义的转换,统统不能用于函数模板传参。举个原创 2022-04-02 19:26:52 · 381 阅读 · 0 评论 -
C++ 函数参数的传递顺序——从后往前
示例程序:#include <stdio.h>int main(int argc, char* argv[]){ int aa = 10, bb = 20, cc = 30; printf("\n %d %d %d \n", aa + bb + cc, (bb = bb * 2 + cc), (cc = cc * 2)); return 0;}运行结果: 170 100 60原创 2022-04-01 12:24:24 · 734 阅读 · 0 评论 -
C++ 随记4 (仍然是杂项)
1、size_type类型这属于是基础没打好了。size_type是由string 和 vector类型定义的类型,用于保存任意string 或 vector对象的长度。切记,size_type是unsigned的。size_type的长度,会随机器改变而改变。更详细地将请移步这篇博客...原创 2022-04-01 12:20:30 · 749 阅读 · 0 评论 -
C++ 模板与泛型编程 《C++Primer》第16章(上)———— 读书笔记
1、定义模板以函数模板为例:template <typename T, typename U> T func_name(const T& x, const U& y){ // ...... //} 模板定义以关键字 template 开始,后跟一个模板参数列表。模板参数列表不能为空。使用模板时,我们(隐式或显示的)指定模板实参,把他绑定到模板参数上。当调用函数模板时,编译器会推断模板参数,并用推断出的模板参数实例化一个特定版本的函数。这种被编译器生成的版本被称为原创 2022-04-01 10:49:53 · 449 阅读 · 0 评论 -
C++ const 和 constexpr的区别
1、const定义的变量,不要求在编译时就能被算出,也就是说可以由变量赋值constexpr定义的变量,在编译时就能被算出,只能由常量表达式赋值int x = 10;const int i = x * x; 正确constexpr int j = x * x; 编译器报错,x*x不是常量表达式int x = 10;const int i = x * x; 正确constexpr int j = i; 错误,i不是常量表达式原创 2022-03-28 21:51:05 · 869 阅读 · 0 评论 -
C++ 常量表达式 constexpr
1、编译时就可得到结果声明为constexpr的变量一定是常量,且必须用常量表达式初始化。constexpr int num1 = 20; 20是常量表达式constexpr int num2 = num1 + 1; num1 + 1是常量表达式constexpr int num3 = size(); 只有 size 是个constexpr函数时,该语句才正确新标准允许定义constexpr的函数,这种函数足够简单,以使得编译时就可计算出结果,这就能用constexpr函数初始化cons原创 2022-03-28 21:49:42 · 1333 阅读 · 0 评论 -
C++ 面向对象程序设计 《C++Primer》第15章(下篇)———— 读书笔记
1、虚析构函数顾名思义,把析构函数定义为virtual的,为什么要这样?不同以往,继承体系中,是有可能出现静态类型和动态类型 不匹配的情况的。比如,我们delete一个父类类型的指针,但该指针实际指向了一个子类对象,这时,就必须知道该调用哪个版本的析构函数。为此,虚析构函数是 必要的 。只要在父类里把析构函数定义为virtual,其虚属性会被自动继承。这样继承体系的所有析构函数都能实现动态绑定。虚析构函数会 阻止 合成移动操作首先来复习一条规则:都什么东西算拷贝控制成员呢?下面这五个:原创 2022-03-28 20:30:12 · 321 阅读 · 0 评论 -
C++ VS2019报错 无法解析的外部符号 XXXXXXX 函数main中引用了该符号
错误相关文件:AndQuery.h#pragma once#ifndef _ANDQUERY_H_#define _ANDQUERY_H_#include"BinaryQuery.h"using namespace std;class Query;class AndQuery : public BinaryQuery{ friend Query operator&(const Query&, const Query&); AndQuery(const Qu原创 2022-03-28 12:49:13 · 3835 阅读 · 0 评论 -
C++ 面向对象程序设计 《C++Primer》第15章(上篇)———— 读书笔记
1、深入虚函数1.1 所有虚函数都必须提供定义由于虚函数的动态绑定特性,编译器无法在编译阶段就确定到底会使用哪个版本的虚函数,所以所有的虚函数都必须提供定义。1.2 派生类中的虚函数要 严格 模仿基类虚函数派生类的虚函数返回值,和参数列表都要和基类的一模一样。只有一个例外:1.3 override说明符被override修饰的函数,必然覆写了基类中同名的的虚函数,必然和他有着相同的返回值和参数列表。override存在这种特性的原因之一是:当我们在派生类中定义一个与基类虚函数同名,但是返原创 2022-03-24 19:28:54 · 1215 阅读 · 0 评论 -
C++ 面向对象程序设计——基础知识
派生类自定义的数据成员和继承自基类的数据成员不一定是连续存储的。1、 虚函数:任何构造函数之外的非静态函数都可以是虚函数。virtual只能出现在类内部的声明语句,不能用于类外部的函数定义积累声明一个虚函数,该函数在派生类中也是虚函数派生类也可不去自定义,这样就直接继承基类的虚函数2、 动态绑定:动态绑定又叫运行时绑定。用virtual修饰过的成员函数在基类和派生类中有不同的版本,这些函数的实际运行版本由实参决定,即在运行时选择函数的版本,因此得名。3、 protected关键字:原创 2022-03-21 21:13:37 · 1343 阅读 · 0 评论 -
C++ 操作重载与类型转换 《C++Primer》第14章 读书笔记
1、基本概念 和 限制条件只有重载的函数调用运算符operator()能有默认实参,其他重载运算符不能有默认实参。一个重载的运算符,至少含有一个类类型的参数。可被重载的运算符:一般不重载&& || , &这几个运算符返回值类型一般与内置版本兼容:逻辑和关系运算符返回bool算术运算符返回类类型的值赋值运算符 和 复合运算符 返回左侧运算对象的引用若一个运算符是成员函数,则他的左侧运算对象绑定到隐式的this指针上。这就是为什么后面重载<原创 2022-03-21 10:47:51 · 807 阅读 · 0 评论 -
C++ Visual Studio报错:LNK1169: 找到一个或多个多重定义的符号————解决办法
1、.h文件里的函数声明和定义都要加上inline2、声明全局变量,全局函数一定要 在.cpp中声明 其他类引用该全局变量就include该.cpp对应的头文件,然后再extern一下原创 2022-03-19 13:45:22 · 1737 阅读 · 0 评论 -
C++ 拷贝控制 《C++Primer》第13章 读书笔记
1、拷贝构造函数一个构造函数,第一个参数是自身类型的引用,且其余参数都有默认值,则这是个拷贝构造函数。除了传非引用参数、返回非引用返回值外,用花括号列表初始化一个数组中的元素或一个聚合类中的成员时也会发生拷贝初始化。调用标准库容器的insert 或 push成员时,也会进行拷贝内初始化,用emplace则是直接初始化。2、拷贝构造函数拷贝构造函数和拷贝赋值运算符的区别:【拷贝构造函数调用】的结果 会有新对象生成,而拷贝赋值运算符则并没有。拷贝构造函数会在对象初始化的时候调用,而调用赋值运算符原创 2022-03-19 07:55:26 · 307 阅读 · 0 评论 -
C++ 智能指针 unique_ptr 不可拷贝的例外情况,“可拷贝或赋值一个将要被销毁的unique_ptr”
书上的例子是这样的:我们可以拷贝或赋值一个将要被销毁的unique _ptr。最常见的例子是从函数返回一个unique_ptr如下面代码所示:unique_ptr<int> clone(int p){ return unique_ptr<int>(new int(p));}还可以返回一个局部对象的拷贝:unique_ptr<int> clone(int n){ unique_ptr<int> ret(new int(p)); retur原创 2022-03-18 16:00:47 · 749 阅读 · 0 评论 -
C++ 动态内存管理类:自实现简易 vector ,只能存 string 。《C++Primer》13.5小节
说是自实现vector,其实就是尽量模拟出vector所具有的操作。1、类 应有的成员1、三个成员变量:elements,指向首元素first_free,指向实际存在元素之后的位置cap,指向分配的内存末尾之后的位置2、一个【静态alloctor成员】,用于给【所有】vector对象【分配内存空间】。3、需要4个工具函数,管理每个vector的内存空间。由于他们是用于实现这个类的,所以应该是私有的成员函数。...原创 2022-03-17 17:22:25 · 1089 阅读 · 0 评论 -
C++ 随记三 (一些杂项)
1、使用只读算法时,传参要注意:比如,accumulate就是个只读函数:string sum = accumulate(s.cbegin(), s.end(), string(""));插一嘴,最后一个参数必须是string(""),不能只写一个空字符串""上去,因为第三个参数的类型决定accumulate函数调用哪种类型的+运算符,而const char*没有+运算符,会产生编译错误。2、使用equal的注意事项equal不能比较两个【C风格的字符串】是否相等。因为C风格的字符串本质是c原创 2022-03-16 20:05:16 · 1243 阅读 · 0 评论 -
C++ 内联函数一定要定义在头文件中,而不是源文件
在跟着《C++Primer》编写一个小工程的时候,编译器报了这样的错误:这错误真离谱,令人头大。查前几条报错信息,看了半天,整不明白。然后我直接搜最后一个报错信息,搜到一篇很棒的博客,真是救命了啊,那篇博客在这里。总的来说就是: 内联函数(inline)给我写到头文件里面,不要写在源文件里 啊啊啊啊!!!!!引用原博客的话:inline函数没有写在.h文件中,因为inline函数定义只能在声明它的文件中找到,所以inline函数的定义不能和声明分开写在两个文件中引用自:C++初转载 2022-03-14 13:07:06 · 1285 阅读 · 0 评论