![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 69
每天学一点!
时刻保持对知识的热情!
展开
-
C++显示调用构造函数和析构函数
文章目录直接通过<类名>::构造函数或析构函数通过placement new类在new的时候其实做了两件事情:(1)调用malloc分配所需的内存(实际上是调用operator new)(2)调用构造函数类在delete的时候其实也做了两件事:(1)调用析构函数(2)调用free释放内存(实际上是调用operator delete)直接通过<类名>::构造函数...原创 2020-01-11 16:16:24 · 1204 阅读 · 0 评论 -
define与typedef、const、inline的区别
define与typedef区别 define是宏定义,typedef是重命名。typedef int int_32;typedef void(*Func)(int); // Func为一个函数指针#define PI 3.1415 // 宏定义没有;#define max(x,y) ((x)>(y)?(x):(y)) 作用域不同typedef(1)如果放在所有...原创 2020-01-11 15:10:36 · 561 阅读 · 0 评论 -
堆和栈
文章目录简介为什么栈向下增长为什么栈要比堆快为什么要使用栈来保存函数参数或者局部变量如何验证栈的增长方向栈帧函数参数压栈顺序栈溢出栈溢出例子简介 C/C++,一般内存模型从低到高分别为:text代码段,data全局/静态已初始区域,bss全局/静态未初始化区域,heap堆,stack栈,内核区。如下图所示[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOXh...原创 2020-01-11 14:33:07 · 390 阅读 · 0 评论 -
指针和引用的区别
文章目录引用和指针的区别汇编层次解释引用指针和引用函数调用的区别引用的好处引用和指针的区别(1)引用必须初始化,指针可以不初始化且可以为空(2)引用不可更改其绑定对象,指针可以改变其指向对象(3)sizeof对于引用得到是绑定对象的大小,而指针为4个字节(32位下)(4)引用不是对象,指针是对象,所以不能定义引用的引用(5)引用只能绑定在对象上,而不能绑定到字面值或某个表达式计算结果;...原创 2020-01-11 14:00:57 · 414 阅读 · 0 评论 -
C++11中的新容器(array,无序容器,tuple元组)
文章目录shrink_to_fitarrayforward_list无序容器元组tuple定义和初始化tuple访问tuple成员tuple中成员的数量和成员类型合并tuple遍历tupleC++11实现tuple的遍历C++14/17遍历参考资料shrink_to_fit// VS2019int main() { vector<int> arr(100); arr.empl...原创 2020-01-03 20:18:39 · 966 阅读 · 1 评论 -
C++11中的function和bind
C++11中引入lambda,与operator() 和 函数(函数指针)统称为可调用对象。而operator()和lambda也实现了闭包。闭包的概念 闭包是带有上下文的函数,这个函数带有状态,也就是重载了()的类。什么叫 “带有状态” 呢? 意思是这个闭包有属于自己的变量,这些个变量的值是创建闭包的时候设置的,并在调用闭包的时候,可以访问这些变量。 函数是代码,状态是一组变量,将...原创 2020-01-02 20:04:49 · 2168 阅读 · 0 评论 -
C++11-17中auto和decltype
文章目录autoC++11中auto的用法auto的注意点C++11中decltype的用法decltype的注意点C++14和17中的auto和decltype用auto声明函数返回值auto可用于lambda表达式的参数decltype(auto)声明函数返回类型用初始化值列表初始化变量auto的语义在if和switch中用auto参考资料 用过matlab、python等语言会发现,刚开...原创 2019-12-27 20:20:25 · 889 阅读 · 1 评论 -
C++11中的列表初始化
文章目录统一初始化防止类型窄化initializer_list统一初始化 C++之前对内置数组可以都过花括号进行初始化,而对于vector数组、自定义类型无法通过花括号初始化。// C++11之前的初始化int a1[5] = {1, 2, 3};int a2[] = {1, 2, 3};int b(0);int c1{0}; // c++98错误,C++11通过int c2...原创 2019-12-26 14:57:23 · 791 阅读 · 0 评论 -
this指针和delete this
文章目录this指针的作用this指针是否可以为空delete this合法吗this指针的作用 this指针是指向类对象的指针,在类的成员函数中通过this指针这个隐式参数来访问调用它的对象。当我们调用一个成员函数时,编译器会把对象的地址传给成员函数的隐式形参this。this指针可以区分静态成员函数和外部函数(如静态函数),后者没有。 为什么要引入this指针。由于每个对象都有其状态...原创 2019-12-24 19:46:30 · 631 阅读 · 0 评论 -
C++11-17中的lambda
文章目录可调用对象谓词lambda捕捉列表值捕获引用捕获可变lambda:mutable异常说明指定lambda返回类型lambda 捕捉表达式泛型lambdaconstexpr lambda向lambda传递this的拷贝参考资料可调用对象 可调用对象,有函数、函数指针、重载了函数调用运算符的类(也就是仿函数)、lambda表达式四种形式。这里主要介绍lambda的作用。谓词 先看下...原创 2019-12-21 21:16:03 · 1023 阅读 · 0 评论 -
C++中的RTTI
RTTI (Runtime Type Information,运行时类型信息),它提供了运行时确定对象类型的方法,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。为什么会出现RTTI这一机制,这和C++语言本身有关系。和很多其他语言一样,C++是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程序设计中多态性的要求,C++中的指针或...原创 2019-12-18 21:07:25 · 1444 阅读 · 1 评论 -
编译器优化RVO和NRVO
编译器选择 如果想自己实践RVO和NRVO,不要在VS下尝试(这里的VS不是指VS code),用支持g++的编译器去测试(我这里用的是minGW)。因为VS无论在Debug还是Release下都是无法关闭RVO优化的,Dubug下可以关闭NRVO优化。而g++默认都是执行NRV0优化的。RVO/NRVO RVO(Return Value Optimization,返回值优化),而NRV...原创 2019-12-17 15:00:43 · 1600 阅读 · 1 评论 -
浅谈拷贝构造/赋值运算符函数
拷贝构造函数和赋值运算符函数都是类中的特殊函数。什么时候执行拷贝构造函数/赋值运算符函数?拷贝初始化和直接初始化有什么区别?拷贝构造函数 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。 如果第一个参数不是引用类型,为了调用拷贝构造函数,必须拷贝它的实参,但为了拷贝它的实参,有需要调用拷贝构造函数,如此无限循环。拷贝赋值运算符 ...原创 2019-12-13 19:51:11 · 265 阅读 · 0 评论 -
C++11中的nullptr和constexpr
nullptr nullptr的出现是为了代替NULL,首先看下NULL的定义:// vs2017下#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif#endif C++将NULL视为0,所以以下代码就会影响直...原创 2019-12-13 15:45:06 · 270 阅读 · 0 评论 -
C++11中的override和final关键字
(1)override 含义:被标识的函数需要强制重写基类虚函数。class Base {public: Base() = default; ~Base() = default; virtual void test() {}};class Derived : public Base {public: Derived() = default; ~Derived() = de...原创 2019-12-12 18:27:24 · 196 阅读 · 0 评论 -
C++11中的default和delete
C++一个类如果没有显式定义一些函数(如构造函数、析构函数、拷贝函数等),编译器在需要的时候会生成一个默认版本。C++11引入default和delete关键字,增强对类默认函数的控制,当让这不是全部功能。(1)default 含义:被标识的默认函数将使用类的默认行为。class Test {public: Test() = default; // Test(int x = 0)...原创 2019-12-12 16:28:34 · 227 阅读 · 0 评论 -
C中的volatile关键字
volatile是C中的关键字,一般在嵌入式中用的比较多,其用来解决变量在“共享”环境下容易出现读取错误的问题。若变量被定义为volatile,则代表着该变量可能会被意想不到的改变,即在程序运行过程中一直变,这个值每次被处理时,都要从内存中读取该值,而不会因编译器优化从缓存的地方读取(比如说读取缓存在寄存器中的数值),从而保证volatile变量被正确读取。先看下面的代码:int main(...原创 2019-12-11 15:44:10 · 198 阅读 · 0 评论 -
C/C++野指针
野指针的定义:野指针不是nullptr,而是指向已经被释放的空间或者不可用的垃圾空间。常出现以下情形:(1)指针未初始化就使用int main() { int* p; if (p != nullptr) cout << *p << endl;}// 这段代码在VS2017下直接异常,提示p没有初始化// 因为指针不像引用必须初始化,所以这个p是未定义的...原创 2019-12-11 15:42:27 · 475 阅读 · 0 评论 -
C++重载机制
参考:博客1, 博客2 C++实现函数重载的技术手段是函数符号改名,所以我们可以通过分析编译器的函数符号改名机制来验证C++函数重载规则。(1) 如何查看编译器改名后的函数名 在VS编译器下,我们可以从符号表中看编译器如何改名的。符号表是在.map文件里,在vs里默认不显示符号表文件。要想显示出来,这样设置:属性—>配置属性—>链接器—–>调试—>生成映射文件—&...原创 2019-12-11 15:38:45 · 296 阅读 · 0 评论 -
移位运算符
左移晕算法(x<<n):将x的二进制位全部向左移动n位,将左边移出的高位舍弃,右边空出的低位补0。右移运算符(x>>n):将x的二进制位全部向右移动n位,将右边移出的低位舍弃,左边高位空出要根据原来量符号位的情况进行补充。对于无符号数则补0;对于有符号数,若为正数则补0,若为负数则补1。 例如,设a=5,则:(1)b = a<<3 即 b = 0...原创 2018-10-26 15:37:28 · 593 阅读 · 0 评论 -
继承和复合时,构/析构造函数执行顺序
前言C++面向对象类和类的关系可以分为3类:复合(composition)、委托(delegation)、继承(Inheritance)。这里探讨当类中有复合类时,复合类和本类的构/析构函数执行顺序, 或者继承时,子类和父类构造函数执行顺序,或者继承时子类有复合类、或基类有复合类时又该如何执行。只要记住这句话就可以:构造顺序由内而外,析构顺序由外而内。由于析构和构造顺序相反,所以下...原创 2019-06-15 12:33:58 · 1026 阅读 · 1 评论 -
C++ 编译器提供的合成默认构造函数详解
转载地址:https://www.cnblogs.com/QG-whz/p/4676481.html#_label0_0以下内容是我自己添加的:这里说的编译器提供的默认合成构造函数指的是nontrivial default constructor,即有用的默认合成构造函数。对于Class X,如果没有用户声明的构造函数,那么会有一个默认的构造函数被隐式声明出来,这个声明出来的默认构造...转载 2019-06-15 14:09:25 · 1058 阅读 · 0 评论 -
extern与extern "C"
转载地址:https://www.cnblogs.com/Azhu/articles/2454483.html前言extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。extern 变量 在一个源文件里定义了一个数组:char a[6]; 在另外一个文件里用...转载 2019-07-02 20:24:40 · 162 阅读 · 0 评论 -
typedef比define好在哪儿
转自:http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html一、typedef的用法在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:typedef int INT;typedef int ARRAY[10];typedef ...转载 2019-06-28 19:25:31 · 1376 阅读 · 1 评论 -
函数调用中__cdecl与__stdcall的区别
转载地址:https://www.cnblogs.com/sober/archive/2009/09/01/1558178.html在学习C++的过程中时常碰到WINAPI或者CALLBACK这样的调用约定,每每觉得十分迷惑。究竟这些东西有什么用?不用他们又会不会有问题?经过在网上的一番搜寻以及自己动手后,整理成以下的学习笔记。1.WINAPI与CALLBACK 其...转载 2019-06-28 20:18:15 · 415 阅读 · 0 评论 -
#pragma once与#ifndef的区别
目的:为了避免同一个文件被include多次同一个文件被include多次的危害:(1)防止重复定义的错误;(2)如果这个头文件变化,那么所有include这个文件的源文件都需要重新编译,即使没有去使用里面的任何内容避免措施: (1)头文件加#pragma once (2)头文件加#ifndef 宏名 #define 宏名 #endif两者区别:...原创 2019-07-24 09:02:10 · 7535 阅读 · 1 评论 -
隐藏与using关键字
前言C++经常有重载,覆盖(重写),隐藏(重定义)。这三者区别看我这篇博客:重载、重写(覆盖)、隐藏(重定义)。这里讲隐藏:隐藏是发生在基类和派生类之间的。如果在派生类中定义了一个与基类同名的函数,不管这个函数的参数列表是不是与基类中的函数相同,则这个同名的函数就会把基类中的所有这个同名的函数的所有重载版本都隐藏了,这时并不是在派生类中重载基类的同名成员函数,而是隐藏。1 隐藏基...原创 2019-07-24 15:17:13 · 315 阅读 · 0 评论 -
C++ 虚函数/虚继承内存布局
1 前言1.1 多态C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。多态分为静态多态和动态多态。(1)静态多态:是发生在编译期,是一种早绑定。通过函数重载和泛型编程实现。(2)动态多态:是发生在运行期,是一种晚绑定。通过虚函数实现。注意以下函数不能是虚函数: (1)普通函数(非类成员函数) (2)静态函数 ...原创 2019-07-17 16:27:05 · 596 阅读 · 0 评论 -
C++ define用法
转载地址:https://www.cnblogs.com/AkazaAkari/p/6899935.html1 定义常量#define ARRMAX 50int arr[ARRMAX];2代替模板函数或者内联函数,将函数定义成宏执行效率很快#define SWAP(a,b) do\{\decltype(a) temp = a;\a = b;\b =...转载 2019-07-17 17:55:22 · 8671 阅读 · 0 评论 -
类中有引用成员变量时,合成的拷贝构造函数如何拷贝
前言与默认构造函数不同,如果一个类没有显示提供拷贝构造函数/拷贝赋值运算符等。。编译器都会提供一个合成的拷贝构造函数/...。当类中有指针时,会引起浅拷贝这个都是常见知识点了,但是如果类中有引用,则合成拷贝构造函数会如何拷贝?例子class A {public: A() : x1(3), x2(x1){} //A(const A& c) : x1(c.x1)...原创 2019-07-26 10:13:51 · 1090 阅读 · 2 评论 -
直接初始化和拷贝初始化
前言直接初始化和拷贝初始化有啥区别。我觉得用下面2个例子可以很好说明。例子1class A {public: A(){ cout << "执行了构造函数" << endl; } A(const A&) { cout << "执行了拷贝构造函数" << endl; } ~A(){ cout << "执行...原创 2019-07-26 14:52:04 · 261 阅读 · 0 评论 -
C++11智能指针的前因后果
0 前言据说用过java的人都说java好,很大一部分是java里没有指针的概念,并提供自动垃圾机制,而C/C++语言经常会被内存的释放问题搞得头疼。全局对象在程序启动时分配,在程序结束时销毁。对于局部自动对象,当我们进入其定义所在的程序块时被创建,在离开块时销毁。局部stratic对象在第一次使用前分配,在程序结束时销毁。对于自动和static对象外,C++还支持动态分配对象。动态分配...原创 2019-08-21 20:42:20 · 1111 阅读 · 1 评论 -
C++拷贝和赋值、浅拷贝和深拷贝详解
1 前言在C++Primer中(P440)中阐述了一个类中的拷贝控制操作有以下4类:(1)拷贝构造函数(2)拷贝赋值运算符(3)析构函数(4)移动构造函数(5)移动赋值运算符其中,(4)和(5)是新的C++标准特性。这里先讨论拷贝构造函数和赋值运算符的区别,什么时候会调用这两个构造函数。然后讨论浅拷贝和深拷贝的区别。1 拷贝构造函数和赋值运算符的...原创 2019-05-29 18:52:01 · 7934 阅读 · 2 评论 -
取模与取余的区别
转载地址:https://blog.csdn.net/coder_panyy/article/details/73743722 其实取模和取余在目标上是一致的,但是因为语言对取余和取模上定义的不同,导致得到的结果不同。对取余和取模定义不同的语言中,两者的不同点只有一个取余运算在计算商值向0方向舍弃小数位取模运算在计算商值向负无穷方向舍弃小数位同时,也可以这样理解:取余,遵循...转载 2018-11-13 18:49:21 · 9261 阅读 · 0 评论 -
C++中字面值常量和字面值类型
作者:zhaojia92 来源:CSDN 原文:https://blog.csdn.net/zhaojia92/article/details/50831436 版权声明:本文为博主原创文章,转载请附上博文链接! 一个形如42的值被称为字面值常量。字面值常量的形式和值决定了常量的类型。例如0x42是16进制表示的整型常量。‘a'是char型字面值。字面值常量顾名思义由字面意思...转载 2018-11-06 10:54:22 · 5329 阅读 · 2 评论 -
C/C++数组详解(一维和二维)
数组这东西,说说都懂,但是似乎并没有完全吃透,导致很多地方有疑惑。所以再梳理一遍。 数组定义数组是存放类型相同的对象的容器,这些对象本身没有名字,需要通过其所在位置访问。从定义中可以看出,数组存放的是对象且类型相同。所以不存在引用的对象(引用不是对象)数组的局限性:数组的大小确定不变,不能随意向数组中增加元素。如果不确定元素的确切个数,使用vector。 定义和初始...原创 2018-11-08 18:47:36 · 4187 阅读 · 0 评论 -
C语言二级数组和二级指针
转载博客:https://www.cnblogs.com/zou107/p/4909847.html 一、关于二维数组和二维数组区别(1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的。所以从内存的角度来分析,一维数组和二维数组其实没有本质区别。(2) 二维数组可以使用一维数组来代替。但是在实际的应用中,有时候使用二维数组会更加直观,方便程序的编程。(3)...转载 2018-11-01 13:59:51 · 1973 阅读 · 0 评论 -
C++构造函数介绍
构造函数定义:每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。从定义中,首先可以得知以下两点:构造函数也是一种类的成员函数,但是其有特殊性。 任务是初始化类对象的数据成员,所以无论何时只要类对象被创建,就会执行构造函数。构造函数与普通成员函数的区别:构造函数没有返回类型 构造函数的函数名需要与类名一...原创 2018-10-31 21:19:45 · 1224 阅读 · 1 评论 -
C语运算符优先级
转载博客:https://blog.csdn.net/u013630349/article/details/47444939 优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号...转载 2018-11-01 09:13:55 · 109 阅读 · 0 评论 -
#if 0 /#if 1用法介绍(屏蔽代码块)
当屏蔽掉大块代码时,使用"#if 0"比使用"/**/"要好,因为用"/**/"做大段的注释要防止被注释掉的代码中有嵌套的"/**/",这会导致注释掉的代码区域不是你想要的范围,当被注释掉的代码很大时容易出现这种情况,特别是过一段时间后又修改该处代码时更是如此。一、1. 情况1: #ifdef _XXXX ...程序段1... #else ...程序段2......转载 2018-10-26 18:43:19 · 1394 阅读 · 0 评论