【C++学习】5、类的补充
创始人
2024-11-11 21:10:09

一、类的大小

1、静态成员、成员函数不占类的空间

2、类的对齐规则和结构体的对齐规则一致

二、this指针

1、什么是this指针?

    1、普通成员函数内部自带一个隐式的this指针变量

    2、this保存的是调用该成员函数的对象的地址

2、如果成员函数的形参名和数据成员名同名,可以使用this指针区分

class Data { public:     int a; public:     void setA(int a)     {         this->a = a;     } };

3、通过this完成链式操作

class Print { public:     Print& PrintStr(char *str)     {         cout<

4、静态成员函数没有this指针

静态成员函数是属于类,二不是对象,可以直接通过类名调用。和对象没有关系,所有静态成员内部没有this指针。

5、const修饰的成员函数内部不能对成员数据写操作,mutable修饰的成员数据 除外

class Data1 { public:     int a;     mutable int b; public:     //const修饰成员函数     void showData(void) const     {         //a = 100;//err         b = 200;//ok         cout<<"a="<

三、友元函数

1、什么是友元函数?

关键字:friend

不通过类的成员函数直接访问类的私有数据,破坏了类的封装性

特殊的运算符重载,会用到友元

2、友元的分类

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; } 

四、运算法重载

1、什么是运算符重载?

运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

关键字:operator

2、什么时候用运算符重载?

1、确定运算符的运算对象的个数

2、运算符左边的运算对象是自定义对象

        是自定义对象:

        全局函数实现运算符重载;

        成员函数实现运算符重载

        其他:

        只能全局函数实现

运算符重载的目的:让代码更容易读、写

例:重载运算法<<

//全局函数实现 记得将其设置成友元 ostream& operator<<(ostream &out , Person &ob) {     out<

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...