C++
文章平均质量分 57
C++
Overboom
这个作者很懒,什么都没留下…
展开
-
C++中如何调用C代码
2> 对在cpp头文件中的引用#include的格式进行修改。1> 使用extern “C” 对原C文件的头文件进行修改。C++中要使调用C函数会出现函数未定义的错误。背景:为什么会在C++代码中调用C代码。原创 2023-02-28 14:35:42 · 477 阅读 · 0 评论 -
[C++模板] --- 类模板
1. 类模板语法类模板作用:建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。类模板语法:template<typename T>类template — 声明创建模板typename — 表面其后面的符号是一种数据类型,可以用class代替T — 通用的数据类型,名称可以替换,通常为大写字母2. 类模板与函数模板区别类模板与函数模板区别有两点:类模板没有自动类型推导的使用方式类模板在模板参数列表中可以有默认参数#inclu原创 2022-01-20 18:51:44 · 101 阅读 · 0 评论 -
[C++模板] --- 函数模板
1. 为什么需要函数模板在泛型编程出现前,我们要实现一个swap函数得这样写:void swap(int &a, int &b) { int tmp{a}; a = b; b = tmp;}但这个函数只支持int型的变量交换,如果我们要做float, long, double, std::string等等类型的交换时,只能不断加入新的重载函数。这样做不但代码冗余,容易出错,还不易维护。C++函数模板有效解决了这个问题。函数模板摆脱了类型的限制,提供了通用的处原创 2022-01-20 16:58:16 · 726 阅读 · 0 评论 -
【C++】 new/delete与 malloc/free
malloc free / new delete针对基本数据类型,一样针对结构体/类,new delete会调用构造/析构函数,malloc free不会调用构造/析构函数new做两件事,一是分配内存,二是调用类的构造函数;同样,delete会调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。基本类型数组delete p与delete [] p是一样的针对结构体/类,单个堆上的对象,不可以delete []pnew高级用法:在栈区、静态区分配内存,但是在栈区、静态区都不可原创 2022-01-05 13:34:56 · 554 阅读 · 0 评论 -
【C++】 --- 如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
如果函数名相同,在相同的作用域内,其参数类型、参数个数,参数顺序不同等能构成函数重载。有趣的是如果同时在类中,对于函数名相同参数列表也相同的成员函数的const函数和非const函数能够构成重载。#include <iostream>int override_test(int a, int b){ return a + b;}int override_test(int a, float b){ return a + b;}/*int ov原创 2021-07-26 15:14:57 · 1635 阅读 · 0 评论 -
【C++】 --- 写个函数在main函数执行前先运行
这里介绍两种方法:1.使用attribute关键字,声明constructor和destructor函数(gcc中,注意:vc中不支持attribute)2.利用全局对象的构造函数会在main函数之前执行的特点#include <iostream>using namespace std;//方法1. 使用attribute关键字,声明constructor和destructor函数__attribute((constructor))void before_main(){原创 2021-07-26 15:00:00 · 486 阅读 · 0 评论 -
【C++】 --- static关键字简析
1. static作用于c/c++共有特点: - 修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。 - 修饰局部变量时,表明该变量的值不会因为函数终止而丢失。 - 修饰函数时,表明该函数只在同一文件中调用。 - static修饰的全局变量/局部变量,未初始化的放在bss段,已经初始化的static变量放在data段static在C++独有的特点有原创 2021-07-26 14:22:02 · 212 阅读 · 0 评论 -
【C++】 --- C++函数后面加const修饰符
C++函数后面的const,可以从下面两个方面进行理解:申明一个成员函数的时候用const关键字是用来说明这个函数是 “只读(read-only)”函数,也就是说明这个函数不会修改任何数据成员,除非成员加了修改mutable或者你在函数中主动使用了const_cast!为了声明一个const成员函数, 把const关键字放在函数括号的后面。声明和定义的时候都应该放const关键字。下面看具体的示例:#include<iostream>using namespace std;cla原创 2021-07-26 10:29:17 · 928 阅读 · 0 评论 -
【C++】 --- 字符串与字符数组
在C++中,有两种类型的字符串表示形式:C-风格字符串C++引入的string类string转const char*, char*, char[]#include <iostream>int main(void){ std::string str = "helloWorld!"; //string转const char *用 string的.c_str()方法 const char * constc = str.c_str(原创 2021-07-21 22:08:28 · 872 阅读 · 0 评论 -
【C++】 --- 强制转换运算符
1. 隐式转换C/C++中的类型转换分为两种:隐式类型转换和显示类型转换。隐式类型转换服从向下兼容的原则:char x = 5;int y = x; //将char转换为int,即是隐式转换2. 显示转换(强制类型转换)C语言中典型的强制类型转换int *p = (char *) x;C++对C兼容,上面的转换方式是可行的,但是有时候会有问题,所以C++新增了四个强制类型转换关键字const_cast<type> (expr): const_cast 运算符用于修改原创 2021-07-19 23:21:28 · 607 阅读 · 3 评论 -
【C++】--- namespace命名空间
1. C++ 命名空间的引入一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。例如小李和小韩都参与了一个文件管理系统的开发,它们都定义了一个全局变量 fp,用来指明当前打开的文件,将他们的代码整合在一起编译时,很明显编译器会提示 fp 重复定义(Redefinition)错误。为了解决合作开发时的命名冲突问题,C++ 引入了命名空间(Namespace)的概念。请看下面的原创 2021-07-19 22:09:36 · 258 阅读 · 0 评论 -
【C++】 --- using用法总结
1. 配合命名空间,对命名空间进行权限管理using namespace std;//释放整个命名空间到当前作用域using std::cout; //释放某个变量到当前作用域2. 类型重命名作用等同于typedeftypedef std::vector<int> intvec;using intvec = std::vector<int>; //这两个写法是等价的再来看一个函数指针的例子typedef void (*FP) (int, cons原创 2021-07-19 17:04:59 · 137 阅读 · 0 评论 -
【C++】 --- C++异常处理(try catch throw)
1. 异常的概念程序运行时常会碰到一些异常情况,例如:做除法的时候除数为 0; 用户输入年龄时输入了一个负数; 用 new 运算符动态分配空间时,空间不够导致无法分配; 访问数组元素时,下标越界; 打开文件读取时,文件不存在。这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃。所谓“处理”,可以是给出错误提示信息,然后让程序沿一条不会出错的路径继续执行;也可能是不得不结束程序,但在结束前做一些必要的工作,如将内存中的数据写入文件、关闭打开的文件、释放动态分配的内存空间等。一发转载 2021-07-19 16:19:58 · 368 阅读 · 0 评论 -
【C++】 --- 虚析构和纯虚析构
1. 为什么需要虚析构函数多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码code示例:#include <iostream>#include <stdlib.h>#include <string>using namespace std;class Animal {public: Animal() { cout << "Animal 构造函数调用!" << endl; }原创 2021-05-31 00:00:56 · 257 阅读 · 2 评论 -
【C++多态】 --- 多态实现原理简析
1. 多态分类多态分为两类 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名 动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定 - 编译阶段确定函数地址 动态多态的函数地址晚绑定 - 运行阶段确定函数地址 2. 动态多态的满足条件1. 有继承关系2. 子类重写父类中的虚函数动态多态使用条件父类指针或引用指向子类对象3. 多态实现的前提赋值兼容规则是指在需要父类对象的地方可以使用子类对象原创 2021-05-30 23:32:23 · 183 阅读 · 1 评论 -
【C++多态】 --- 多态问题抛出与virtual关键字
1. C++中多态的概念C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。2. C++多态问题抛出下面看一个具体的例子:#include <iostream>#include <stdlib.h>using namespace std;class Animal{public: void speak(void) { cout << "动物在说话" << en原创 2021-05-30 23:07:20 · 273 阅读 · 1 评论 -
vs2018 设置了包含路径还是提示说打不开头文件
这个问题,主要还是对编译和调试工具不熟悉导致的 。编译工具选择和设置的不同导致即使设置了包含路径,依然提示找不到。项目 - 属性 - CV++目录 注意上方的平台是否选错,设置后再设置包含路径选择的编译平台是 下图这个:设置属性包含的路径要设置一致的平台,如下图:...原创 2020-11-10 22:54:13 · 600 阅读 · 1 评论 -
【C++】 --- STL常用算法总结
1 常用遍历算法for_each //遍历容器transform //搬运容器到另一个容器中1.1 for_each**功能描述:*** 实现遍历容器**函数原型:**for_each(iterator beg, iterator end, _func); // 遍历算法 遍历容器元素 // beg 开始迭代器 // end 结束迭代器 // _func 函数或者函数对象#include <algorithm>#include ...原创 2020-09-07 21:55:33 · 291 阅读 · 0 评论 -
【C++】 --- 函数对象
1. 函数对象的概念如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名仿函数。函数对象(仿函数)是一个类,不是一个函数2. 谓词概念返回bool类型的仿函数称为谓词 如果operator()接受一个参数,那么叫做一元谓词 如果operator()接受两个参数,那么叫做二元谓词#include <vector>#inclu...原创 2020-09-07 21:01:10 · 169 阅读 · 0 评论 -
【C++ STL】 --- map
1、map基本概念简介:map中所有元素都是pairpair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)所有元素都会根据元素的键值自动排序本质:map/multimap属于关联式容器,底层结构是用二叉树实现。优点:可以根据key值快速找到value值map和multimap区别:map不允许容器中有重复key值元素multimap允许容器中有重复key值元素2、map的构造和赋值功能描述:对map容器进行构造和赋值操作原创 2020-08-30 23:11:12 · 522 阅读 · 0 评论 -
【C++ STL】 --- list
1、list基本概念功能:将数据进行链式存储链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的链表的组成:链表由一系列结点组成结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域STL中的链表是一个双向循环链表由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器list的优点:采用动态存储分配,不会造成内存浪费和溢出链表执行插入和删除操作十分方便,修改指针即原创 2020-08-30 23:02:40 · 329 阅读 · 0 评论 -
【C++ STL】 --- queue
1、queue 基本概念概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口队列容器允许从一端新增元素,从另一端移除元素队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为队列中进数据称为 --- 入队 push队列中出数据称为 --- 出队 pop2、queue常用接口构造函数:queue<T> que; //queue采用模板类实现,queue对象的默认构造形式queue(con原创 2020-08-30 22:50:08 · 149 阅读 · 0 评论 -
【C++ STL】 --- stack
1、stack基本概念概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为栈中进入数据称为 --- 入栈 push栈中弹出数据称为 --- 出栈 pop2、stack常用接口功能描述:栈容器常用的对外接口构造函数:stack<T> stk; //stack采用模板类实现, stack对象的默认构造形式stack(const stack原创 2020-08-30 22:46:55 · 135 阅读 · 0 评论 -
【C++ STL】 --- deque
1 deque容器基本概念(1)功能:双端数组,可以对头端进行插入删除操作(2)deque与vector区别:vector对于头部的插入删除效率低,数据量越大,效率越低deque相对而言,对头部的插入删除速度回比vector快vector访问元素时的速度会比deque快,这和两者内部实现有关(3)deque内部工作原理:deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间deque容原创 2020-08-30 22:42:04 · 97 阅读 · 0 评论 -
【C++ STL】 --- vector
1、vector基本概念(1)功能:vector数据结构和数组非常相似,也称为单端数组(2)vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展(3)动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间(4)vector容器的迭代器是支持随机访问的迭代器2、vector构造函数功能描述:创建vector容器函数原型:vector<T> v; //采用模板实现原创 2020-08-30 22:29:46 · 107 阅读 · 0 评论 -
【C++ STL】 --- string
1、string基本概念(1)本质:string是C++风格的字符串,而string本质上是一个类(2)string和char * 区别:char * 是一个指针string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。(3)特点:string 类内部封装了很多成员方法例如:查找find,拷贝copy,删除delete 替换replace,插入insertstring管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责2、string构造函数构原创 2020-08-30 22:15:15 · 217 阅读 · 0 评论 -
【C++】 --- 纯虚函数和抽象类
纯虚函数的定义: virtual 返回类型 函数名(形参) = 0含有纯虚函数的类叫抽象类抽象类的特点:不能用抽象类去实例化对象抽象类的作用:提供一个统一的接口,让子类去实现,子类实现之后才可以实例化对象/**纯虚函数的定义: virtual 返回类型 函数名(形参) = 0含有纯虚函数的类叫抽象类抽象类的特点:不能用抽象类去实例化对象抽象类的作用:提供一个统一的接口,让子类去实现,子类实现之后才可以实例化对象*/class figure //抽象类{public: .原创 2020-08-18 21:06:10 · 198 阅读 · 0 评论 -
【C++】 --- 继承中的构造和析构
1、类型兼容性原则类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。类型兼容规则中所指的替代包括以下情况:子类对象可以当作父类对象使用子类对象可以直接赋值给父类对象子类对象可以直接初始化父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。类型兼容规则是多态性的重要基础之一。2、继承中的内存模型class A{public:protected原创 2020-08-18 20:34:54 · 222 阅读 · 0 评论 -
【C++】 --- 文件读写
一、文件类型分为两种: 1> 文本文件 - 文件以文本的ASCII码形式存储在计算机中 2> 二进制文件 - 文件以文本的二级制形式存储在计算中二、文本文件读写操作1、文本文件写文件步骤如下: 1> 包含头文件<fstream> 2> 创建流对象 ofstream ofs; 3> 打开文件 ofs.open(“文件路径”, 打开方式) 4> ...原创 2020-08-17 23:25:12 · 413 阅读 · 0 评论 -
【C++】 --- 友元函数与友元类
1、友元函数友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:friend 类型 函数名(形式参数); 友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。一个函数可以是多个类的友元函数,只需要在各个类中分别声明。友元函数的调用与一般函数的调用方式和原理一致...原创 2020-08-16 20:56:18 · 428 阅读 · 0 评论 -
【c++】 --- 对象的动态建立和释放
1、在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。注意: new和delete是运算符,不是函数,因此执行效率高。2、虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。new和delete运算符的一般使用格式为:原创 2020-08-16 16:39:11 · 267 阅读 · 0 评论 -
C++ --- error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”
静态调用DLL Project | setting Link选项卡Library modules处 添加“XXX.lib” 然后#include "XXX.h" 把XXX.lib(引入库文件),XXX.DLL(动态库文件) XXX.h(头文件) 全部放到工程目录下解决方法:1、右击工程 -->属性->配置属性-->常规--->字符集---->使用unicode字符集2、右击工程 -->属性->配置属性-->C/C++-->语言--..原创 2020-08-07 22:19:37 · 910 阅读 · 0 评论 -
C++ --- Dll文件的生成与调用(二)之动态库注入技术
这里的操作是在C++ --- Dll文件的生成与调用(一)的基础上进行修改和拓展的1、添加动态库入口函数的方式生成Dll文件,这个需要Windows的支持DemoDll.h文件#pragma once#include<Windows.h> // 引用Windows库#ifdef DemoDll#define DemoDll_API __declspec(dllexport) // 导出#else#define DemoDll_API __declspec(d原创 2020-08-07 22:13:38 · 501 阅读 · 0 评论 -
C++ --- Dll文件的生成与调用(一)
1、动态库dll概念动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 “.drv”(旧式的系统驱动程序)。2、使用VS生成dll文件(1)vs 那么可以直接创建c++空项目,然后修改一下项目属性,然后在制作无疑是最好的方式。(2)添加一个预处理定义注意:大概是.原创 2020-08-06 00:53:45 · 931 阅读 · 0 评论 -
【C++】 --- 虚析构函数
一、文件类型分为两种: 1> 文本文件 - 文件以文本的ASCII码形式存储在计算机中 2> 二进制文件 - 文件以文本的二级制形式存储在计算中二、文本文件读写操作1、文本文件写文件步骤如下: 1> 包含头文件<fstream> 2> 创建流对象 ofstream ofs;...原创 2020-02-10 14:14:46 · 406 阅读 · 0 评论 -
【C++】 --- 多态问题的抛出
1、多态分类: 静态多态:函数重载和运算符重载都属于静态多态, 动态多态:派生类和虚函数实现运行时多态2、静态多态和动态多态的区别:静态多态的函数地址早绑定 – 编译阶段确定函数地址 动态多态的函数地址晚绑定 – 运行阶段确定函数地址class Animal{public: //Speak函数就是虚函数 //函数前面加上virtual关键...原创 2020-02-10 13:17:43 · 260 阅读 · 0 评论 -
【C++】 --- 继承的理解
1、继承的语法class 子类:继承方式 父类2、继承方式一共有三种公共继承保护继承私有继承 继承方式/基类成员 public成员 protected成员 private成员 public继承 public protected ...原创 2020-02-09 16:04:14 · 226 阅读 · 0 评论 -
【C++】 --- 对象模型
一、C++对象模型1、在C++中,类内的成员变量和成员函数分开存储2、只有非静态成员变量才属于类的对象上class Person {public: Person() { mA = 0; } //非静态成员变量占对象空间 int mA; //静态成员变量不占对象空间 static int mB; //函数也不占对象空间,所有函数共享一个函数实例 void fun...原创 2020-02-08 15:14:07 · 180 阅读 · 0 评论 -
【C++】 --- 深拷贝与浅拷贝
一、C++构造函数的分类两种分类方式:按参数分为: 有参构造和无参构造按类型分为: 普通构造和拷贝构造三种调用方式:括号法显示法隐式转换法//1、构造函数分类// 按照参数分类分为 有参和无参构造 无参又称为默认构造函数// 按照类型分类分为 普通构造和拷贝构造class Person {public: //无参(默认)构造函数 Person()...原创 2020-02-08 13:44:44 · 424 阅读 · 0 评论 -
【C++基础】 --- C++在C的基础上对一些语法的增强
一、变量的定义//C语言中的变量都必须在作用域开始的位置定义!!//C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。int main(){ int i = 0; printf("ddd"); int k; system("pause"); return 0;}二、register关键字增强//register关键字 请求编译器让变量...原创 2019-07-02 14:07:25 · 342 阅读 · 0 评论