C++
文章平均质量分 80
WuDi_Quan
一步一脚印 付出总有回报
展开
-
4G虚拟地址空间布局
4G虚拟地址空间布局4G的虚拟内存空间:其中1G是属于内核空间,另外的3G属于用户空间所有的进程都拥有属于自己的用户空间,但却共享一个内核空间现在我们从上向下开始分析首先是用户空间:①:128M大小的不可访问区域(保留区)我们通常将申请的临时指针变量初始化时置为NULL,可以防止后续无意使用这个指针出错,因为NULL == 0x0,将其指针指向0x...原创 2018-11-14 03:32:21 · 1788 阅读 · 1 评论 -
友元(友元函数、友元类、类成员函数的友元)
友元(友元函数、友元类、类成员函数的友元)(friend)友元机制:允许一个类将对其非公有成员的访问权限授予指定的函数或者类。我们可以将友元大致分为3类:友元函数 友元类 类成员函数的友元一:友元函数友元函数:是指某些虽然不是类的成员函数,但是能够访问这个类的所有成员的函数。比如我们下列的代码:#include <iostream>class ...原创 2019-02-22 16:39:57 · 3284 阅读 · 1 评论 -
函数模板与类模板
函数模板与类模板我们在前面的博客中学习过了函数重载,现在则需要学习一下模板,模板相对于函数重载有着特有的优势,我们举例说明。之前我们学习函数重载的时候,举了一个例子,就是将传入的两个值相加,并进行输出。代码如下:当时我们为了传入不同类型的数据,比如double类型的数据,我们使用了函数重载。代码如下:如果还要传入char类型的数据,则还要再进行编写,而这...原创 2019-02-25 01:00:34 · 428 阅读 · 0 评论 -
运算符重载基础&复数的重载&模板形参中传递函数指针
运算符重载基础&复数的重载&模板形参中传递函数指针我们之前学习了C++的函数重载,但是不止函数可以重载,运算符也是可以重载的,运算符重载主要应用于对象,因为一般数据结构间的运算符没有重载的必要性。运算符重载后,原有的基本语义不变,但是有几点需要注意:不会改变运算符的优先级 不会改变运算符的结合性 不会改变运算符所需要的操作数的个数 不会改变运算符的原有的语法结构...原创 2019-03-01 02:36:03 · 497 阅读 · 0 评论 -
C++继承和多态(虚函数、纯虚函数、虚继承)
C++继承和多态(虚函数、纯虚函数、虚继承)一:继承继承的概念:为了代码的复用,保留基类的原始结构,并添加派生类的新成员。继承的本质:代码复用我们用下图解释下:那么我们这里就可以提出几个问题了:①:进程的方式有哪些呢?这里有三种继承方式:public:任意位置可以访问 protected:只允许本类类中以及子类类中访问 private:只允许...原创 2019-03-05 11:32:40 · 7023 阅读 · 2 评论 -
结构体和联合体字节对齐问题
结构体和联合体字节对齐问题实例在之前刷题的过程中遇到了一道题目:它是长这样的:typedef union {long i; int k[5]; char c;} DATE; struct data { int cat; DATE cow; double dog;char cmd} too; DATE max; 语句 printf("%d"...原创 2019-07-24 00:31:27 · 1085 阅读 · 1 评论 -
Boost库 --- 四种智能指针
Boost库 --- 四种智能指针智能指针基本思想:智能指针:主要有Boost库中的智能指针和STL标准库中的智能指针构成auto_ptr unique_ptr(引入前在boost库中叫做scope_ptr) shared_ptr weak_ptr其中auto_ptr为C++11标准之前拥有,但是auto_ptr问题很大,所以在C++11标准后引入了三种boost...原创 2019-07-24 00:58:26 · 548 阅读 · 0 评论 -
new和delete[]的隐藏属性(new+delete补充)
new和delete[]的隐藏属性(new+delete补充)我们在一次测试中突然发现,用new开辟的内置类型空间数组,我们知道是需要delete[]来进行释放的,但是突然发现不加[],光delete也可以将其释放,不会造成内存泄漏:查找资料后发现,是因为new开辟内置类型空间的时候会将其开辟的大小信息也存储下来,在delete的时候进行释放,而不会造成内存泄漏。...原创 2019-07-24 11:14:44 · 265 阅读 · 0 评论 -
偶然发现“for循环”+“:”引用符的使用
偶然发现“for循环”+“:”引用符的使用我们在做题的是否,突然发现for循环+引用符的使用可以很好的用在容器中比如我们想将一个容器中的所有元素逐一打印或者逐一将其添加到另一个容器中,我们就这样用继承的方式去继承这个容器巧妙的进行打印或添加我们举两个例子:第一个:逐一打印容器中的值,我们可以使用迭代器进行遍历打印,也可以使用上述方法现在vector<int> xxx...原创 2019-08-06 01:36:54 · 364 阅读 · 0 评论 -
如何实现一个不能被继承的类
如何实现一个不能被继承的类我们有两种方式:第一种:类似于单例模式的处理,将类的构造函数或者析构函数写到private下,则派生类则无法继承后实例化,但是这个类也将无法在类外实例化。 第二种:类似普通类相同的处理,利用虚继承和友元,虚继承的特点是派生类实例化的时候,会跳过这个继承的类,直接去调用这个类虚继承的类的构造函数。我们给出代码和运行结果:第一种代码:...原创 2019-08-09 23:59:09 · 821 阅读 · 0 评论 -
类的初始化列表以及const & static修饰成员
类的初始化列表以及const & static修饰成员一:初始化列表我们上一篇博客知道了对象的生成过程中,对象开辟了内存空间后就要进行初始化,而我们当时是这样初始化的:现在,我们有另一种方法,也可以完成初始化:我们看到第一步和第三步可以交给初始化列表完成,其实这两种方法都可以进行初始化,看个人喜好进行选择,不过有一些特殊情况只能选择第二种:比如:特殊情况1:...原创 2019-02-22 16:39:03 · 533 阅读 · 0 评论 -
类和对象基础
类和对象基础一:类的概念和封装我们前面了解过C语言是一门面向过程的编程语言,而C++是一门面向对象的编程语言,这个“面向对象”其实就体现在类和对象上,我们画上一幅图可以清楚认识一下:我们之前了解过C++的三大特征:封装、继承、多态继承和多态我们放在后面进行了解,这里主要搞清楚什么是封装:封装是面向对象程序设计的基础特征。它是将数据(属性)与函数(方法)进行合并成一...原创 2019-02-22 16:37:17 · 349 阅读 · 0 评论 -
C和C++的区别
C和C++的区别首先我们先简单介绍一下C语言和C++:①:C语言的介绍C语言是一个结构化语言,它的重点在于算法和数据结构。C语言的设计首要考虑的是如果通过一个过程对输入进行运算处理得到输出。 C语言可以做任何用处,但最大的用处还是写写操作系统和编译器之类的。 C语言是非常有效率的,作为一个底层编译语言,可以通过指针直接去对内存进行管理,另外很多语言都是用C语言来设计的,如java,...原创 2019-02-02 00:19:44 · 655 阅读 · 1 评论 -
编译链接运行原理
编译链接运行原理编译阶段一共分为3部:预编译阶段,编译阶段,和汇编阶段。我们先来看第一阶段:预编译:将源代码文件.c和相关的头文件.h等 预编译成一个.i文件gcc -E hello.c -o hello.i (-E表示只预编译)预编译阶段主要处理以”#”开始的预编译指令主要处理规则如下:①:将所有的”define”删除,展开所有的宏定义②:处理所有条件...原创 2018-11-14 13:09:33 · 273 阅读 · 0 评论 -
函数堆栈调用 和 函数值的返回方式 以及 函数的调用约定
函数堆栈调用和函数值的返回方式以及函数的调用约定函数堆栈调用:我们先用一段简单的程序,通过反汇编的方式来分析一下函数的堆栈调用反汇编代码:我们现在来分析一下:ebp:栈底指针 esp:栈顶指针pc:下一行指令寄存器从main函数开始进入:11: int a = 10;0010188E mov dword ...原创 2018-11-20 15:25:45 · 406 阅读 · 0 评论 -
函数的默认值_函数重载_inline内联函数
函数的默认值_函数重载_inline内联函数默认参数:默认参数指的是当函数调用中省略了实参时自动使用的一个值。例如,如果将void Sum(int n)设置成n有默认值为1,则函数调用Sum()相当于Sum(1)。函数的默认值:默认值一般写在声明中 默认值传值方式为 自右向左 依次赋值 默认值赋值只能赋一次 默认值的限制 ①:不能使用局部变量,因为默认...原创 2018-11-26 00:14:16 · 302 阅读 · 0 评论 -
C和C++接口的相互调用
C和C++接口的相互调用我们为什么要学习C和C++接口的相互调用?答:在工作中,我们经常要使用C和C++混合编程,那么,在调用对方接口时,总是不可避免地出现问题。为了让双方和谐地工作,我们就得用到extern "C"。extern "C" 的定义:extern "C" 是C++的特性,是一种链接约定,它并不影响调用函数的定义,即使做了该声明,对函数类型的检查和参数转换仍...原创 2018-11-26 14:26:13 · 1176 阅读 · 0 评论 -
C++引用传递基础
C++引用传递基础引用变量:相当于是给变量内存块(内存单元)起别名例如:这里,我们存放整形变量10的内存单元名字为a,我们用过int &b = a; 让这个叫a的内存块有另外一个名字为b,从这里开始,a和b都指的是这个存放整形变量10的内存单元。引用变量主要应用在函数的形参上,通过引用变量的使用,传递给函数的参数,就不是实参的副本了,可以直接通过修改形参,修...原创 2018-11-26 16:39:31 · 11129 阅读 · 6 评论 -
C++中的名字空间和作用域
C++中的名字空间和作用域C++程序支持四种形式的作用域,分别是:①:名字空间作用域②:局部作用域③:类作用域④:语句作用域名字空间作用域:就是程序员利用名字空间定义在C++程序中划分出来的一块比较大的程序区段。在该程序区段内部,可以定义类型,函数,模版,变量。名字空间作用域可以跨越多个*.cpp文件而存在。在名字空间作用域内部还可以继续定义其他的名字空间作用域,也就...原创 2018-12-04 20:18:42 · 1790 阅读 · 0 评论 -
const基础与一级指针,二级指针,引用的结合
const基础与一级指针,二级指针,引用的结合const基础:在之前学习C语言的时候,我们就写过const,现在学习了C++,发现之前对于const的理解有些偏差,不够深刻。今天,我们就深入探索一下在C语言和C++下const的区别。一:const在C和C++中的区别①:在C语言中,被const修饰的内容称作常变量。它本质是一个变量,因此,C语言中const修饰的变量并...原创 2018-11-27 21:01:08 · 473 阅读 · 2 评论 -
const与函数重载, 函数返回值之间的关系
const与函数重载, 函数返回值之间的关系const与函数重载:之前说过函数重载,对于参数来说,const是否能构成一种新的参数类型呢?例如:Funx(int a);Funx(const int a);这俩是否能构成重载呢?答案是不能的。为什么不能,你可以理解为,如果const没有修饰*指针或&引用,那么其类型其实并没有变化。什么意思呢?这里...原创 2018-11-27 21:08:06 · 893 阅读 · 2 评论 -
C++:new和delete
C++:new和delete我们之前在学习C语言的时候,学习过了如何申请动态内存和释放内存。当时用的是C++/C语言的标准库函数malloc/free,而new / delete 是 C++的运算符。我们先来看几个问题:①:那这里我们就要想一下,有了 malloc/free,为什么还要 new/delete?答:对于非内部数据类型的对象而言,光用 maloc/free 无法满...原创 2018-11-28 17:17:04 · 502 阅读 · 1 评论 -
LRU页面置换算法C++代码
LRU页面置换算法C++代码常见的缓存算法:LRU:(least recently used) 最近最少使用,思想是如果一个数据刚被访问过,那么将来被访问的几率也更高 LFU:(least frequently used) 最少经常使用,思想是如果一个数据很久不被访问,那么将来被访问的几率也不大 FIFO:(first in first out) 先进先出,思想是如果一个数据最先进入缓...原创 2019-08-17 00:55:09 · 2905 阅读 · 1 评论