C++
文章平均质量分 81
Celia_喵喵
这个作者很懒,什么都没留下…
展开
-
程序加载
我们写程序一般都用Visual Studio等集成开发环境(IDE),写好程序后直接点运行就可以出来结果,在Linux中一句简单的命令“gcc -o main main.c”编译连接后就可以执行,那么从我们初始的代码,也就是.c 或 .cpp文件到最后的可执行文件,这一过程真的像我们看到的这么简单吗?那可执行文件.exe是储存在磁盘上的,运行时要加载到内存,它要如何加载,加载那些东西呢?下面来详细原创 2017-10-21 22:01:23 · 981 阅读 · 0 评论 -
C和C++区别(一)
1、带有默认值的函数:int sun(int a,int b = 20){ return a+b;}int mian(){ int a=10; int b=20; sum(a,b); /* mov eax,dword ptr[ebp-8] push eax mov ecx,dword ptr[ebp-4]原创 2017-10-28 21:13:08 · 363 阅读 · 0 评论 -
继承与多态
一、继承是为了实现代码复用。有三种继承方式:公有继承(public)、保护继承(protected)、私有继承(private)。class Base{public: int ma;protected: int mb;private: int mc;};class Derive:public Base{public: int md;prot...原创 2018-03-14 18:45:14 · 275 阅读 · 0 评论 -
枚举
枚举的定义:关键字enum + 枚举类型名 + 枚举成员列表enum open_modes{input, output, append};默认第一个枚举成员赋值为0,后面的每个枚举成员赋的值比前面的大1.枚举成员是常量。可以为一个或多个枚举成员提供初始值,用来初始化枚举成员的值必须是一个常量表达式。枚举成员可以显示赋值为一个常量值,如果没有赋值则为前一个成员的值加一。枚举成原创 2018-03-10 23:18:03 · 324 阅读 · 0 评论 -
C++ STL
STL(Standard Template Liblrary),标准模板库。 一、顺序容器 vector 内存分配由allocator完成。int main(){ vector<int> vec1; if(vec1.empty()) { cout<<"vec1 is empty"<<endl; } vec1.push_back(1)原创 2018-03-17 20:30:40 · 349 阅读 · 0 评论 -
string类的写时拷贝
如图所示,str1和str2指向的内存中内容是一样的,如果系统浅拷贝的话,一个释放后,另一个释放时找不到要是放的内存;如果自己实现深拷贝,会出现内存浪费。所以实现string类的写时拷贝。 引用计数放在什么地方合适呢? 1、放在类中 作为普通成员变量,那么每个对象中都有一个count,不能实现共用; 作为静态成员变量,定义str1和str2后,count...原创 2018-03-17 22:02:53 · 395 阅读 · 0 评论 -
C++复数类运算符重载
实现运算符重载有两种形式:重载为成员函数、重载为友元函数。#include<iostream>using namespace std;class Complex{public: Complex() { real = 0; imag = 0; } Complex(double r,double i) { real = r; imag = i; } ...原创 2018-03-12 20:25:03 · 1232 阅读 · 0 评论 -
面向对象(三)
//面向对象class CGoods{public: CGoods() { cout << "CGoods()" << endl; _pname = new char[1]; *_pname = '\0'; _amount = 0; _price = 0.0; } CGoods(float price) //explicit:禁止生成临时对象,必须明确的调用原创 2018-03-05 20:11:32 · 190 阅读 · 0 评论 -
智能指针
智能指针是行为类似于指针的类对象,利用对象的析构函数,在对象过期时让其析构函数删除指向的堆内存。 智能指针主要有两类: - 不带引用计数的智能指针 C++库的auto_ptr Boost库的scrope_ptr - 带引用计数的智能指针 shared_ptr auto_ptr是C++98提供的方案,现在C++11已经摒弃。 一、auto_ptr template<原创 2018-03-17 13:49:49 · 196 阅读 · 0 评论 -
观察者模式
说到观察者模式,先来看一下MVC模式,如图所示。 也就是M是观察者,V是执行者。观察者接收到请求(例如:注册,登录等)后,调用相应的视图来处理。#include<vector>#include<string>#include<map>#include<iterator>#include<iostream>#include<memory>using namespace std;cla原创 2018-03-19 23:43:13 · 228 阅读 · 0 评论 -
运算符重载
同时定义前缀式操作符和后缀式操作符存在一个问题:它们的形参数目和类型相同,普通重载不能区别所定义的是前缀式操作还是后缀式操作。通常后缀式操作符重载函数接受一个额外的int型形参,编译器提供0作为这个形参的实参。 前缀式操作返回改变后的值,所以返回对象的引用,而后缀式操作符应返回旧值,所以作为值返回。#include<iostream>#include<string>using namespac原创 2018-03-13 22:31:23 · 221 阅读 · 0 评论 -
实现Singleton(单例)模式
其思路如下图://实现Singleton(单例)模式//只能生成该类的一个实例#includeusing namespace std;#if 0//只适用于单线程class Singleton{private: Singleton()//把构造函数设为私有,禁止其他人创建 {} static Singleton* single;//定义一个静态实例,在需要的时候原创 2018-01-13 22:32:30 · 411 阅读 · 0 评论 -
函数的递归调用
#includeint sum(int a,int b){ int tmp = 0; tmp = a+b; return tmp;}int main(){ int a = 10; int b = 20; int ret = 0; ret原创 2017-10-22 23:34:19 · 1243 阅读 · 0 评论 -
编译链接
先来通过一张图看看这一过程:那在预编译、编译、汇编以及链接过程中具体都做了哪些工作呢?预编译:自处理过程,带#都是预处理(包括#if0),字处理(删除注释)。编译:词法分析、语法分析、语义分析、代码优化、汇总所有的符号。汇编:构建.o文件的组成格式链接:1、合并所有.obj文件的段,调整段地址偏移和段长度;2、合并所有符号,进行符号解析(所有.obj符号原创 2017-10-22 01:08:27 · 363 阅读 · 0 评论 -
程序运行
程序运行:1、创建虚拟地址空间到物理内存的映射(创建内核地址映射结构体),创建页目录和页表2、加载代码段和数据段。3、把可执行文件的入口地址写到CPU的pc寄存器里面。首先来看一下,可执行文件的结构:可执行文件和*.o文件的结构相似,也是一段一段,4字节对齐,页面对齐在哪呢?可以看到在ELF Header中有一部分program header,和*.o文件不原创 2017-10-22 16:46:45 · 540 阅读 · 0 评论 -
C和C++区别(二)
接着之前的内容来说,C和C++的区别。6、引用原创 2017-11-03 19:21:19 · 260 阅读 · 0 评论 -
C和C++区别(三)
8、new & delete在C语言中用malloc和free开辟和释放动态内存。 在C++中用new和delete开辟和释放动态内存。int main(){int *p = (int*)malloc(sizeof(int));//动态开辟内存free(p);int *pn = new int();//1、动态开辟内存空间;2、初始化为()中的数字或调用构造函数(不加括号不初始化)原创 2017-11-05 22:30:56 · 307 阅读 · 0 评论 -
IA32体系32位Linux系统虚拟地址映射
我们经常会打印临时变量地址,那到底打印的是逻辑地址?线性地址?物理地址?虚拟地址?临时变量到底存放在物理内存的哪个位置?现代操作系统如Linux都采用内存保护模式来管理内存。IA32架构的CPU规定地址映射过程是:逻辑地址——>线性地址——>物理地址。那么,Linux如何进行地址映射?CPU相关寄存器IA-32架构中提供了10个32位和6个16位的寄存器,这些寄存器分为三类:原创 2017-12-12 16:00:30 · 1003 阅读 · 0 评论 -
函数模板
写最简单的求和函数如下所示:int Sum(int a,int b){ return a+b;}那如果我们求double呢?在C语言中我们用到泛型编程,也可以通过函数重载实现,但是代码重复性大,工作量大。还有可以用宏实现,#define Sum(a+b)没有类型检查。在C++中模板专门可以解决这类问题。模板有2类:函数模板和类模板。函数模板主要有以下几方面:1原创 2017-12-22 20:21:08 · 248 阅读 · 0 评论 -
面向对象(一)
我们说C语言是面向过程,而C++是面向对象,今天就看一下面向对象到底是什么意思?原创 2017-11-07 15:50:24 · 340 阅读 · 0 评论 -
面向对象(二)
class CGoods{public: CGoods() { cout << "CGoods()" << endl; _pname = new char[1];//不管什么方式构造,都指向合法内存 _pname = '\0'; _amount = 0; _price = 0.0; } CGoods(char*name,int amount,float price)原创 2017-12-18 13:38:40 · 299 阅读 · 0 评论 -
工厂模式
在程序设计时可以用基类指针指向其派生类对象,达到多态的目的。这里很容易出现一个问题:n多个子类继承一个抽象基类,不得不在每次用到子类的地方就写new xxx的代码。这里带来的两个问题:1、必须知道实际子类的名字;2、程序的扩展性和维护性变得越来越困难。还有一种情况就是在父类中并不知道具体要实例化哪一个具体的子类。 以上两个问题就引出设计工厂模式的两个重要功能: 1、定义创建对象的接口,封装了对...原创 2018-03-20 13:37:16 · 235 阅读 · 0 评论