C++
catalpeak
这个作者很懒,什么都没留下…
展开
-
C++常量折叠
c++的常量折叠原创 2022-06-17 15:27:47 · 226 阅读 · 0 评论 -
VisualStudio遇见无法解析的外部符号报错可能是新增文件的问题
A文件掉用B文件里的类c结果在A里报 c 是无法解析的外部符号发现B文件只包含了头文件、源文件没有包含到工程内需要学习VisualStudio创建工程的流程原创 2022-05-31 16:41:48 · 294 阅读 · 0 评论 -
C++头文件重复引用问题
头文件重复引用的情况先看一张图A头文件,同时被B、C引用,之后D引用了B、C头文件。此时D相当于引用两次A文件C++工程的预编译就是将引用文件的代码拷贝过来在头文件的前后加上#ifndef#define#endif这些话即可...原创 2022-05-31 15:55:59 · 1124 阅读 · 1 评论 -
曲奇妙妙屋 之 do{}while(0)的妙用 C++
在原创 2020-08-25 14:16:41 · 112 阅读 · 0 评论 -
size_t 在C++编程时的小坑
size_t是一个无符号类型,在减减时,二进制码减到0后就直接变为max(int)值,就是不会有负号存在。所以尽量注意这个数据类型。原创 2020-04-22 10:07:30 · 311 阅读 · 0 评论 -
C++ this指针需要显示说明吗
答案是不用的何为显式说明?就是一定要有如下代码class A {A this;};把this声明出来才叫做显式说明。很明显这个是不用的,所以不需要原创 2020-04-22 10:05:55 · 1481 阅读 · 0 评论 -
malloc 函数在函数中的小bug
malloc函数在堆中分配内存,函数实在代码区存储的,那么通过主函数向子函数传参,子函数中使用malloc分配内存为什么不能为主函数中的指针分配内存呢?void func (char *p) { p = (char*)malloc (sizeof (char) * 100);}int main () { char *p; func (p);}使用如上代码...原创 2020-04-18 10:50:09 · 249 阅读 · 0 评论 -
C++ explicit 使用方法
修饰只有一个参数的类构造函数。没有explicit修饰的构造函数是隐式构造函数,被explicit修饰的是显式构造函数。相反的implicit修饰的是隐式构造函数。什么是显式构造和隐式构造呢?先说隐式构造函数:class A {private : int a; char b;public : A (int _a) { // 一号函数 a...原创 2020-04-15 21:30:36 · 155 阅读 · 0 评论 -
值类型和引用类型
值类型是变量内存所存的内容就是该该变量所代表的数值。引用类型是真正的数值存在内存中的一个地方,变量的内存只不过是指向了存数值的第一个内存地址,没有真正包含内存。简单来说,只有类、数组(string也算)是引用类型,其余都是值类型。...原创 2020-04-14 18:29:24 · 171 阅读 · 0 评论 -
内存溢出和内存泄漏
这二者是两个很相近的概念。内存溢出指的是申请空间时已经没有空间可以申请过来使用了内存泄漏是访问到没有权限访问的内存、已经被释放的内存,或者是已经是没有用的内存却没有释放掉...原创 2020-04-13 22:04:26 · 88 阅读 · 0 评论 -
野指针和内存泄漏
野指针就是指针没有指向任何内容(可能是没有初始化,可能是指向的内存被释放但是指针没有释放掉,依旧指向原来的内存。)或者指针指向的内存没有访问权限。内存泄漏指的是访问的内存已经被释放了,或者访问到了没有访问权限的内存。...原创 2020-04-13 21:58:00 · 154 阅读 · 0 评论 -
Java和C++的区别
1.Java基于JVM(Java虚拟机),可移植性很高。但是C++不行可移植性低一些2.Java是解释型的语言,编译生成的代码是可以被JVM处理的中间码,JVM再编译中间码成为机器码。但是C++是编译型的语言,由编译器直接生成了机器码,可以运行3.面向的不同,Java是纯粹的面向对象的语言,但是C++为了兼容C还会有一部分面向过程的内容存在。4.指针问题,C++有指针,可以对内存进行操...原创 2020-04-13 21:51:00 · 134 阅读 · 0 评论 -
深入理解C++stl容器vector
vector比较关键的成员函数有size (), capacity (), resize (), reserve ()这四个size()表示数组内部存在的元素多少,你push进去几个就是几个capacity()表示数组的容量大小,你在数组中开辟的内存空间有几个就是多大resize()为函数重新设计size的多少,resize的数量大于size()就增加默认值,少了就直接删除元素re...原创 2020-04-13 21:37:10 · 125 阅读 · 0 评论 -
C++之深入理解inline关键字
inline是内联函数,相当于只节省了函数调用的开销。但是inline只是给编译器的一个建议,编译器会对当前代码情况进行分析,看inline替换后是否增加了效率,增加了就替换,没有增加就不替换。...原创 2020-04-13 21:14:17 · 106 阅读 · 0 评论 -
free和delete的区别 面试经典问题
1.free是C的库函数,delete是C++的关键字2.delete在释放内存之前调用类的析构函数,但是free并没有这个操作原创 2020-04-13 20:48:02 · 591 阅读 · 0 评论 -
new和malloc的区别 经典面试题
1.new是C++的关键字,malloc是C的库函数。虽然都是分配内存,但是有很大的不同。2.new分配的内存,存贮在自由存储区,malloc是开发者手动申请的内存,存放在堆区。3.new在申请内存时会先调用该类的构造函数,malloc并不会这么做。4.new不需要手动分配内存大小,由编译器自动计算出来。但是malloc需要手动分配内存大小。...原创 2020-04-13 20:48:08 · 272 阅读 · 0 评论 -
宏定义的优缺点
米哈游三面的一个问题,问的很深,从宏定义是什么,干什么用,优缺点,到别的语言为什么没有,层层深入,很好的问题。结果我也很好的挂掉了。所以来讨论一下上述几个问题正确的答案到底是什么。1.首先什么是宏定义,在C++中只有#define算是宏定义,其余的#操作都叫预处理,所以宏定义就是#define,#define就是宏定义。2.宏定义的应用就是使用#define将指定的标识符用指定的字符串...原创 2020-04-13 19:40:51 · 1446 阅读 · 0 评论 -
TopK 取出数组中前K大的元素
非常简单,三种方法,其实还有分治的简单方法,但是太难写了,算了!#include <algorithm>#include <iostream>using namespace std;int main (){ int k = 5; int arr [] = {9, 2, 4, 8, 1, 7, 5, 3, 0, 6}; // Way...原创 2020-04-08 10:21:50 · 326 阅读 · 0 评论 -
判断单链表是否有环、环长多少、入点为何、链表总长?C++实现
Q1.单链表是否有环?Q2.环长多少?Q3.入点为何?Q4.链表总长?A1.设置快慢指针,一个走两步、一个走三步,同时前进,如果二者相遇则有环,如果某一个指针遇到NULL则无环A2.在快慢指针相遇后,二者再继续遍历链表,直至二者指针重合,所经过的长度为环长A3.从二者的重合点和head指针处开始遍历,直到二者重合便为环的入点A4.将A2,A3统计的数据相加即可...原创 2020-04-08 09:31:59 · 132 阅读 · 0 评论 -
希尔排序 简单易懂的优化插入排序
先来说说插入排序,是一种内部排序。在本数组内部按顺序遍历数组,取出当前元素插入到前面已经排好序的数组中的目标位置处,时间复杂度平均为O(nlogn)希尔排序是直接插入排序的一种改进版本,使用了一个增量方式,对某个增量下的新数组使用普通的插入排序,在逐渐缩小增量,直至该增量为1。但是真正的希尔排序算法适合使用链表来存放数组,代码不好写就算了...原创 2020-04-06 20:35:28 · 139 阅读 · 0 评论 -
C++ 类生成对象时内存的结构
一个类中都有什么元素呢?成员变量、成员函数。成员变量又分普通的成员变量、static静态成员变量、const常量成员函数分为普通成员函数、静态成员函数、虚函数、纯虚函数等那么他们分别又是如何在类的内存中分配的呢?1.内存对齐原则不论是在类中还是在结构体中,都需要内存对齐,具体对齐方式(有一个对齐系数——可以自己定义,同常是2、4或4的倍数,不是对齐系数倍数的元素会扩展...原创 2020-04-06 09:50:48 · 486 阅读 · 0 评论 -
C++ 的纯虚函数一定要在子类实现呀
C++的纯虚函数作为多态很重要的一环,充当了给子类接口的功能。但是这个接口一定要在子类实现才能通过编译。但是为什么一定要在子类实现呢????首先我们要明确一个概念,就是函数申请时我们在函数体里什么都没有写void func () {}这样的函数我们称其为空函数,但是函数体里也是有内容的,内容是空,相当于集合里的空集。所以只要有内容存在就没有问题的可以为函数申请内存。但是我们再...原创 2020-04-06 00:10:42 · 11143 阅读 · 9 评论 -
C++ 中有纯虚函数的类绝对不可以被实例化
C++中的纯虚函数只能充当接口的作用。包含纯虚函数的类绝对不能被实例化,不能实例化、不能实例化!!!千万要记住!!!不仅仅是包含纯虚函数的类不可以实例化,同时没有实现纯虚函数的基类的子类也不可以被实例化。!!!...原创 2020-04-06 00:06:00 · 2708 阅读 · 0 评论 -
C++ 函数其实可以不用写返回值的声明!
C++ 中不管是成员函数,虚函数,还是普通函数,其实都是可以不用写返回值的,也能通过编译。编译器会为函数自动生成一个默认的int类型返回值。而且不论你在函数内部返回什么值,都会默认的转换为int类型#include <iostream>using namespace std;class A {public: func () {return 0;} vi...原创 2020-04-05 23:47:30 · 3411 阅读 · 1 评论 -
C++ 结构体和类内存对齐的区别就是没有区别
二者没有区别!!!嘿嘿嘿不过有一些关键的问题需要注意如下:1.结构体和类作为空类或者空结构体时都是只有一个字节作为填充,毕竟一点内存都没有的元素是不现实的。2.在类和结构体中的成员函数(结构体在C++中也可以有成员函数的不知道吧哈哈哈)都是存放在代码区的,不占用类和结构体在栈区的内存!...原创 2020-04-05 21:48:43 · 168 阅读 · 0 评论 -
C++ 结构体和类有什么区别吗
在C中的结构体和C++的类绝对是有区别的。面向过程的C不存在封装的功能,所以结构体的所有成员变量都是public类型的,并且内部不能有函数(成员函数)。但是如果是作为C++中的结构体和类,他们之间的区别就没有那么大了。C++为了兼容C,让结构体和类尽可能的相似,现在的结构体也可以存在成员函数、private、protected、public、虚函数等内容,但是还是有细微的区别。1....原创 2020-04-05 12:01:47 · 350 阅读 · 0 评论 -
判断一个数的二进制数有多少位1
其实这篇文章可以挖的很深,从二进制的本质出发有很多可以考虑的点。但是我并不能理解这么深55555从题目中的问题出发,我们将十进制转换为二进制的时候使用的是什么方法呢?将该数跟2取余,再除于2,反复操作,所有的余数加起来就是目标二进制数。那么统计其中位是1的位只需要在模2的时候记录累加。在将原来的数除以2.代码如下:#include <iostream>using na...原创 2020-04-01 15:20:38 · 5653 阅读 · 1 评论 -
C++ static 讲解。。。 哎好,还没讲呢
先让我们在类中声明一个static修饰的变量如下class A {private : static int i; int j;public : const void setI (int i) { this->i = i; } const int retI () { return i; }};in...原创 2020-03-30 13:56:40 · 91 阅读 · 0 评论 -
C++ std11 标准相较于 C++99 标准多了哪些 (基础篇)
1.auto关键字,更加有利于遍历数组2.stl容器的初始化3.构造函数新增了初始化列表4.多线程thread 不需要自己手写了5.智能指针 shared_ptr6.lambda 函数表达式...原创 2020-03-26 22:53:15 · 842 阅读 · 0 评论 -
C++ 内存结构 基础篇
先看这样一段代码,其中的静态成员函数可以被直接通过类调用,但是非静态成员函数不可以,只能实例化对象后才能调用。这是为什么呢?#include <iostream>using namespace std;class A {private: int a;public: void func (int a) { this->a = a...原创 2020-03-26 14:19:20 · 621 阅读 · 0 评论 -
C++ 虚继承 虚基类 多继承 详细解读
首先要说一下多继承,虚基类和虚继承都是在多继承的一种情况下存在的内容。多继承是子类继承自多个父类的继承方式。但是在多继承的过程中,存在这样一种情况,一个基类A分别被中间基类B、C继承,然后D又继承了B、C,此时就出现了问题?如果子类D使用父类B或者父类C独有的成员变量,这时没有问题。但是如果D使用的是A的成员变量,编译器就不知道使用的B继承自A的还是C继承自A的,产生了一个语义模糊的概...原创 2020-03-26 01:02:52 · 336 阅读 · 0 评论 -
override overwrite overload 三者之间的区别
override 覆盖 父类继承到子类,子类中的函数可以覆盖父类的虚函数,子类函数名字、返回值、参数列表都要和父类的虚函数一样。但是又重新写了新的函数体以覆盖父类的函数体。overwrite 重写 和 重载几乎是一样的,在有一些书里说是不一样,但是不用管,一般的情况下不会遇见这种情况overload 重载 在同一个类中,为了实现不同的功能但是函数的名字又是一样的,这样的函数返回值、参数列表...原创 2020-03-25 18:22:50 · 247 阅读 · 0 评论 -
final关键字的用法
#include <iostream>using namespace std;// 被final关键字修饰的类无法被继承、被final修饰的虚函数无法被重载(overload)or重写(override)class A {public: virtual void func1 () { cout << "func1" << ...原创 2020-03-25 15:35:14 · 92 阅读 · 0 评论 -
子类和父类相互转换的关系
首先让我们看一个例子#include <iostream>using namespace std;class A {private: int a;public : //A () {} func () { cout << "A" << endl; }};class B : public A ...原创 2020-03-24 19:08:18 · 643 阅读 · 0 评论 -
程序调用类的普通成员函数和虚函数之间的区别
类中的虚函数是通过动态改变虚函数表,访问虚函数表中的某一个函数,动态生成的。但是普通的成员函数是在编译的时候就分配了内存空间,静态生成,存在静态区。像变量一样的调用...原创 2020-03-23 15:31:24 · 318 阅读 · 0 评论 -
C++ vector push_back时的扩容情况
vector的扩容并非,在push_back时直接增加需要插入的内存大小。而是当内存不够时直接对vector进行倍数扩容。C++标准规定vector有一个扩容因子,在需要增加vector大小的时候,将vector容量扩充为为自身的(1,2]倍。(绝大多数情况是两倍,但是并没有硬性规定一定是两倍,按照stl实现者自身的规定即可,也有扩容1.5倍的)原因:从两个方面来分析1.如若是不按...原创 2020-03-23 13:32:30 · 1250 阅读 · 1 评论 -
有1块、4块、5块的钱币,给n块钱找到最少的钱币租合
一共有1、4、5三种面值的货币,现在给定一个目标货币值n,问怎么选取货币使得选出的货币最少,并输出每种货币的数量例如:input :6 output : 1,0,1这道题的思路不能用贪心算法,因为货币的面值并不是最小组成的面值(1、2、5就可以用贪心),所以要bfs找一圈才可以。代码如下#include <iostream>using namespace std;...原创 2020-03-22 16:49:16 · 456 阅读 · 0 评论 -
C++ STL set 和 map 的区别
map和set都是关联式容器,底层也都是由红黑树实现的。set称为集合、map称为键值对的集合。即set只有key没有value或者说只有value没有key,但是map既有key也有value二者是相关联的。通过寻找map的key来提取value。...原创 2020-03-21 23:12:23 · 358 阅读 · 0 评论 -
C++ STL map 和unordered_map 区别
map是有序的(按照二叉搜索树)存贮结构。底层是一颗红黑树,本质上是不平衡的二叉搜索树。而unordered_map是无序存储的配对容器,底层数据结构是哈希表。其实set这种也同map...原创 2020-03-21 23:07:55 · 268 阅读 · 0 评论 -
C++多态的方法 (不全持续更新中)
1.重载2.重写3.虚函数4.模板原创 2020-03-18 15:24:59 · 68 阅读 · 0 评论