结构化(面向过程)程序设计的不足
面向对象程序设计(OOP)



类和对象


#include<bits/stdc++.h>using namespace std;class Rect{//class 类关键字 Rect 类名public:int w,h;//成员变量int Square(){return w*h;}//成员函数int Parameter(){return 2*(w+h);}void Init(int _w,int _h){w=_w;h=_h;}};//分号不能少int main(void){int w,h;cin>>w>>h;Rect r;//r是一个对象r.Init(w,h);//调用成员函数cout<<"The square of the rectangle is"<<ends<<r.Square()<<endl;cout<<"The parameter of the rectangle is"<<ends<<r.Parameter()<<endl;}
内存分配
对象间的运算
类的成员变量和成员函数的用法
用法一:对象名.成员名
#include<bits/stdc++.h>using namespace std;class Rect{public:int w,h;int Square(){return w*h;}int Parameter(){return 2*(w+h);}void Init(int _w,int _h){w=_w;h=_h;}};int main(void){Rect r1,r2;r1.w=5;//对象r1中的成员变量w初始化为5r2.Init(5,4);//对象r2中的成员变量w和h分别初始化为5和4return 0;}
用法二:指针->成员名
#include<bits/stdc++.h>using namespace std;class Rect{public:int w,h;int Square(){return w*h;}int Parameter(){return 2*(w+h);}void Init(int _w,int _h){w=_w;h=_h;}};int main(void){Rect r1,r2;Rect *p1=&r1,*p2=&r2;p1->w=5;//作用在对象r1上p2->Init(5,4);//作用在对象r2上return 0;}
用法三:引用名.成员名
#include<bits/stdc++.h>using namespace std;class Rect{public:int w,h;int Square(){return w*h;}int Parameter(){return 2*(w+h);}void Init(int _w,int _h){w=_w;h=_h;}};void fixRect(class Rect rr){//参数是类本身rr.h=7;rr.w=8;return;}void FixRect(class Rect &rr){//参数是类的引用rr.h=7;rr.w=8;return;}int main(void){Rect r;r.h=5,r.w=6;cout<<r.Square()<<ends<<r.Parameter()<<endl; //30 22fixRect(r);cout<<r.Square()<<ends<<r.Parameter()<<endl;//30 22(不会对实参产生影响)FixRect(r);cout<<r.Square()<<ends<<r.Parameter()<<endl;//56 30return 0;}
用法四:类的定义和类的成员函数分开写
#include<bits/stdc++.h>using namespace std;class Rect{public:int w,h;int Square(void);int Parameter(void);void Init(int,int);//函数原型};int Rect::Square(void)//Rect::说明该函数是Rect类的成员函数,不是普通的函数{return w*h;}int Rect::Parameter(void){return 2*(w+h);}void Rect::Init(int _w,int _h){w=_w;h=_h;}int main(void){Rect r1,r2,r3;Rect *p=&r2;Rect &r=r3;r1.Init(7,8);//通过对象调用p->Init(5,6);//通过对象指针调用r.Init(3,4);//通过对象引用调用std::cout<<r1.Square()<<ends<<p->Parameter()<<ends<<r3.Square();//56 22 12return 0;}
类成员的可访问范围

注意:若某个成员没有上述关键字,则被缺省地认为是私有成员
#include<bits/stdc++.h>using namespace std;class Employee{private:string szName;public:int salary;void SetName(string);void GetName(void);int AverageSalary(Employee &,Employee &);};void Employee::SetName(string name){szName=name;}void Employee::GetName(void){std::cout<<szName;}int Employee::AverageSalary(Employee &e1,Employee &e2){return (e1.salary+e2.salary)/2;}int main(void){Employee E1,E2;E1.salary=5000,E2.salary=10000;E1.szName="Tom";//编译出错 main函数不是类成员函数,不可通过其访问类私有成员E1.SetName("Tom");//OK 通过公有成员函数SetName访问私有成员变量szNameE2.SetName("Jerry");//OKE1.GetName();//OK 通过公有成员函数SetName访问私有成员变量szNamecout<<endl;//TomE2.GetName();//OKcout<<endl;//Jerrystd::cout<<E1.AverageSalary(E1,E2);//7500 该函数同时访问两个同类对象的公有变量salaryreturn 0;}
隐藏机制及其作用


准确地讲,是在SetName()中增加判断是否越界的语句,若越界则删除越界的部分
成员函数的重载和参数缺省
成员函数可以重载,也可以带缺省参数
注意:使用缺省参数时避免函数重载时候的二义性


