![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
一颗日成
这个作者很懒,什么都没留下…
展开
-
C++与C中的const比较
C++与C中的const比较环境使用的是Visual Studio一、C++与C在值调用时的不同1.在C语言中,const用来限制一个变量,表示这个变量不可被更改,这样的变量称为常量。2.在C++语言中,const与在C语言中的const并没有多大变化,但是在一些细节进行了调整。示例1:const int a=10;int b=a; 如代码所示,int b=a表示将a的值赋给b...原创 2019-07-23 21:14:19 · 175 阅读 · 0 评论 -
C++中的class和struct的区别
C++中的class和struct的区别 C++中保留了C语言的struct关键字,并加以扩展。在C语言中,struct只能包含成员变量,不能包含成员函数。而在C++中,struct类似于class,既可以包含成员变量,又可以包含成员函数。一、相同点 ·class和struct基本通用二、不同点 ·使用class时,类中成员默认都是private属性;而使用struct时,结构体中...原创 2019-08-01 21:20:41 · 212 阅读 · 0 评论 -
设计模式(四):装饰器模式
设计模式(四):装饰器模式定义: ·动态的给一个对象添加一些额外的职能,把所需功能按顺序串联起来并进行控制。主要解决: ·当为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。何时使用: ·在不想增多很多子类的情况下扩展类以代码为例: 类关系图如下一、定义Component抽象类为可以动态添加功能的对象定义接口#inc...原创 2019-07-28 19:37:05 · 95 阅读 · 0 评论 -
浅谈C语言的虚拟内存
浅谈C语言的虚拟内存 学过C语言后可知,在C语言中,指针变量就是一个内存地址, &运算符的作用也是取变量的内存地址。 如果我们运行的程序较多,占用的空间就会超过内存(内存条)容量。例如计算机的内存容量为2G,却运行着10个程序,这10个程序共占用3G的空间,也就意味着需要从硬盘复制 3G 的数据到内存,这显然是不可能的。 操作系统为我们解决了这个问题:当程序运行需要的空间大于内...原创 2019-07-28 21:07:32 · 1667 阅读 · 1 评论 -
计算机内存的分页机制
计算机内存的分页机制 当计算机运行时,某个时间段内,它只是使用了一小部分的数据。其他数据在一个时间段内并不会被使用。 如果以整个程序为单位进行映射,会把不需要的数据读取到内存中,也会把过多的数据写入到磁盘,这种情况会降低程序的运行效率。 为解决这个问题,就有了内存的分页机制,使用分页的方式来对虚拟空间和物理空间进行分割和映射,提高程序的运行效率。 分页的思想是指把地址空间人为地分成...原创 2019-07-28 21:32:04 · 1413 阅读 · 0 评论 -
设计模式(十三):外观模式
设计模式(十三):外观模式定义: ·为子系统中一组接口提供一个一致的界面,即定义一个高层接口,增加子系统的易用性,隐藏系统的复杂性 ·这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。主要解决: ·降低访问复杂系统的内部系统的复杂度,简化客户端与之的接口如何解决: ·客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好,即为复...原创 2019-08-06 20:02:00 · 144 阅读 · 0 评论 -
设计模式(十四):桥接模式
设计模式(十四):桥接模式定义: ·抽象类和其派生类分离,各自实现自己的对象。若系统可以从多角度分类,且每种分类都可能变化,则把多角度分离独立出来,降低耦合。 ·涉及到一个作为桥接的接口,使实体类的功能独立于接口实现类。这两种类型的类结构化改变而互不影响。主要解决: ·对象的继承关系编译时已确定,所以无法在运行时修改从父类继承的实现,由于紧耦合,父类中任何的改变必然会导致子类发生变...原创 2019-08-07 20:30:53 · 142 阅读 · 0 评论 -
浅谈C语言程序在Linux下的内存布局
浅谈C语言程序在Linux下的内存布局 在了解内存布局前,先要了解程序的虚拟地址空间以及编译模式。 所谓的虚拟空间,就是程序可以使用的虚拟地址的有效范围。虚拟地址和物理地址的映射关系由操作系统决定,相应地,虚拟地址空间的大小也由操作系统决定,但还会受到编译模式的影响。 先了解CPU,然后再了解编译模式。再来看程序在内存中的分布。一、CPU CPU是计算机的核心,决定了计算机的数据...原创 2019-08-19 22:00:54 · 704 阅读 · 0 评论 -
设计模式(十七):迭代器模式
设计模式(十七):迭代器模式定义:提供一种方法顺序遍历一个聚集对象,为不同的聚集结构提供遍历所需接口,而不暴露对象内部的表示。主要解决:不同的方式来遍历整个整合对象如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。以代码为例类图关系如下一、定义Aggregate类Aggregate为聚合定义了一个接口,它将客户端与对象集合的实现分离开来#includ...原创 2019-08-10 20:13:55 · 139 阅读 · 0 评论 -
C++对象的内存模型
C++对象的内存模型类是创建对象的模板,不占用空间,不存在于编译后的可执行文件中;而类的实例化对象就需要使用内存来存储。对象被创建时会在栈区或者堆区分配内存。不同对象的成员变量可能不同,需要每个对象分配内存来存储。但是不同对象的成员函数的代码是一样的。相同的成员函数,编译器可以将代码压缩成一份。在内存中,编译器会将成员变量和成员函数分开存储:分别为每个对象的成员变量分配内存,但是所有对...原创 2019-08-23 22:37:56 · 162 阅读 · 0 评论 -
设计模式(十六):职责链模式
设计模式(十六):职责链模式定义:使多个对象都有机会处理请求,解除请求发送者和接收者的耦合。将对象连成一条链,并沿这条链传递请求直到请求被解决。请求交付给最小接受者,职责链中每一环保存后继的引用,使得请求有序沿链传递。通过合理设置后继以及分支关系,避免一个请求到了链末端依旧无法被处理,或因配置错误得不到处理的情况。主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责...原创 2019-08-12 00:00:05 · 94 阅读 · 0 评论 -
#define和const的区别
这个区别用从几个角度来说:角度1:就定义常量说的话:const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。角度2:就起作用的阶段而言:define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。角度3:就起作用的方式而言:define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些...转载 2019-08-24 19:51:19 · 105 阅读 · 0 评论 -
type和#define的区别
type和#define的区别可以使用其他类型说明符#define进行扩展,但是typedef不行。例如#define INT intunsigned INT n; //correcttypedef int INTunsigned INT n; //error在连续定义几个变量的时候,typedef能够保证定义的变量都是同一类型例如#define PTR int*...原创 2019-08-24 19:51:54 · 573 阅读 · 0 评论 -
编译器会为const引用创建临时变量
编译器会为const引用创建临时变量引用不能绑定临时数据将常引用绑定到临时数据时,const int &A;==编译器会为临时数据创建一个新的、无名的临时变量,并将临时数据放入临时变量中,然后再将引用绑定到临时变量。==临时变量也是变量,所有的变量都会被分配内存。常引用和普通引用不一样。因为临时数据无法寻址,不能写入。而引用是绑定到一份数据时,就可以通过引用对数据...原创 2019-08-24 22:10:50 · 2542 阅读 · 0 评论 -
C++this指针
C++this指针this是C++中的一个关键字,也是一个const指针,它指向当前对象,通过它可以访问当前对象的所有成员。例如:class A{private: char name;public: void show(){cout<<"hello world~"<<endl;}; void setName(char *name){th...原创 2019-08-25 19:58:24 · 2683 阅读 · 3 评论 -
浅谈C++引用的指向
浅谈C++引用的指向引用只能绑定内存中的数据指针指代的是数据或代码在内存中的地址,指针变量指向的就是内存中的数据或代码。指针只能指向内存,因为寄存器和硬盘没法寻址。C++中代码大部分都保存在内存中,比如:定义的变量、字符串变量、函数形参、函数体本身、new或者malloc()分配的内存等。这些可以使用==&==来获取地址,从而使用指针指向它们。其他的比...原创 2019-08-21 20:53:29 · 919 阅读 · 0 评论 -
设计模式(八):模板模式
设计模式(八):模板模式定义: ·定义一个操作中的算法框架,将一些步骤延迟到子类中。子类在不改变框架的前提下就可以重新定义某些特定步骤主要解决: ·一些方法通用,却在每一个子类都重新写了这一方法。如何解决: ·将这些通用算法抽象出来。在抽象类实现,其他步骤在子类实现以代码为例: 关系类图如下一、定义AbstractClass#include <iostream&...原创 2019-08-01 19:53:10 · 105 阅读 · 0 评论 -
设计模式(十二):原型模式(持续更新。。。)
设计模式(十二):原型模式(持续更新。。。)定义: ·是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式主要解决: ·在运行期建立和删除原型。如何解决: ·利用已有的一个原型对象,快速地生成和原型对象一样的实例。以代码为例: 类图关系如下一、定义Prototype类声明一个接口来克隆自己#include <iostream>#i...原创 2019-08-05 21:14:09 · 78 阅读 · 0 评论 -
设计模式(五):单例模式(持续更新...)
设计模式(五):单例模式(持续更新…)定义: ·让类自身保证它只有一个实例,并提供一个全局访问点。 ·不能通过构造函数构造,否则就能够实例化多个。构造函数需要私有声明主要解决: ·一个全局使用的类频繁地创建与销毁何时使用: ·当想控制实例数目,节省系统资源的时候以代码为例: 关系类图如下一、设计Singleton类#include <iostream>...原创 2019-07-29 20:44:47 · 77 阅读 · 0 评论 -
C++代码编译过程
C++代码编译过程源代码从生成到可执行文件可以分成四个步骤:预处理、编译、汇编和链接。以下是linux下GCC生成一个可执行文件a.out的过程:一、预处理预处理过程主要是处理那些源文件和头文件中以#开头的命令,例如:#include、#define、#ifdef等。预处理的规则:·将所有的#define删除,并展开所有的宏定义。·处理所有条件编译命令,比如 #if、#ifdef、...原创 2019-07-24 21:05:06 · 1649 阅读 · 0 评论 -
设计模式(九):状态模式
设计模式(九):状态模式定义: ·一个对象可能拥有多种状态,当内在状态改变时允许改变行为。 ·在状态模式中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 ·在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象主要解决: ·对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。如何解决:...原创 2019-08-02 21:50:31 · 133 阅读 · 0 评论 -
设计模式(六):命令模式
设计模式(六):命令模式定义: ·将请求分装为对象,将请求和执行分开,可以用不同的请求对客户参数化。可以对请求排队、通过或否决、记录日志、撤销或重做。 ·通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。主要解决: ·在软件系统中,对行为请求者和行为实现者进行松耦。何时使用: ·基于敏捷开发原则,不要给代码添加基于猜测而实际不需要的功能,在需要的时候通过重构实现以代...原创 2019-07-30 20:48:37 · 93 阅读 · 0 评论 -
设计模式(一):策略模式
设计模式(一):策略模式定义:·策略模式定义算法家族并分别封装,他们完成的工作相同,只是实现不同,可以互相替换。继承有助于析取这些算法的公共功能。此模式让算法的变化不会影响到使用算法的用户。·一个系统有许多许多类,每一个策略都是实现同一个接口,而区分它们的只是他们直接的行为。以代码为例: 类关系图如下:1、首先声明父类Strategyclass Strategy{public...原创 2019-07-25 20:04:12 · 197 阅读 · 0 评论 -
C++中的override和final关键字
C++中的override和final关键字C++11 中新引入的override和final关键字,他们有什么用途呢?以代码为例final关键字例1:#include <iostream>using namespace std;class A {public: virtual void Test() final{ cout << "TestA" &...原创 2019-07-30 22:41:44 · 330 阅读 · 0 评论 -
设计模式(十):代理模式
设计模式(十):代理模式定义: ·为其他对象提供一种代理以控制对这个对象的访问。实际上是在访问对象时引入一定程度的间接性 ·创建具有现有对象的对象,以便向外界提供功能接口。主要解决: ·在直接访问对象时带来的问题如何解决: ·增加中间件以代码为例: 关系类图如下一、定义Subject类Subject为Real Subject和Proxy的公共接口,以便可以在期望R...原创 2019-08-03 19:33:10 · 103 阅读 · 0 评论 -
设计模式
设计模式借用百度百科所说: 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的就是为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。23种设计模式被分为创建型模式、结构型模式和行为型模式三种模式创建型模式:·工厂方法模式...原创 2019-07-26 20:18:31 · 132 阅读 · 0 评论 -
设计模式(七):适配器模式
设计模式(七):适配器模式定义: ·当系统数据和行为都一致,只有接口不符合时,将一个类的接口转化为客户端期望的另一个接口。主要解决: ·主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。何时使用: ·系统需要使用现有的类,而此类的接口不符合系统的需要。 ·想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,...原创 2019-07-31 19:41:30 · 148 阅读 · 0 评论 -
设计模式(十一):建造者模式
设计模式(十一):建造者模式定义: ·将复杂对象的创建与表示分开,使得相同的创建过程可以有不同的表示。用户只需制定需要建造的类型,不需要知道建造的过程和细节。主要解决: ·主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成; ·由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。如何...原创 2019-08-04 21:04:16 · 109 阅读 · 0 评论 -
用户模式和内核模式
首先我们要解释一个概念——进程(Process)。简单来说,一个可执行程序就是一个进程,前面我们使用C语言编译生成的程序,运行后就是一个进程。进程最显著的特点就是拥有独立的地址空间。严格来说,程序是存储在磁盘上的一个文件,是指令和数据的集合,是一个静态的概念;进程是程序加载到内存运行后一些列的活动,是一个动态的概念。“程序的地址空间”的说法,这其实是不严谨的,应该说“进程的地址空间”。一个进程...翻译 2019-08-04 21:39:24 · 8204 阅读 · 1 评论 -
设计模式(二):抽象工厂模式
设计模式(二):抽象工厂模式定义: ·提供一个创建一系列相关或互相依赖对象的接口,只需要知道对象的系列,无需知道具体的对象。 ·在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。主要解决: ·接口选择的问题。何时使用: ·系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。以代码为例: 类关系图如...原创 2019-07-26 21:37:01 · 109 阅读 · 0 评论 -
浅谈C++数组和指针
浅谈C++数组和指针一、数组不同与指针以代码为例子:#include <stdio.h>int main(){ int a[6] = {0, 1, 2, 3, 4, 5}; int *p = a; int len_a = sizeof(a) / sizeof(int); int len_p = sizeof(p) / sizeof(int);...原创 2019-07-31 22:49:18 · 195 阅读 · 0 评论 -
设计模式(三):观察者模式
设计模式(三):观察者模式定义: ·多个观察者对象同时建通某一主题(通知者)对象,当该主题对象状态变化时会通知所有观察者对象,是他们能更新自己。 ·也就是说定义对象间的一种多对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决: ·一个对象状态的改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。何时使用: ·一个对象...原创 2019-07-27 20:11:11 · 96 阅读 · 0 评论 -
浅谈借助指针突破C++类访问权限
浅谈借助指针突破C++类访问权限有以下代码:#include <iostream>using namespace std;class A {public: A(int a, int b, int c):m_a(a),m_b(b),m_c(c) {};private: int m_a; int m_b; int m_c;};int main() { A obj...原创 2019-08-07 21:56:43 · 988 阅读 · 0 评论 -
C语言的动态分配内存
C语言的动态分配内存静态内存分配 定义:在C语言的程序空间中,可知代码区、常量区、全局数据区的内存在程序启动时就已经分配好了,这些地址空间大小固定,不能由程序分配和释放,只能等程序运行结束由系统来进行回收。动态内存分配 定义:栈区和堆区的内存在程序运行期间可以根据实际需求来分配和释放,不用在程序刚启动时就分配内存。栈和堆的区别栈区内存由系统分配和释放;堆区内存由程序员掌控。程...原创 2019-08-22 20:01:37 · 505 阅读 · 0 评论