![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++基础知识
zzZZ20150101
分享自己学到的东西
展开
-
C++函数指针
定义函数指针就是函数的首地址,而函数名也可以代表指向这个函数的指针。静态成员函数指针声明typedef void (*STATICFUNC) (int a, int b);定义STATICFUNC = 函数名非静态成员函数指针声明typedef bool(ClassName::*TestFunc)(int a);定义TestFunc = &ClassName:函数名。多重继承时函数指针占用包含了this指针的调整值。因为对于多重继承来说,如果类成员原创 2021-09-17 09:58:24 · 67 阅读 · 0 评论 -
C/C++ extern关键字详解
功能说明使用extern 修饰符的目的在于声明:此变量/函数是在别处定义的,要在此处引用。extern声明不是定义,即不可分配存储空间。当在定义这个函数或变量外的地方需要使用它们也可以使用extern关键字其功能相当于:使用头文件,然后声明它们,然后其他文件去包含头文件注:这里疑惑我这边实际项目开发的时候比较少用到这种方式,不懂这个出发点是啥???。extern "C"的作用背景C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称。而C语言原创 2021-09-06 11:32:13 · 86 阅读 · 0 评论 -
C++ typedef用法
前言typedef可以为现有的类型、数组、指针、函数进行别名的设置。使用的出发点有两个 给变量一个易记且意义明确的新名字。 简化一些比较复杂的类型声明。 类型声明typefef int size;//给int定义了一个size的的别名。typefef unsigned int WORD //给unsigned int 定义了一个WORD的别名数组声明typedef char ccc10[10]定义别名后char[10]等价于 ccc指针原创 2021-09-06 11:05:44 · 146 阅读 · 0 评论 -
C++位运算
运算符 位逻辑运算符 &(位 “与”) and一个原则,a&b = 1的情况只有a和b都是1.。&通常用于二进制取位操作,例如&1就是取二进制的最末位,取&10就是取倒数第二位。^(位 “异或”)一个原则,不同则为1,相则为0。(1)可以用于简单的加密。。(a^b)^b=a,那么假设a为原始值,b为加密数,则只要通过加密后的数字^b就能获到原有的。值。(2)可以进行不用临时变量的变量值交换。a = a^b...原创 2021-07-20 10:28:55 · 54 阅读 · 0 评论 -
C++宏相关的基础介绍
定义常量#define ConstNum 1防止魔术数字的书香,用以给常量值表明变量含义。宏定义函数#define MAX(a, b) ( (a) > (b) ? (a) : (b) )这种宏定义函数的方法可以使代码变得更简洁,而且可以提高代码的执行效率,我们知道程序在调用宏定义时,是在代码执行时宏定义的地方直接进行替换,所以不会像调用函数那样进行压栈,让PC指针跳转另一块内存区域,从而使执行效率提高。在编译器的头文件中也有很多类似于这种方式的宏定义,...原创 2021-07-19 15:18:30 · 72 阅读 · 0 评论 -
无法解析的外部符号原因
类的成员函数没有实现就调用 调用没有编译生成cpp 的函数 没有加载lib 有声明无定义 在包含windows头文件冲突的库没有编译成lib或者dll 已经编译了一个cpp,在新加的cpp与已经编译的cpp同名,造成.obj被替换,无法链接,出现无法解析的外部符号(重新生成.obj) 平台下 没有加 __declspec(dllexport) 就编译为动态库 ...原创 2021-06-28 10:48:26 · 99 阅读 · 0 评论 -
C++头文件包含顺序推荐
前言C++代码中在实际编程中大家最经常遇到的错误,一般研二都是因为头文件的包含顺序以及引用未定义的符号而引起的。在《Google C++ Style Guide》和《C++编程思想》分别推荐了两种不同的头文件包含顺序。推荐顺序一 本文件对应头文件.h C 系统文件 C++ 系统文件 其他库的 .h 文件 本项目内 .h 文件 推荐顺序二 本文件对应头文件.h 本项目内 .h 文件 其他库的 .h 文件 C++ 系统原创 2021-04-30 11:16:09 · 582 阅读 · 0 评论 -
C++指针、引用、取地址
指针 指针指向一块内存,它的内容是所指内存的地址 指针可以为空 指针是类型不安全的 引用 引用是某块内存的别名 引用不能为空 引用必须被初始化 引用是类型安全的 &引用和取地址判断和类型在一起的是引用,和变量在一起的是取址...原创 2021-02-22 17:30:55 · 108 阅读 · 0 评论 -
C++输出格式控制符
%d 按整型数据的实际长度输出%md 使输出长度为m,如果数据长度小于m,则左补空格,如果大于m,则输出实际长度%ld 输出长整型数据%o 以八进制形式输出整数%x格式符 以十六进制形式输出整数%u格式符 用来输出unsigned型数据,以十进制形式输出%c格式符 用来输出一个字符%s 输出实际长度字符串%ms 输出的串占m列,如果串长度小于m,左补空格,如果大于m,实际输出%-ms输出的串占m列,如果串长度小于m,右补空格,%m.ns 输出占m列,但...原创 2021-02-20 15:49:18 · 573 阅读 · 1 评论 -
C++继承
定义继承就是不修改原有的类,直接利用原来的类的属性和方法并进行扩展。原来的类称为基类,继承的类称为派生类,他们的关系就像父子一样,所以又叫父类和子类。派生类成员可以访问基类的public成员和protected成员格式class 派生类名 : 继承类型 基类名三种继承方式继承类型有三种,共有继承(public),私有继承(private)和保护继承(protected)。无论哪种继承派生类都不能访问基类的私有成员共有继承共有继承的特点是基类成员在派生类中都保持原来的访问级别。原创 2021-02-20 14:44:12 · 63 阅读 · 0 评论 -
C++union
定义 union即为联合,它是一种特殊的类。通过关键字union进行定义,一个union可以有多个数据成员。 union变量所占用的内存长度等于最长的成员的内存长度。 在任意时刻,联合中只能有一个数据成员可以有值。会自动进行覆盖。根据最新的一次赋值。 union与struct比较 union中的所有变量都是从同一个地址开始 struct可以多个成员同时存在,union只能存在一个数据成员 union中可以有对象数据成员吗?union不支持不允许存放带有构原创 2021-02-20 14:21:55 · 112 阅读 · 0 评论 -
C++虚函数、纯虚函数、抽象类
虚函数基类中的函数加入了virtual关键字的函数就是虚函数。派生类中可以通过virtual和override关键字对基类的虚函数进行重写。虚函数的使用就是C++面向对象中的多态性的体现。与普通函数的不同点在于:它属于"动态联编”,函数的调用并不是在编译时刻被确定的,而是在运行时刻确定的。由于编写代码的时候并不能确定被调用的是基类的函数,还是哪个派生类的函数,所以被称为“虚函数”。虚函数存在的意义在于可以通过基类访问派生类定义的函数。纯虚函数纯虚函数是在基类中声明的虚函数,它在基类中原创 2021-02-14 21:29:54 · 72 阅读 · 0 评论 -
C++智能指针
概述shared_ptr和weak_ptr是从C++11标准库Boost中引入的两种智能指针目前在实际应用最为广泛。此外。Boost库还提出了boost::scoped_ptr、boost::scoped_array、boost::instrusive_ptr等智能指针,虽然尚未得到C++标准采纳,但是在开发实践中可以使用。shared_ptr shared_ptr对象除了包括一个所拥有对象的指针外,还必须包括一个引用计数代理对象的指针。 时间上的开销主要在初始化和拷贝操作上,*和-原创 2021-02-10 14:57:33 · 96 阅读 · 0 评论 -
C++构造函数与析构函数调用顺序
简介构造函数:在实例化的时候自动执行,对类中的成员进行初始化。构造函数可以重载,可以有多个,但是只能拥有一个默认构造函数。析构函数:在对象释放前可以进行一些操作的函数。析构函数不能被重载,只能拥有一个。执行顺序先构造的后析构,后构造的先折构。它相当于一个栈,先进后出。对象成员执行顺序构造的时候先构造成员再构造自己的,按照成员在类中的声明顺序而不是初始化的顺序。析构执行顺序依照大的原则,与构造顺序相反。存在继承关系时的执行顺序存在继承关系时,先执行父类的构造函数,再执行子类原创 2021-02-10 13:41:53 · 90 阅读 · 0 评论 -
C++普通成员与静态成员差异
核心差异普通变量的生存周期在改对象的生存期中。而静态变量不存在生存周期的概念,它会被编到程序的exe里面因此始终在内存中。静态变量详细介绍全局变量默认是静态变量。与普通成员一样遵从public、private、protected访问规则。 静态变量 普通变量 即使类不实例化也能通过类名::静态成员名访问 一定要类实例化才能访问 不能访问非...原创 2021-02-07 09:43:39 · 60 阅读 · 0 评论 -
静态链接库
简介静态库(*.lib)在编译期间由编译器和链接器将它集成到可执行文件中。使用方法CPP文件中包含对应静态库的头文件在项目中附加库目录,有两种方法我一般使用第一种 项目属性设置 (1)项目右键-》属性-》链接器-》附加库目录,在里面加入静态库所在的路径(2)链接器-》输入-》附加依赖项-》输入对应Lib文件 在CPP中添加包含Lib语句 #pragma comment(lib,"../lib/*.lib")创建方法 创建项目的时候就要选择创建..原创 2021-02-05 10:46:54 · 78 阅读 · 0 评论 -
宏定义操作符#和##
#是“字符串化”的意思。例如:string a = "b"TEST_MACRO(a);在参数a前面加上#号就能转为字符串“a”####是一个连接符号,用于把参数连在一起例如:> #define TEST_MACRO(param) aaa##param则>TEST_MACRO(abc)则呢不处理为aaaparam...原创 2021-02-02 10:11:24 · 115 阅读 · 0 评论 -
宏定义函数使用
优缺点优点 相比函数调用空间和使用开销更少,函数调用需要下面几个步骤 开辟一片栈空间 记录返回地址 将形参压栈, 从函数返回还要释放堆栈。 参数类型更加灵活 函数的参数必须被声明为一种特定的类型,所以它只能在类型合适的表达式上使用,我们如果要比较两个浮点型的大小,就不得不再写一个专门针对浮点型的比较函数。反之,上面的那个宏定义可以用于整形、长整形、单浮点型、双浮点型以及其他任何可以用“>”操作符比较值大小的类型,也就是说,宏是与类型无关的。原创 2021-02-02 09:56:03 · 183 阅读 · 0 评论 -
C++反射与序列化介绍
反射介绍反射是指程序在运行时动态获取对象属性与方法的一种机制,即编译器需要将类型信息(属性类型与偏移地址以及成员函数的地址等信息)编译到程序文件中,当程序运行时将这些信息加载到内存中去,做到运行时只根据对象的地址或引用就可以获取到对象的类型信息,从而利用这些信息达到修改或重建对象的目标。C++至今本身还不能支持反射,需要开发者自己写代码去实现反射的功能。反射的由来第一阶段二十一世纪以前由于内存与带宽是非常昂贵的资源所以由于C/C++的结构体拥有无需序列化与反序列化的优点因此C/C++是当原创 2021-01-28 14:31:28 · 251 阅读 · 0 评论 -
C++11的constexpr关键字
优点(1)常量表达式主要是允许一些计算发生在编译时,它将只做一次。(2)它允许函数被应用在以前调用宏的所有场合。例如,你想要一个计算数组size的函数,size是10的倍数。如果不用constexpr,你需要创建一个宏或者使用模板,因为你不能用函数的返回值去声明数组的大小。但是用constexpr,你就可以调用一个constexpr函数去声明一个数组。如下: constexpr int getDefaultArraySize(int multiplier) {..转载 2021-01-25 19:10:10 · 72 阅读 · 0 评论 -
const修饰符
C++中的const可用于修饰 变量 函数返回值 函数参数 函数 成员变量 const修饰变量用const修饰变量的语义是要求编译器去阻止所有对该变量的赋值行为。因此,必须在const变量在声明时就要马上赋值。const修饰函数返回值const用来修饰返回的指针或引用,保护指针指向的内容或引用的内容不被修改,也常用于运算符重载。目的在于函数调用表达式不能作为左值。const修饰函数参数防止传入的参数代表的内容在函数体内被改变,但仅对指针和原创 2021-01-25 18:58:17 · 108 阅读 · 0 评论 -
程序编译流程
程序编译的过程中就是将用户的文本形式的源代码(c/c++)转化成计算机可以直接执行的机器代码的过程。主要经过四个个过程: 预处理 预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件(.i)。预处理中替代的内容为 宏定义 #include文件包含 条件编译 特殊符号 编译 将预编译生成的文件(.i)转变成汇编代码(.s)。这个阶段编译器主要做词法分析、语法分析、语义分析等,在原创 2021-01-25 16:29:09 · 77 阅读 · 0 评论 -
C++友元
友元的设计起源私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。C++是从结构化的C语言发展而来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的问题上不可限制太死。C++ 设计者认为, 如果有的程序员真的非常怕麻烦,就是想在类的成员函数外部直接访问对象的私有成员,那还是做一点妥协以满足他们的愿望为好,这也算是眼前利益和长远利益的折中。因此,C.原创 2021-01-21 20:49:33 · 52 阅读 · 0 评论 -
C++全局变量和局部变量介绍
C++作用域C++变量根据定义的位置的不同可将作用域分为6种: 全局作用域 局部作用域 语句作用域 类作用域 命名空间作用域 文件作用域 全局变量全局变量具:有全局作用域,全局变量只需要在一个源文件中定义,就可以作用于所有的源文件。如果要在其他源文件使用此变量则需要用extern关键字进行再次声明。静态全局变量:也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它的作用域只存在于自己定义的文件中。静态全局变量使用场景原创 2021-01-20 08:59:45 · 131 阅读 · 0 评论