模板
引子:如何交换两个变量的值C++中有几种交换变量的方法 ?
1234567891011121314151617181920212223242526272829#define SWAP(t, a, b) \do \{ \ t c = a; \ a = b; \ b = c; \}while(0)void Swap(int& a, int& b){ int c = a; a = b; b = c;}void Swap(double& a, double& b){ double c = a; a = b; b = c;}void Swap(string& a, string& b){ string c = a; a = b; b ...
nginx整体框架解析
基础架构设计
master 负责管理 worker 进程,worker 进程负责处理网络事件。整个框架被设计为一种依赖事件驱动、异步、非阻塞的模式。
如此设计的优点:
1.可以充分利用多核机器,增强并发处理能力。
2.多 worker 间可以实现负载均衡。
3.Master 监控并统一管理 worker 行为。在 worker 异常后,可以主动拉起 worker 进程,从而提升了系统的可靠性。并且由 Master 进程控制服务运行中的程序升级、配置项修改等操作,从而增强了整体的动态可扩展与热更的能力。
目录树
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455fengyun@ubuntu:~/share/nginx$ tree.├── app│ ├── makefile│ ├── nginx.cxx│ ├── ngx_c_conf.cxx│ ├── ngx_log.cxx│ ├── ngx_printf.cxx│ ...
抽象类
面向对象中的抽象概念在进行面向对象分析时 , 会发现一些抽象的概念 !图形的面积如何计算 ?
在现实中需要知道具体的图形类型才能求面积 ,所以对概念上的 “图形” 求面积是没有意义的 !
那么Shape类有存在的必要吗?当然有!
面向对象中的抽象类:
可用于表示现实世界中的抽象概念
是一种只能定义类型 , 而不能产生对象的类
只能被继承并重写相关函数
直接特征是相关函数没有完整的实现
Shape 是现实世界中各种图形的抽象概念因 此 :
程序中必领能够反映抽象的图形
程序中通过抽象类表示图形的概念
抽象类不能创建对象,只能用于继承
抽象类与纯虚函数
C+ + 语言中没有抽象类的概念
C+ + 中通过纯虚函数实现抽象类
纯虚函数是指只定义原型的成员函数
一个 C+ + 类中存在纯虚函数就成为了抽象类
语法规则:
12345class Shape{public: virtual double area() = 0;}
= 0 用于编译器当前是声明纯虚函数,因此不需要定义函数体。
如果编译器尝试对抽象类实例化,那么编译器会直接 ...
多态
class的实质class内存分布class 是一种特殊的 struct
在内存中 class 依旧可以看作变量的集合
class 与 struct 遵循相同的内存对齐规则
class 中的成员函数与成员变量是分开存放的每个变量都有独立的成员变量(位于栈空间或堆空间或全局数据区)所有对象共享类中的成员函数(位于代码段)
答案都是20个字节。
那么如果我们在class中添加函数呢?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#include <iostream>#include <string>using namespace std;#pragma pack(4)class A{ int i; int j; char c; double d;public: void print() { cout << ...
继承
继承的概念和意义继承的概念面向对象中的继承指类之间的父子关系
子类拥有父类的所有属性和行为
子类就是一种特殊的父类
子类对象可以当作父类对象使用
子类中可以添加父类没有的方法和属性
1234567891011121314151617181920212223242526272829303132333435363738#include <iostream>#include <string>using namespace std;class Parent{ int mv;public: Parent() { cout << "Parent()" << endl; mv = 100; } void method() { cout << "mv = " << mv << endl; }};class Child : publ ...
操作符重载
重载 << 操作符操作符 < < 的原生意义是按位左移 , 例 :1« 2 ;其意义是将整数 1 按位左移 2 位 , 即 :0000 0001 ==》 0000 0100重载左移操作符 , 将变量或常量左移到一个对象中 !
我们已经实现了将1和'\n'字符传送到命令行中。我们可以继续优化,<<能够连续地接收输入,并且将换行符修改为常量endl
接着继续实现重载函数,将字符串,浮点数等等都能够接收输入。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <stdio.h>const char endl = '\n';class Console{public: Console& operator << (int i) { printf("%d", i); ...
智能指针
智能指针概念和意义内存泄漏( 臭名昭著的Bug )
动态申请堆空间 , 用完后不归还
C++语言中没有垃圾回收的机制
指针无法控制所指堆空间的生命周期
我们需要什么?
需要一个特殊的指针
指针生命周期结束时主动释放堆空间
—片堆空间最多只能由一个指针标识
杜绝指针运算和指针比较
解决方案
重载指针特征操作符( **-> 和 *** )
只能通过类的成员函数重载
重载函数不能使用参数
只能定义一个重载函数
运算符 -> 的重载比较特别,它只能是非静态的成员函数形式,而且没有参数。如果返回值是一个原始指针,那么就将运算符的右操作数当作这个原始指针所指向类型的成员进行访问;如果返回值是另一个类型的实例,那么就继续调用这个返回类型的 operator->() ,直到有一个调用返回一个原始指针为止,然后按第一种情况处理。
如果上述条件不满足(如:右操作数不是返回的原始指针指向的类型的成员,或者,返回的非指针类型没有重载 operator->() ),那么编译将报错。
12345678910111213141516171819202122232425 ...
面向对象和类
面向对象的基本概念面向对象的意义
将日常生活中习惯的思维方式引入程序设计中
将需求中的概念直观的映射到解决方案中
以模块为中心构建可复用的软件系统
提高软件产品的可维护性和可扩展性
类和对象是面向对象中的两个基本概念
类:指的是一类事物,是一个抽象的概念
对象:指的是属于某个类的具体实体
类是一种模型,这种模型可以创建出不同的对象实体
对象实体是类模型的一个具体实例
一个类可以有多个对象,而一个对象必然属于某个类
类和对象的意义
类用于抽象的描述一类事务所特有的属性和行为如:电脑拥有CPU,内存和硬盘,并且可以开机和运行程序
对象是具体的事物,拥有所属类中描述的一切属性和行为如:每一只老虎都有不同体重,不同食量等
一些有趣问题类一定存在实际的对象吗?不一定,比如:恐龙,理论上来看,考古学家通过化石构建出一个恐龙,但是现在并不存在一个真真切切的恐龙
类的对象数目是确定的吗?不一定确定,比如有多少只老虎?
类一定来源于现实生活?不一定,虽然将现实中类的思想移到编程思想中,但一些辅助类需要我们自己抽象构建
类都是独立的吗?类之间存在关系吗?类不是独立的,类之间显然存在关系
对象实例一定 ...
动态内存分配
C++中的动态内存分配
C++中通过new关键字进行动态内存申请【C语言malloc是一个库函数,C语言自身不包含动态内存申请,一些编译器可能不支持malloc】
C++中的动态内存申请是基于类型进行的【malloc基于字节数分配】
delete关键字用于内存释放
123456789//变量申请Type* pointr = new Type;//...delete pointer;//数组申请Type* pointer = new Type[N];//...delete[] pointer;
注意:释放数组必须加上[],delete[] pointer;如果没加上[],释放的仅仅是数组第一个元素,后面的一大块内存都没有释放
new关键字与malloc函数的区别
new关键字是C++的一部分malloc是由C库提供的函数一些编译器可能没有malloc函数的库
new以具体类型为单位进行内存分配malloc以字节为单位进行内存分配
new在申请单个类型变量时可进行初始化malloc不具备内存初始化的特性
delete 和 free 的区别
delete 在所有 C+ + 编译器中都被 ...
类型转换
隐式类型转换标准数据类型之间会进行隐式的类型安全转换
1234567891011121314151617181920212223242526272829#include <iostream>#include <string>using namespace std;int main(){ short s = 'a'; unsigned int ui = 1000; int i = -2000; double d = i; cout << "d = " << d << endl; cout << "ui = " << ui << endl; cout << "ui + i = " << ui + i << endl; if( (ui + i) > 0 ) { c ...