1、静态成员、成员函数不占类的空间
2、类的对齐规则和结构体的对齐规则一致
1、普通成员函数内部自带一个隐式的this指针变量
2、this保存的是调用该成员函数的对象的地址
class Data { public: int a; public: void setA(int a) { this->a = a; } }; class Print { public: Print& PrintStr(char *str) { cout< 静态成员函数是属于类,二不是对象,可以直接通过类名调用。和对象没有关系,所有静态成员内部没有this指针。
class Data1 { public: int a; mutable int b; public: //const修饰成员函数 void showData(void) const { //a = 100;//err b = 200;//ok cout<<"a="< 关键字:friend
不通过类的成员函数直接访问类的私有数据,破坏了类的封装性
特殊的运算符重载,会用到友元
1、普通全局函数作为类的友元
2、类的成员函数作为另一个类的友元
A类的成员函数作为B类的友元
1、A类必须在B类之前定义
2、A类的成员函数必须在类外(必须是B类的下发实现)
3、记得将B类向前声明
3、整个类作为另一个类的友元
注意:
1、友元关系不能被继承
2、友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友
3、友元关系不具有传递性
案例:
#include using namespace std; class remote; //编写电视机类,电视机有开机和关机状态,有音量,有频道,提供音量操作的方法,频道操作的方法。 class tv { friend class remote; enum{OFF,ON};//开关机状态 enum{minVol,maxVol=100};//音量 enum{minChan=1,maxChan=20};//频道 private: int state; int volume; int channel; public: tv() { state=OFF; volume=minVol; channel=minChan; } void setOfforOn();//电视操作方法 void volumeUp(); void volumeDown();//音量操作方法 void channelUp(); void channelDown();//频道操作方法 void showTv(); }; //由于电视机只能逐一调整频道,不能指定频道,增加遥控类,遥控类除了拥有电视机已有的功能,再增加根据输入调台功能。 //提示:遥控器可作为电视机类的友元类 class remote { private: tv *p; public: remote(tv *p) { this->p=p; } void setOfforOn();//电视操作方法 void volumeUp(); void volumeDown();//音量操作方法 void channelUp(); void channelDown();//频道操作方法 void showTv(); void setChannal(int channel); }; int main() { tv t; remote re(&t); re.setOfforOn(); re.setChannal(20); re.volumeUp(); re.volumeUp(); re.volumeUp(); re.volumeUp(); re.showTv(); return 0; } void tv::setOfforOn() { state=(state==OFF?ON:OFF); } void tv::volumeUp() { if(volume==maxVol) { cout<<"音量乙最大"<setOfforOn(); } void remote::volumeUp() { p->volumeUp(); } void remote::volumeDown() { p->volumeDown(); } void remote::channelUp() { p->channelUp(); } void remote::channelDown() { p->channelDown(); } void remote::showTv() { p->showTv(); } void remote::setChannal(int channel) { if(channel < tv::minChan || channel>tv::maxChan) { cout<<"无效的频道"<channel = channel; } 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
关键字:operator
1、确定运算符的运算对象的个数
2、运算符左边的运算对象是自定义对象
是自定义对象:
全局函数实现运算符重载;
成员函数实现运算符重载
其他:
只能全局函数实现
运算符重载的目的:让代码更容易读、写
例:重载运算法<<
//全局函数实现 记得将其设置成友元 ostream& operator<<(ostream &out , Person &ob) { out<
下一篇:外置光驱重装系统,让电脑焕然一新