什么叫做面向对象
一.实现面向对象的机制,所以我们引用的概念和应用
int n=4;
int &r = n;//说明 r引用了 n,r 的类型就是int &
某个变量的引用等价于这个变量,看着好像是一个房子 开了两个门一样 因为这个&很像是一个取地址啊
一个例子 就是c语言中如何编写交换两个整形变量值的函数 因为形参和实参的原因导致形参改变了,实参没有变化
原来是利用的指针
现在来看一个范例
void swap( int & a,int&b)
{ int tmp;
tmp=a ;a=b;b=tmp;}
int n1 ,n2 ;
swap (n1 ,n2) ; 这里n1 ,n2进入了swap函数里面以后直接被ab所引用了,所以就造成了实参的变化
二.定义引用的时候,前面加const 关键字 ,即为“常引用”
如 int n;
const int & r=n; 这个带来的就是 r就变成了一个后门,你知道门后面装的啥,就是改变不了,进不去出不来
只能通过n这个大门进,当然n可以进去 注意const int & 和int &是不一样的类型
下面来看const的用法
const可以用来定义常量,就是说这个房子的内容被我定死了,隔离了
还可以定义常量指针 比如 int n,m; const int * p= & n;
*p = 5;是不可以的 ,就是说p这种钥匙是房东给的,房东要求你不能够动房间里的东西
n=4;是可以的,房东可以自己换
p=&m;是可以的,你用这把钥匙重新加工了一下 可以开m的门了
并且你不可以把常量指针赋值给非常量指针,反过来可以,就是说这把钥匙先天垃圾一等
函数参数为常量指针时,房东会放心些
三.动态内存的分配
我有一个医院方案,但是每次不知道送来多少病人,所以我的床位的方案是一直在改变的
用new运算符实现动态内存的分配 就是说火神山,而delete就是搞完马上拆了,地空出来给别人用
int *p = new int ;
new的类型其实也是int ,这个时候p就可以用了,只是说用完以后这个内存会给别人
int *pn = new int[20];
再来看看怎么拆除
比如 int *p = new int ; *p =5; delete p;就删除了,只能删除一次,该指针必须指向new的空间,别拆错了
比如int *pn = new int[20]; p[0] =1; delete []p; 前面加个p代表是拆数组,可能会怕拆不干净
四.内联函数
函数调用是有时间开销的,为了减少函数调用的开销,引入了内联函数机制
而内联函数机制就是将整个函数的代码插入到调用语句处而不会产生调用语句
在函数定义之前加“inline”关键字就可以定义内联函数
inline int Max(int a,int b)
{ if(a>b) return a;
return b;}
就是说原来去医院要坐车,现在就把这个医院搬到我们自己小区里面来了,以后看个小病不用跑
函数重载
名字相同,但是参数和参数类型不相同
就是说连锁医院,看你实参类型和个数判断去哪个函数那里去 当然如果出现两个科室都能去,就会扯皮会出现二义性
函数的缺省参数
void func( int x1 ,int x2=2,int x3=3){}
func(10);//这样就默认后面为23,即为10,2,3
func(10,8)//这样就默认10,8,3
func(10,8)//error 只能最右边的连续 那么缺省值就是最右边的连续若干个参数有缺省值
目的在于提高程序的可扩充性,就是说我去医院有个服务是新加的,但是以前的人没有这个条件,但是以前的功能还能用,一样执行,
多余的功能就默认了
五.结构化程序设计
c语言使用结构化程序设计:
程序=数据结构+算法
程序有全局变量以及众多相互调用的函数组成
算法是以函数的形式实现的,用于对数据结构进行操作
那么随着程序规模的增加,程序逐渐难以理解,很难一下子看出来
有诸多问题,现在引入一个面向对象的程序设计方法
面向对象的程序=类+类+类。。。。
将某类的事物的特点归纳,用多个变量描述事物的属性 控制工程基础(物理模型?)
将这类事物所能进行的行为也归纳出来,形成一个个函数,这些函数可以用来操作数据结构(这一步叫做抽象)
通过某种语法形式,将数据结构和操作该数据结构的函数捆绑在一起,形成一个类,从而使得数据结构和操作该数据结构的算法呈现出
一种显而易见的关系,这就是封装
面向对象的程序设计就有“抽象”“封装”“继承”“多态”
成员变量,成员函数。把一个类看作一个社区,里面有一些工作人员,一些机构
那么机构可以执行某些功能但是需要一些对应的工作人员去操作, 这个社区就是一个类,可以互相调用
例如:class CR
{ public:
int w ,h;
int Area(){
return wh;}
int per(){
return 2(w+h);}
void Init( int w_,int h_){
w=w_; h=h_;}
};//必须有分号 这里面有三个成员函数
那么CR就就是一个类了,就和int一样,可以直接赋值 需要注意的的是CR的所占的内存空间大小是sizeof(int)*2,
成员函数是公用的,不会算在里面
例如 int main()
{ int w,h;
CR r;//r是一个对象
cin >> w>>h;
r.per(w,h);
cout << r.Area<<endl
return 0;} w,h 就直接输入到这个类里面了
当然还可以用指针去定义 还有引用 不做赘述
六.类和对象的基本概念
类的成员函数和类的定义可以分开写
如class CR
{ public:
int w,h;
int Area();};//成员函数尽在此声明
int CR::Area(){
return w*h;}这样有两个::代表这个是一个类的函数
在类的定义中,用下列访问范围的关键字来说明类成员可以被访问的范围:
private:私有成员,只能在成员函数内访问
public:公有成员 protected:保护成员
如果某个成员前面没有上述关键字,就缺省被认为是私有成员
私有成员就是说我只能在类里面去访问,而出去这个类就不能被访问,也就是说在main函数里面不能进去访问
有点像学区房一样,这个学校只能周围社区的人去读,或者进入成员函数去调用,而不能直接调用
好处就是如果我要更改成员变量的属性,我只需要在类里面修改,因为外部不能够直接调用,所以也不存在需要
修改外部。也就说我修改一个政策不用考虑你外面的情况,因为你外面的只能通过我的机构访问我
,我只需要对机构进行修改就可以了
成员函数也可以重载和参数缺省