![](https://img-blog.csdnimg.cn/20190913151923821.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++学习笔记
小菜鸡的蜕变之路
长路漫漫,若能坚持,未来可期,加油~
展开
-
一个空类的大小?
问题源于【剑指offer】P231、定义一个空类型,里面没有任何成员变量和成员函数。对该类型求sizeof 结果?结果为1 。2、为什么不是0? 空类型实例中不包含任何信息,但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例(你想想,这个实例的指针至少要指向一块内存空间吧)。至于占多少空间,由编译器决定。Visual Studio中每...转载 2019-10-14 10:32:12 · 731 阅读 · 0 评论 -
C++造成内存泄漏的原因
一、程序循环new创建出来的对象没有及时的delete掉,导致了内存的泄露;二、delete掉一个void*类型的指针,导致没有调用到对象的析构函数,析构的所有清理工作都没有去执行从而导致内存的泄露;三、new创建了一组对象数组,内存回收的时候却只调用了delete而非delete []来处理,导致只有对象数组的第一个对象的析构函数得到执行并回收了内存占用,数组的其他对象所占内存得不到回收...转载 2019-10-14 10:10:44 · 682 阅读 · 0 评论 -
C/C++中extern的用法
extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中声明extern int v,还取决于变量v本身是能够被引用到的。这涉及到c语言的另外一个话题--变量的作用域。能够被其他...转载 2019-10-14 09:55:18 · 550 阅读 · 0 评论 -
继承_多态的基础复习
构造函数调用顺序:基类构造函数->对象成员构造函数->派生类本身的构造函数,析构顺序与其相反。注:基类调用构造函数顺序与继承顺序有关,按继承顺序从左到右对基类进行构造。 若继承中有虚继承的,虚继承的优先构造。 局部对象,在退出程序块时析构 静态对象,在定义所在文件结束时析构 全局对象,在程序结束时析构 继承对象,先析构派生类,再析构父类 对象成员,先析构类对象,...原创 2019-07-23 22:10:34 · 191 阅读 · 0 评论 -
C++中有哪些常量?
按数据类型分为:整型常量、浮点型常量、字符型常量、字符串型常量、转义字符型常量、地址常量。原创 2019-06-30 22:16:45 · 1443 阅读 · 0 评论 -
作用域运算符的作用
作用域运算符(::)的作用:1.存在具有相同名称的局部变量时,访问全局变量。2.在类之外定义类相关函数。3.访问类的静态变量。4.在多重继承的情况下,如果两个基类中存在相同的变量名,可以使用作用域运算符来进行区分。5.限定成员函数所属的类。...原创 2019-06-30 23:08:45 · 9066 阅读 · 0 评论 -
牛客网刷题笔记之指针题(超详细解答过程)
请写出下列程序的输出结果:#include<stdio.h>char *c[] = { "ENTER", "NEW", "POINT", "FIRST" };char **cp[] = { c+3, c+2, c+1, c };char ***cpp = cp;int main(void){ printf("%s\n", **++cpp);...原创 2019-07-15 17:59:00 · 565 阅读 · 0 评论 -
对*p++与*++p;(*p)++ 与 ++(*p)的理解
参考:https://blog.csdn.net/baidu_37973494/article/details/82761455*p++:等同于:*p; p += 1;解析:由于*和++的运算优先级一样,且是右结合。故*p++相当于*(p++),p先与++结合,然后p++整体再与*结合。前面陈述是一种最常见的错误,很多初学者也是这么理解的。但是,因为++后置的时候,本身含...转载 2019-07-16 08:57:13 · 27408 阅读 · 12 评论 -
尽量避免使用void main()
尽量不要使用voidmain(),因为其可能会有非预期的结果。最好用以下两种方式:第一种"intmain()"第二种"intmain(intargc,char*argv[])"原创 2019-07-16 10:08:59 · 4543 阅读 · 0 评论 -
常量和变量的区别
(1)常量的值不能修改,而变量可以通过赋值来改变值。(2)常量在定义时必须初始化,变量可以暂不初始化。(3)常量不可以寻址,其地址不允许赋给非常量指针,因此只能作为左值;而变量可以寻址,其既可以作为左值,也可以作为右值。(4)常量编译时,可以以立即数形式编译进指令,比起使用内存的变量执行效率更高。...原创 2019-06-30 22:12:59 · 1327 阅读 · 0 评论 -
运算符分类
1.算术运算符 用于各类数值运算。包括加(+)、减(-)、乘()、除(/)、求余(或称模运算,%)、自增(++)、自减(–)共七种。2.关系运算符 用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。3.逻辑运算符 用于逻辑运算。包括与(&&)、或(||)、非(!)三种。4.位操作运算符 参...转载 2019-06-30 21:55:14 · 5284 阅读 · 1 评论 -
C/C++ 动态内存分配
首先我们看看 c 语言是如何进行动态内存分配的;c 语言主要是使用malloc / calloc / realloc 来进行内存申请的。malloc / realloc / calloc三者的共同点与不同点:共同点1、都是从堆上进行动态内存分配2、释放内存都是需要使用free函数来释放3、三者的返回值都是void*4、都需要强制类型转换5、都需要对申请出的空间判空(因为申请内存失败...转载 2019-06-30 18:03:06 · 21776 阅读 · 2 评论 -
C/C++动态内存管理
转自:https://blog.csdn.net/ling_hun_pang_zi/article/details/81746543C/C++动态内存管理内存分配的方式有3种:1、从静态存储区域分配内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如:全局变量、static变量。2、在栈上分配在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这...转载 2019-06-30 17:53:09 · 175 阅读 · 0 评论 -
STL基础篇学习笔记
1. STL 是什么作为一个C++ 程序设计者,STL 是一种不可忽视的技术。Standard Template Library (STL) :标准模板库, 更准确的说是 C++ 程序设计语言标准模板库。STL 是所有C++ 编译器和所有操作系统平台都支持的一种库,说它是一种库是因为,虽然STL 是一种标准,也就是说对所有的编译器来说,提供给C++ 程序设计者的接口都是一样的。...转载 2019-07-15 10:10:45 · 207 阅读 · 0 评论 -
条款二之尽量以const、enum、inline、替换#define
#define不被视为语言的一部分,这正是问题所在。例如:#define ASPECT_RATIO 1.653记号名称也许从未被编译器看见,也许在编译器开始处理源码之前它就被预处理器移走了。因此,它可能没被记入记号表内。解决方法:用一个常量替换上面的宏(#define)const double AspectRatio = 1.63;作为一个常量,肯定会被编译器看到,...原创 2019-07-14 22:12:41 · 130 阅读 · 0 评论 -
条款一之视C++为一个语言联邦
为了理解C++,我们必须认识其主要的次语言。总共有四个:①C。C++以C为基础,语句、预处理器、数组、指针等都来自于C。许多时候C++对问题的解法其实不过就是较高级的C解法。②面向对象C++。这一部分是面向对象设计之古典守则在C++上的最直接实施。这部分也是C中类所诉求的:类(包括构造函数和析构函数)、封装、继承、多态、virtual函数(动态绑定)等。③Template C...原创 2019-07-14 21:42:21 · 123 阅读 · 0 评论 -
VC++6.0 调试入门
概述调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。这里我简要的根据自己的经验列出调试中比较常用的技巧,希望对大家有用。本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。设置为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppW...转载 2019-06-29 21:52:05 · 2592 阅读 · 0 评论 -
C++ operator new和new operator区别
在C++中,operator new和new operator还是很有区别。new operator是c++内建的,无法改变其行为;而operator new 是可以根据自己的内存分配策略去重载的。1. operator new operator new和operator delete有两个重载版本,每个版本支持相关的new表达式和delete表达式: ...转载 2019-06-29 21:37:45 · 7970 阅读 · 1 评论 -
C++暂停命令
在编写的c++程序中,如果是窗口,有时会一闪就消失了,如果不想让其消失,在程序结尾处添加:system("pause");注意:不要再return 的语句之后加,那样就执行不到了。分析:system() 是调用系统命令;pause 暂停命令;这样在运行到此处时,会显示“Press any key to continue . . .” 也就是 “按任意键继续...”;在V...转载 2019-07-16 10:14:41 · 5319 阅读 · 0 评论 -
面向对象的五大基本原则
面向对象的五大基本原则 :1、单一职责原则(SRP)2、开放封闭原则(OCP)3、里氏替换原则(LSP)4、依赖倒置原则(DIP)5、接口隔离原则(ISP)...原创 2019-07-07 15:28:28 · 161 阅读 · 0 评论 -
可执行文件生成过程具体做了什么事?
预处理->编译->汇编->链接1、预编译(main.c-->main.i)预编译主要处理代码中以#开头的预编译指令,其编译的规则如下:展开宏定义 处理预编译指令,如#include预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件包含其他文件 删除注释,例如://、/**/ 保留#pragma编译器指令,例如:#pragma once是为了防...转载 2019-09-22 20:55:21 · 628 阅读 · 0 评论 -
vector初始化报错cannot be initialized with an initializer list
c++ 98中不允许在初始化vector容器时指定初始化元素值,如下:vector<int> vec_i = {1,2,3,4}编译会报错,如下:error: non-aggregate type 'vector<int>' cannot be initialized with an initializer list但是c++ 11中是允许这样操作的。...转载 2019-09-12 10:12:09 · 4350 阅读 · 0 评论 -
时间复杂度
时间复杂度一、时间复杂度的定义 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度。定义:如果一个问题的规...原创 2019-09-05 20:39:52 · 1369 阅读 · 0 评论 -
栈空间受限情况下C/C++函数调用注意事项
C/C++是基于堆栈的语言,调用参数、局部变量都定义在栈上。当栈空间受限时,需要仔细斟酌。首先说说个人对栈的理解,受不同编译器、函数调用方式等等因素影响,栈具体实现稍有区别,但是不影响我们对栈布局的理解。根据上图,有以下建议:1、函数调用a、一个函数,不宜多于3个参数,不应多于5个参数。如果超出,首先应该检查代码,是否函数职责过重,是否可拆分。如果无法重构函数,建议定义...转载 2019-09-03 22:05:17 · 512 阅读 · 0 评论 -
C++中this指针
为什么引用this指针?当我们在类中定义了一个变量,同时又在类成员函数中定义了同一个变量时,也就是变量名重复时,但是我们要想使用类中的定义的变量,此时就需要this指针了。1.this指针的作用指针存在于类的成员函数中,指向被调用函数类实例的地址。一个对象的this指针并不是对象本身的一部分,不会影响sizeof()的结果。this指针的作用域是在类内部,当在类的非静态成员函...转载 2019-09-03 22:00:11 · 217 阅读 · 0 评论 -
C++中的C_str()函数用法
语法: const char *c_str();c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 比如:最好不要这样: ch...转载 2019-08-26 17:59:55 · 157 阅读 · 0 评论 -
字节对齐(总结笔记)
字节对齐计算进行字节对齐的理解与计算,必须要掌握四个概念:1、 基本数据类型的自身对齐值char 类型: 1 字节short 类型: 2 字节int、float 、long类型: 4 字节double 类型: 8 字节2、 程序的指定对齐值即#pragma pack(value)时的指定对齐值 value3、 自定义类型的自身对齐值即结构体或类的成员自身对齐值最大的值4、 自...原创 2019-08-20 20:13:17 · 423 阅读 · 0 评论 -
标准C++中string函数介绍
标准c++中string类函数介绍注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类...转载 2019-08-10 17:40:25 · 115 阅读 · 0 评论 -
STL 容器和适配器的特性简介
C++ STL 的实现:vector 底层数据结构为数组 ,支持快速随机访问 list 底层数据结构为双向链表,支持快速增删 deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问 stack 底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时 queue ...原创 2019-08-06 16:12:04 · 209 阅读 · 0 评论 -
何在Visual C++ 6.0中添加多行注释图标和多行注释快捷键?
如何在Visual C++ 6.0中添加多行注释图标和多行注释快捷键?1.添加多行注释图标:(1) 点击工具栏的Tools—>Customize—>Add-ins and Macro Files,再把SAMPLE前面的复选框勾上,(2) 点击“Commands”tab页,再名为Category的下拉框中选择Macros,再在右边的名为“Commands”单选框中直接将“...转载 2019-07-31 11:54:31 · 1236 阅读 · 0 评论 -
多态本质分析
多态:多态本质的分析 多态情形下的虚表的构成C++ 中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试...转载 2019-07-25 16:16:55 · 186 阅读 · 0 评论 -
C++知识点复习
类中默认的六个方法:构造函数 拷贝构造函数 析构函数 赋值构造函数 普通对象的取地址函数 常对象的取地址函数代码如下:#include<iostream>using namespace std;class Test{public: Test(int data = 0):m_data(data) //构造函数 { cout << "Cr...原创 2019-07-21 14:50:04 · 167 阅读 · 1 评论 -
大端序和小端序问题及内存分配管理
目录目录一 字节序 大端序和小端序1 代码实现 测试字节序二 C内存地址分配简介三 CC内存区划分具体内容见:https://blog.csdn.net/dcpkeke/article/details/48055847#%E7%9B%AE%E5%BD%95...转载 2019-07-19 16:29:06 · 174 阅读 · 0 评论 -
大小端模式总结
大端:所谓的大端存储,即低地址存放高位数据,高地址存放低位数据。小端:所谓的小端存储,即低地址存放低位数据,高地址存放高位数据。对于一个数据0x12345678,对应大小端存储方式如下:小端存储方式0x00 |78|0x01 |56| 0x02 |34|0x03 |12|大端存储方式0x00 |12|0x01 |34| 0x...原创 2019-07-18 22:50:14 · 191 阅读 · 0 评论 -
运算符的优先级及结合方向(详细图解)
原创 2019-06-29 21:21:04 · 8850 阅读 · 0 评论 -
规范的C/C++编程风格(高质量C++编程指南笔记,持续更新~)
①头文件结构:头文件由三部分内容组成:( 1 )头文件开头处的版权和版本声明(参见示例 1-1 )。( 2 )预处理块。( 3 )函数和类结构声明等。为 假设头文件名称为 graphics.h ,头文件的结构参见示例 1-2 。【规则 1-2-1 】为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。【规则 1-2-2 】用#inclu...原创 2019-07-04 23:02:30 · 214 阅读 · 0 评论 -
C/C++ &与&& |与|| 的区别
&&表示逻辑与的意思,即为and。当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。比如 12&&23的结果就是1,12&&-1 的结果是1,123&&0的结果就是0&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例...原创 2019-06-23 15:16:11 · 742 阅读 · 0 评论 -
i++和++i分析(详细的例子加以说明)
i++表示先在表达式中使用i,之后再将i自增,即i =i + 1。++i表示先将i的值加1,再在表达式中使用i。举几个例子:①求i +=i++;#include<iostream>using namespace std;void main(){ int i = 4; i += i++; cout<<"i = "<...原创 2019-07-01 22:52:06 · 4083 阅读 · 0 评论 -
引用和指针
引用:可以看做是一个变量的别名特点:1.必须初始化2.一个变量可以有多个引用3.引用一旦初始化,就不能在成为其他变量的引用ps:数组不能被引用引用与指针的异同:同:底层实现相同异:1.引用必须初始化2.引用一旦绑定就不能更改3.++的结果不同4.有多级指针,没有多级引用...原创 2019-06-25 22:14:01 · 240 阅读 · 0 评论 -
结构体和联合体的区别
1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。 2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。3.union类型的变量在定义时是可以被初始化的,定义如下union类型:uni...原创 2019-06-25 22:10:37 · 2099 阅读 · 0 评论