![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++基础/高级
文章平均质量分 67
基础介绍
芒种、
这个作者很懒,什么都没留下…
展开
-
C++ 用逗号分割字符串
一,用逗号分割字符串#include <iostream>using namespace std;int main(){ std::stringstream ss(inputStr); std::string str; while (getline(ss, str, ',')) { //do something }}转载 2021-07-12 14:44:55 · 5455 阅读 · 0 评论 -
VS2015远程调试
在PayPal支付时,PayPal回调函数一直报错,本地没有外网IP,没有办法在本地调试,需要远程调试:1.找到远程调试的文件夹:找到对应的服务器的型号:64位还是32位的,我们服务器是64位的,把文件夹复制到服务器:2.在服务器中运行:msvsmon.exe选择 工具-》选项,修改成 无身份验证,允许任何用户进行调试,(这样有安全隐患,所以调试完成后一定要及时关掉)确定后显示如下:此时服务器已经可以远程调试了。服务器的代码版本必须是Debug版的,必须要有.p转载 2021-04-08 11:25:38 · 932 阅读 · 0 评论 -
C++ 日志模块打印
日志模块头文件#pragma once#define LOG_PRINT(printLev, format, ...) LogPrinter::LogPrint(printLev, __FILE__, __LINE__, format, __VA_ARGS__);#define LOG_PRINT_INFO(format, ...) LogPrinter::LogPrint(PRINT_LEV_INFO, __FILE__, __LINE__, format, __VA_ARGS__);#def原创 2021-01-15 10:23:23 · 1020 阅读 · 4 评论 -
C++ 类型萃取
一、功能类型萃取,在STL中用到的比较多,用于判断一个变量是否为POD类型.简述来说可以用来判断出某个变量是内置类型还是自定义类型.通过类型萃取,萃取到变量类型,对不同变量进行不同处理,可以提升程序效率.二、应用场景比如我们实现顺序表,在对顺序表进行扩容时,就靠重新开辟内存、拷贝对象.拷贝对象时,就有两种情况:一种是类型,比如int char…;还有一种是自定义类型,Data类、String类.对于内置类型,我们可以通过memset,来进行赋值.(扩展,浅拷贝相关的类也可以通过memset赋值原创 2021-01-14 22:00:38 · 258 阅读 · 0 评论 -
C/C++ 帮助文档
C/C++ 帮助文档原创 2021-01-14 21:44:39 · 1201 阅读 · 0 评论 -
C++ 可变参数函数、initializer_list、省略号形参
一、可变参函数含义:能够接收非固定个数参数的函数就是可变参数函数;initializer_list标准库类型,用于处理可变参数问题,该类型能够使用的前提条件是,所有的实参类型相同二、initializer_list (初始化列表)如果一个函数,它的实参数量不可预知,但是所有参数的类型相同,我们就可以使用这个initializer_list类型的形参来接收。initializer_list 是 C++ 11中提供的新类型,也是一个类模板。我们把initializer_list理解成某种类型值得数组原创 2021-01-14 21:32:30 · 1350 阅读 · 0 评论 -
C++ lambda表达式
一、 lambda表达式C++11:也是一种可调用对象。定义了一个匿名函数,并且可以捕获一定范围内的变量。1. 格式[捕捉列表] (参数) mutable -> 返回值类型 {函数体};注意:1. 返回类型后置(必须的,语法规定);2. 返回类型可以省略(但是编译器不一定能推断出返回类型,此时显示指定即可);3. 参数列表可以有默认值。没有参数的时候,参数列表可以省略,甚至括号()都可以省略。4. 捕获列表[]和函数体不能省略,必须时刻包含。5. lambda调用方法和普通函数相原创 2021-01-13 22:13:07 · 796 阅读 · 0 评论 -
C++ 可调用对象、function、bind
一、可调用对象1. 函数(函数指针)void Func(int a){ cout << "a" << endl;}int main(int argc, const char* argv[]) { void (*p)(int) = Func; //定义函数指针,并赋初值 p(15); return 0;}2. 具有operator()成员函数的类对象(仿函数)仿函数定义:行为类似于函数的东西,C++中通过在类中重载()运算符实现。又称函数对象:能行驶函数原创 2021-01-12 20:28:19 · 237 阅读 · 0 评论 -
C++ decltype类型说明符
一、decltype意义有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了)。为了满足这一需求,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。二、作用主要作用:返回操作的数据类型三、特点decltype的自动类型推断会发生在编译期(和auto一样)decltype不会真正计算表达式的值。四、用法1. decltype后的原创 2021-01-10 22:02:56 · 328 阅读 · 0 评论 -
C++ auto类型用法总结
一、用途auto是c++程序设计语言的关键字。用于两种情况(1)声明变量时根据初始化表达式自动推断该变量的类型(2)声明函数时函数返回值的占位符二、简要理解auto可以在声明变量时根据变量初始值的类型自动为此变量选择匹配的类型。举例:对于值x=1;既可以声明: int x=1 或 long x=1,也可以直接声明 auto x=1三、用法根据初始化表达式自动推断被声明的变量的类型,如:auto f = 3.14; //doubleauto s("hello"); //const ch转载 2021-01-10 16:29:49 · 1271 阅读 · 0 评论 -
C++ 万能引用和模板类型推断
类型推导:类型推导规则问题1:我们为什么要掌握类型推导规则?答:只有当我们熟悉类型推导的规则,才能让我们的代码更加的灵活,通用性好。类型推导的作用:代码更加的灵活,通用性好类型推导的适用场景:函数模板、类模板(万能引用)autodecltypedecltype(auto)函数模板的类型推导规则:知识点1:万能引用(未定义引用)(只限定函数模板,在其他场合下均是右值引用)作用:代码通用性增加(因为万能引用可以接受任何类型)template<typename T> //原创 2021-01-10 11:43:24 · 1532 阅读 · 2 评论 -
C++ function类模板
一、std::function 简介类模板std :: function是一个通用的多态函数包装器。 std :: function的实例可以存储,复制和调用任何可调用的目标 :包括函数,lambda表达式,绑定表达式或其他函数对象,以及指向成员函数和指向数据成员的指针。当std::function对象未包裹任何实际的可调用元素,调用该std::function对象将抛出std::bad_function_call异常。二、function类模板 template< class R, clas转载 2021-01-09 22:18:48 · 1428 阅读 · 1 评论 -
C++bind()函数
一、概述可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。在c++11之前,要绑定某个函数、函数对象或者成员函数的不同参数值需要用到不同的转换器,如bind1st、bind2nd、fun_ptr、mem_fun和mem_fun_ref等.在c++11中,绑定参数的方法得以简化.c++11提供了"一站式"绑定模板bind,其用法为:#include <functional>std::bind(待绑定的函数对象/函数指针/成原创 2021-01-09 12:51:04 · 697 阅读 · 0 评论 -
C++ 仿函数和适配器
一、仿函数现有一个vector,需要统计大于8的元素个数。使用std::count_if,代码可能长这个样子。bool greaterThan8(int n){ return n > 8;}int count = count_if(vec.begin(), vec.end(), greaterThan8);count_if第三个参数接收的是一个函数指针,并且这个函数指针只接收一个参数,返回值是bool。count_if是将参数1和参数2之间的每一项都会作为参数去调用第三个参数,然后返转载 2021-01-09 12:15:27 · 148 阅读 · 0 评论 -
C++ 常用算法(STL)
亦可参考:C++ STL常用算法(排序、合并、搜索和分区)标准库定义了一组泛型算法:因为它们实现共同的操作,所以称之为“算法”;而“泛型”指的是它们可以操作在多种容器类型上,不但可作用于标准库类型,还可用在内置数组类型,甚至其他类型的序列上大多数算法是通过遍历由两个迭代器标记的一段元素来实现其功能使用泛型算法必须包含头文件算法。:#include <algorithm>标准库还定义了一组泛化的算术算法(generalized numeric algorithm),其命名习惯与泛型算法相同转载 2021-01-08 21:41:09 · 1231 阅读 · 0 评论 -
C++ 分配器allocator
一、Allocator简介分配器(配置器,allocator)是STL中六大组件(容器、算法、迭代器、仿函数、适配器、分配器)之一,用于分配管理内存空间。其实我们可以把allocator看成一个简易的内存池,其主要适用于在使用容器时,对内存空间的动态分配,如果是我们平常要申请一块动态内存时,不推荐使用allocator,应该使用new-delete(malloc-free),主要原因是allocator不好用(使用不方便,容器例外),在内存释放的时候还需要提供对象的个数,因为我们在动态分配内存时候基本上都转载 2021-01-07 22:24:57 · 3386 阅读 · 1 评论 -
C++ 关联容器(map、multimap 、set、multiset)详解
5、map(需要导入头文件#include )C++中map容器提供一个键值对(key/value)容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。对于迭代器来说,可以修改实值,而不能修改key。Map会根据key自动排序。map 是键-值对的集合。map 类型通常可理解为关联数组:可使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。①定义与初始化map<int,string>原创 2021-01-07 21:59:31 · 697 阅读 · 0 评论 -
C++智能指针【unique_ptr】基本使用
一、概述C++ 11 引入了智能指针的概念来解决该问题。智能指针是一个可以像指针一样工作的对象,但是当它不再被使用时,可以自动删除动态分配的内存。C++11 提供了 3 种智能指针类型,它们分别由 unique_ptr 类、shared_ptr 类和 weak_ptr 类定义,所以又分别称它们为独占指针、共享指针和弱指针。智能指针背后的核心概念是动态分配内存的所有权。智能指针被称为可以拥有或管理它所指向的对象。当需要让单个指针拥有动态分配的对象时,可以使用独占指针。对象的所有权可以从一个独占指针转移到原创 2021-01-05 22:57:41 · 1322 阅读 · 0 评论 -
C++智能指针【weak_ptr】基本使用
上篇:C++智能指针【shared_ptr】基本使用一、概述weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象. 进行该对象的内存管理的是那个强引用的 shared_ptr. weak_ptr只是提供了对管理对象的一个访问手段. weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用原创 2021-01-04 22:12:02 · 272 阅读 · 0 评论 -
C++智能指针【shared_ptr】基本使用
一、概述C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr。虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用更加安全的 unique_ptr,后文会详细叙述。shared_ptr 和 weak_ptr 则是 C+11原创 2020-12-28 20:47:42 · 668 阅读 · 0 评论 -
C++可变参模板
可变参数模板是一个接受可变数目参数的模板函数或模板类,在模板参数列表中,typename…指出接下来的参数表示0个或多个类型的列表,一个类型名后面跟省略号表示0个或多个给定类型的非类型参数的列表。在函数参数列表中,如果一个参数的类型是一个模板参数包,则此参数也是一个函数参数包。可变参数模板通常是递归的,第一步调用处理包中的第一个实参,然后用剩余实参调用自身, sizeof…运算符可以获得包中元素数量。一、可变参数模板函数如果需要用参数包中的参数,则一定要将参数包展开。有两种展开参数包的方法:(1)通原创 2020-12-26 19:38:12 · 675 阅读 · 0 评论 -
C++模板全特化、偏特化
一、类模板特化1. 类模板全特化1. 常规全特化必须2.2. 类模板偏特化(局部特化)二、函数模板特化1. 函数模板全特化2. 函数模板偏特化三、模板特化版本放置位置建议原创 2020-12-26 12:11:16 · 469 阅读 · 0 评论 -
C++成员函数模板,显示实例化、声明
一、普通类的成员函数模板不管是普通类,还是类模板,它的成员函数可以是一个函数模板,称为成员函数模板,不可以是虚函数,否则编译器报错。class A {public: template<typename T> void Func(const T& a) { cout << a << endl; }};int main(){ A a; a.Func(5); //编译器自动推断类型来实例化这个函数模板 //a.Func<int&原创 2020-12-24 20:53:22 · 1293 阅读 · 0 评论 -
C++函数指针和模板
一、函数指针声明//函数原型double sum(double,double);//函数指针的声明double (*ptrSum)(double,double)注意:1,该语句声明了一个指针ptrSum,指向一个函数。2,double *ptrSum(double,double) 不是函数指针 而是:声明一个函数,返回值为double *类型(指针函数)。3,需要先定义函数,然后再定义函数指针。//定义一个函数指针类型typedef int (*FuncType)(int, int原创 2020-12-24 08:25:31 · 3171 阅读 · 0 评论 -
C++类模板概念、定义、使用
一、概述与函数模板类似地(C++模板详解(一):函数模板的概念和特性) ,类也可以被一种或多种类型参数化。例如,容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素。只要使用类模板,我们就可以实现容器类,而不需要确定容器中元素的类型。二、类模板定义template<typename 模板参数1,typename 模板参数2,....>class 类名{};三、类模板的成员函数类模板成员函数,可以写在类模板定义中,这种成员函数会隐式声明为inline函数。类原创 2020-12-09 22:56:15 · 958 阅读 · 0 评论 -
C++模板概念、函数模板定义、调用
一、概述模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector 或 vector < string>。模板一般分为函数模板和类模板。您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。二、函数模板定义1. 定义形式template <模板参数列表>原创 2020-12-08 22:55:05 · 1122 阅读 · 0 评论 -
C++类型转换构造函数、运算符、类成员指针
简单的来讲,类型转换构造函数的作用就是将一个变量通过构造函数转换为类类型;类型转换运算符就是将类类型转换为已有的变量类型;类成员指针在C++中用于对类中的成员进行操作。一、类型转换构造函数、运算符C++中没有返回类型的函数有3个,构造函数、析构函数、类型转换函数。1、转换构造函数在C++中,类的构造函数可以省略不写,这时C++会为它自动创建一个隐式默认构造函数(implicit default constructor);也可以由用户定义带参数的构造函数,构造函数也是一个成员函数,他可以被重载;当一个转载 2020-12-07 22:55:40 · 249 阅读 · 0 评论 -
C++继承的构造函数、多重继承、虚继承
一、继承继承性是面向对象程序设计的第二大特性,它允许在既有类的基础上创建新类,新类可以继承既有类的数据成员和成员函数,可以添加自己特有的数据成员和成员函数,还可以对既有类中的成员函数重新定义。利用类的继承和派生实现了更高层次的代码可重用性,符合现代软件开发的思想。C++语言同时支持单一继承和多重继承。单一继承是指派生类只从一个基类继承而来;相应的,多重继承指派生类同时从两个或更多的基类继承而来。1. 继承的特性:(1)定义派生类关键字可以是class或者是struct,两者区别是:用class定义派原创 2020-12-03 20:40:48 · 1748 阅读 · 0 评论 -
C++using用法
1、概述我们用到的库函数基本上都属于命名空间std的,在程序使用的过程中要显示的将这一点标示出来,如std::cout。这个方法比较烦琐,而我们都知道使用using声明则更方便更安全。这个我们程序员肯定都知道了,今天突发奇想就想对using整理一下。2、命令空间的using声明我们在书写模块功能时,为了防止命名冲突会对模块取命名空间,这样子在使用时就需要指定是哪个命名空间,使用using声明,则后面使用就无须前缀了。例如:using std::cin; //using声明,当我们使用cin时,从命转载 2020-11-16 08:42:55 · 4257 阅读 · 1 评论 -
C++ std::move 原理实现与用法总结
在C++11中,标准库在中提供了一个有用的函数std::move,std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);std::move函数可以以非常简单的方式将左值引用转换为右值引用。(左值 右值 引用 左值引用)概念 https://blog.csdn.net/p942005405/article转载 2020-11-14 16:35:51 · 587 阅读 · 0 评论 -
C++RTTI、dynamic_cast、typeid、虚函数表
一、RTTI运行时类型识别1. 作用作用:通过运行时类型识别,程序能够使用基类指针或引用来检查这些指针或引用所指的对象的实际派生类对象。(包含两个运算符dynamic_cast、typeid)注意:要想两个运算符能后正常使用,那么基类中至少要有一个虚函数2. dynamic_cast运算符能够将基类的指针或引用安全的转换成派生类的指针或引用。(可以做安全类型检查)将基类指针转换成派生类指针 代码演示: Human* p = new Man; p->eat(); //基类的虚函数,子原创 2020-11-14 11:19:23 · 193 阅读 · 0 评论 -
C++友元函数、友元类、友元成员函数
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的。例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。友元(friend)机制允许一个类将对其非公有成员的访问权授予指定的函数或者类,友元的声明以friend开始,它只能出现在类定义的内部,友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响。通常,将友元声明成组地放在类定义的开始或结尾是个好主意。1、友元函数定义:友元函数是指某些虽然原创 2020-11-13 23:06:42 · 1088 阅读 · 0 评论 -
C++基类指针、虚函数、多态性、纯虚函数、虚析构
C++继承和派生一、基类指针、派生类指针父类指针可以new一个子类对象二、虚函数有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数(必须是同名,同参,同返回值)?有解决方案,这个对象指针必须是一个父类类型,我们如果想通过一个父类指针调用父类、子类中的同名函数的话,这个函数是有要求的;在父类中(子类中加或不加都可以),eat函数声明之前必须要加virtual声明eat()函数为虚函数。一旦某个函数被声明为虚函数,那么所有派生类(子类)中eat()函数都是原创 2020-11-12 22:45:30 · 199 阅读 · 0 评论 -
C++拷贝构造函数详解
一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a = 100;int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。#include <iostream>using namespace std;class CExample {private: int a;public: //构造函数 CExample(int b)转载 2020-11-04 22:26:10 · 356 阅读 · 0 评论 -
C++ static详解
一、c/c++共有:修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。修饰局部变量时,表明该变量的值不会因为函数终止而丢失。修饰函数时,表明该函数只在同一文件中调用。1、全局静态变量:用法:在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。 static int temp;内存中的位置:静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);作用域:全局静态变量在声明他的文件转载 2020-11-02 22:03:53 · 16563 阅读 · 1 评论 -
C++ 顺序容器(vector、list、deque、array、forward_list)详解
一、容器的定义在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法。二、容器的种类1. 顺序容器:是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。顺序容器包括:vector(向量)、list(列表原创 2020-10-30 22:07:05 · 966 阅读 · 0 评论 -
C++string类型详解
我们知道string可以构造一个字符串变量,那么它的操作有哪些呢。它包含在string库中(不是string.h没有.h),它可以和定义一个字符一样定义一个字符串变量,而且强大的C++还内置了各种函数,基本实现不用再手写操作函数。而且可以进行字典序的比较和串操作。一、对位和对串操作如何或者string串中的某一位字符呢,我们使用数组下面的方式就可以访问。例如string s = "abcdef";cout << s[0] << endl;结果就应该是输出了字符’a’,同转载 2020-10-29 22:13:52 · 2233 阅读 · 2 评论 -
C++常量、引用、动态内存分配
一、定义变量 //常规写法 int x = 10, y = 25; //c++11写法,等号可以省略 int a = { 5 }; int b = { 10 }; int c[] = { 10,50,60 };二、auto变量的自动类型推断发生在编译期间,所以使用不会造成程序效率降低。注意:声明auto变量时要附初值【初始化】 auto a = true; auto b = 'b'; auto c = 1.5f; auto d = 5;三、头文件原创 2020-10-27 22:49:50 · 140 阅读 · 0 评论 -
C++实现文件下载功能
bool DownLoad(LPCWSTR _url, QString strfile){ QByteArray arr = strfile.toLocal8Bit(); const char* _file_name = arr.data(); FILE* fp_download = fopen(_file_name, "wb"); if (fp_download == NULL) { return false; } HINTERNET innet_open = InternetOpe原创 2020-06-08 19:48:58 · 2097 阅读 · 3 评论 -
多态和虚函数
一、什么是多台原创 2020-06-08 19:48:00 · 270 阅读 · 0 评论