嵌入式养成计划-38----C++--匿名对象--友元--常成员函数和常对象--运算符重载

八十七、匿名对象

  • 概念:没有名字对象
  • 格式 :类名();
  • 作用
    1. 用匿名对象给有名对象初始化的
    2. 用匿名对象给对象数组初始化的
    3. 匿名对象作为函数实参使用

示例 :

#include <iostream>
using namespace std;
class Dog
{
private:string name;string color;int *age;
public://无参构造函数Dog(){cout << "Dog::无参构造函数" << endl;}//有参构造函数Dog(string name, string c, int age):name(name),color(c),age(new int(age)){cout << "Dog::有参构造函数" << endl;}//拷贝构造函数Dog(const Dog &other):name(other.name),color(other.color),age(new int(*other.age)){cout << "Dog::拷贝构造函数" << endl;}//拷贝赋值函数Dog &operator=(const Dog &other){if(this != &other)  //避免自己给自己赋值{name = other.name;color = other.color;age = new int(*other.age); //深拷贝赋值函数}cout << "Dog::拷贝赋值函数" << endl;return *this;}//析构函数~Dog(){cout << "Dog::析构函数" << endl;}
};
void fun(Dog g)//Dog g = Dog("大黄","lll",6)
{//函数代码。。。
}
int main()
{Dog d1 = Dog("大黄","lll",6); //匿名对象给有名对象初始化Dog d[3] = {Dog("大","lll",6),Dog("黄","lll",6),Dog("大黄","lll",6)};fun(Dog("大黄","lll",6));  //匿名对象作为函数实参使用return 0;
}

八十八、友元

88.1 作用

  • 可以让其他一些函数或者类访问 另一个类的私有数据成员
  • 友元关键字 : friend

88.2 种类

  1. 全局函数做友元
  2. 类友元
  3. 成员函数做友元

88.3 全局函数做友元

  • 让全局函数访问一个类私有数据成员。

示例 :

#include <iostream>
using namespace std;
class Room {friend void room_friend(Room &r);
private:string keting;
public:string zoulang;Room();
};
Room::Room(){this->keting = "客厅";this->zoulang = "走廊";
}
void room_friend(Room &r){cout << "全局友元函数在访问->" << r.zoulang <<endl;cout << "全局友元函数在访问->" << r.keting <<endl;
}
int main()
{Room r1;room_friend(r1);return 0;
}

88.4 类做友元

  • 一个类去访问另一个类的私有属性。

88.5 成员函数做友元

  • 一个类里的成员函数去访问另一个类的私有属性。

88.6 示例

#include <iostream>
using namespace std;class Room;class Friend_Room{
private:Room *r;
public:Friend_Room();void access_room();
};class Room {
//    friend class Friend_Room;friend void Friend_Room::access_room();
private:string keting;
public:string zoulang;Room();
};
Room::Room(){this->keting = "客厅";this->zoulang = "走廊";
}Friend_Room::Friend_Room(){this->r = new Room;cout << "Friend_Room 的 构造函数" << endl;
}
void Friend_Room::access_room(){cout << "Friend_Room 正在访问 " << this->r->zoulang << endl;cout << "Friend_Room 正在访问 " << this->r->keting << endl;
}int main()
{Friend_Room f_r;f_r.access_room();return 0;
}

88.7 注意

  • 不要过度使用友元,会降低或者破坏封装性
  • 友元不具有交互性,传递性,继承性。

八十九、const修饰的成员函数和对象(常成员函数、常对象)

  • 类中所有的成员函数都可以对类中数据成员进行修改操作,
  • 如果想设计一个成员函数不能对数据成员修改操作,则需要用const修饰的成员函数实现。

89.1 常成员函数

  • 常成员函数 :表示该成员函数不能修改数据成员的值。
  • 格式 :
    返回值类型 函数名(形参列表) const 
    {函数体内容;
    }
    
  • 同名的常成员函数和非常成员函数构成重载关系,
    • 原因:this指针类型不同

89.2 常对象

  • 常对象表示这个对象的数据成员不能被修改。
  • 格式: const 类名 对象名;
  1. 非常对象可以调用常成员函数,也可以调用非常成员函数,优先调用非常成员函数
  2. 常对象只能调用常成员函数,如果没有常成员函数,则报错

示例 :

#include <iostream>
using namespace std;class Stu
{
private:string name;int id;
public:Stu(){}Stu(string  name, int id):name(name),id(id){}//常成员函数void display() const //this指针原型: Stu const * const this;{//this->name = "lisi"; 常成员函数不能对数据成员修改cout << name <<"  "  << id << endl;}//非常成员函数void display() //this指针原型: Stu * const this;{this->name = "lisi";cout << name <<"  "  << id << endl;}
};
int main()
{const Stu s1("zhangsan", 1001);   //常对象s1.display(); //常对象只能调用常成员函数return 0;
}

89.3 mutable关键字

  • mutable修饰成员变量,表示该成员变量可以在常成员函数中被修改 (取消常属性)
    在这里插入图片描述

九十、运算符重载

  • 概念:
    运算符重载就是对运算符重新定义,赋予另一种功能,以适应不同的数据类型。
  • 每种运算符重载都有两种实现方式:
    1. 成员函数实现运算符重载
    2. 全局函数实现运算符重载

90.1 算术运算符重载

种类: +  -   *  /    %
表达式: L   ?   R    (L 左操作数     ?运算符    R右操作数)
左操作数:可以是左值,可以右值,运算过程中不可以被改变
右操作数:可以是左值,可以右值,运算过程中不可以被改变
结果:右值 (不可以被改变)
  • 算术运算符重载实现方式:
    1. 成员函数实现运算符重载

      const 类名 operator#(const 类名 &R) const 
      {具体实现
      }
      

      第一个const 表示结果是右值 不能被改变
      第二个const 表示右操作数运算过程中不能被改变
      第三个const 表示左操作数运算过程中不能被改变

    2. 全局函数实现运算符重载

      const 类名 operator#(const 类名 &L, const 类名 &R)
      {具体实现
      }
      

示例 :

#include <iostream>
using namespace std;class Person
{friend const Person operator+(const Person &L, const Person &R);
private:int a;int b;
public:Person(){}Person(int a, int b):a(a),b(b){}//成员函数实现+号运算符重载
//    const Person operator+(const Person &p) const
//    {
//        Person temp;
//        temp.a = a + p.a;
//        temp.b = b + p.b;
//        return temp;
//    }void show(){cout << " a = " << a << "    b = " << b << endl;}
};//全局函数实现+运算符重载
const Person operator+(const Person &L, const Person &R)
{Person temp;temp.a = L.a + R.a;temp.b = L.b + R.b;return temp;
}
int main()
{Person p1(10,10);Person p2(10,10);//成员函数//简化版本//Person p3 = p1 + p2; //本质上 Person p3 = p1.operator+(p2)Person p3 = p1 + p2; //本质上 Person p3 = operator+(p1, p2)p3.show();return 0;
}

90.2 关系运算符重载

种类: > 、 >= 、 <、 <=、  ==、  !=
表达式: L   ?   R    (L 左操作数     ?运算符    R右操作数)
左操作数:可以是左值,可以右值,运算过程中不可以被改变
右操作数:可以是左值,可以右值,运算过程中不可以被改变
结果: bool类型
  • 关系运算符重载实现方式:
    1. 成员函数实现运算符重载
      bool operator#(const 类名 &R) const
      {具体实现
      }
      
    2. 全局函数实现运算符重载
      bool operator#(const 类名 &L, const 类名 &R)
      {具体实现
      }
      

示例 :

#include <iostream>
using namespace std;
//
class Person
{friend bool operator>(const Person &L, const Person &R);
private:int a;int b;
public:Person(){}Person(int a, int b):a(a),b(b){}//成员函数实现>号运算符重载
//    bool operator>(const Person &R) const
//    {
//        if(a>R.a && b>R.b)
//        {
//            return true;
//        }
//        else
//        {
//            return false;
//        }
//    }void show(){cout << " a = " << a << "    b = " << b << endl;}
};
//全局函数实现>号运算符重
bool operator>(const Person &L, const Person &R)
{if(L.a>R.a && L.b>R.b){return true;}else{return false;}
}
int main()
{Person p1(10,10);Person p2(10,10);if(p3 > p2)  //本质上  p3.operator>(p2)//本质上 operator(p3,p2){cout <<"p3>p2" << endl;}return 0;
}

90.3 赋值运算符重载

种类: = 、+= 、 -= 、*= 、/=  、%=
表达式: L   ?   R    (L 左操作数     ?运算符    R右操作数)
左操作数:是左值,运算过程中要被改变
右操作数:可以是左值,可以右值,运算过程中不可以被改变
结果:自身的引用
  • 赋值运算符重载实现方式:
    1. 成员函数实现运算符重载
      类名 &operator#(const 类名 &R) 
      {具体实现
      }
      
    2. 全局函数实现运算符重载
      类名 &operator#(类名 &L, const 类名 &R) 
      {具体实现
      }
      

示例 :

#include <iostream>
using namespace std;class Person
{friend Person &operator+=(Person &L,const Person &R);
private:int a;int b;
public:Person(){}Person(int a, int b):a(a),b(b){}//成员函数实现+=号运算符重载
//    Person &operator+=(const Person &R)
//    {
//        a += R.a; // a = a + R.a
//        b += R.b;
//        return *this;
//    }void show(){cout << " a = " << a << "    b = " << b << endl;}
};
//全局函数实现+=号运算符重载
Person &operator+=(Person &L,const Person &R)
{L.a += R.a; // a = a + R.aL.b += R.b;return L;
}
int main()
{Person p1(10,10);Person p2(10,10);p3+=p2;  //  p3 = p3 + p2    本质上 p3.operator+=(p2)p3.show();return 0;
}

小作业

  • 整理代码
    • 算术运算符
    • 逻辑运算符
    • 赋值运算符

我写的

#include <iostream>using namespace std;class Stu {//逻辑运算符重载的全局友元函数friend bool operator>(const Stu &l, const Stu &r);friend bool operator>=(const Stu &l, const Stu &r);friend bool operator<(const Stu &l, const Stu &r);friend bool operator<=(const Stu &l, const Stu &r);friend bool operator==(const Stu &l, const Stu &r);friend bool operator!=(const Stu &l, const Stu &r);//赋值运算符重载friend Stu &operator+=(Stu &l, const Stu &r);friend Stu &operator-=(Stu &l, const Stu &r);friend Stu &operator*=(Stu &l, const Stu &r);friend Stu &operator/=(Stu &l, const Stu &r);friend Stu &operator%=(Stu &l, const Stu &r);
private:double high;double weight;
public:Stu(){}Stu(double h, double w):high(h),weight(w){}void show(){cout << "high = " << this->high << endl;cout << "weight = " << this->weight << endl;puts("");}//类内实现运算符重载//算术运算符重载const Stu operator+(const Stu &s)const{Stu t;t.high = this->high + s.high;t.weight = this->weight + s.weight;return t;}const Stu operator-(const Stu &s)const{Stu t;t.high = this->high + s.high;t.weight = this->weight + s.weight;return t;}const Stu operator*(const Stu &s)const{Stu t;t.high = this->high + s.high;t.weight = this->weight + s.weight;return t;}const Stu operator/(const Stu &s)const{Stu t;t.high = this->high + s.high;t.weight = this->weight + s.weight;return t;}const Stu operator%(const Stu &s)const{Stu t;t.high = (int)this->high % (int)s.high;t.weight = (int)this->weight % (int)s.weight;return t;}//重载赋值运算符const Stu &operator=(const Stu &s){this->high = s.high;this->weight = s.weight;return *this;}
};/** 全局函数实现运算符重载* 访问类的私有属性需要添加为类的友元函数
*/
//逻辑运算符重载
bool operator>(const Stu &l, const Stu &r){if(l.high > r.high && l.weight > r.weight)return true;return false;
}
bool operator>=(const Stu &l, const Stu &r){if(l.high >= r.high && l.weight >= r.weight)return true;return false;
}
bool operator<(const Stu &l, const Stu &r){if(l.high < r.high && l.weight < r.weight)return true;return false;
}
bool operator<=(const Stu &l, const Stu &r){if(l.high <= r.high && l.weight <= r.weight)return true;return false;
}
bool operator==(const Stu &l, const Stu &r){if(l.high == r.high && l.weight == r.weight)return true;return false;
}
bool operator!=(const Stu &l, const Stu &r){if(l.high != r.high && l.weight != r.weight)return true;return false;
}//赋值运算符重载
Stu &operator+=(Stu &l, const Stu &r){l.high += r.high;l.weight += r.weight;return l;
}
Stu &operator-=(Stu &l, const Stu &r){l.high -= r.high;l.weight -= r.weight;return l;
}
Stu &operator*=(Stu &l, const Stu &r){l.high *= r.high;l.weight *= r.weight;return l;
}
Stu &operator/=(Stu &l, const Stu &r){l.high /= r.high;l.weight /= r.weight;return l;
}
Stu &operator%=(Stu &l, const Stu &r){l.high  = (int)l.high % (int)r.high;l.weight = (int)l.weight % (int)r.weight;return l;
}int main()
{Stu s1(175, 60);Stu s2(170, 55);Stu s3 = s1 + s2;Stu s4 = s1 - s2;Stu s5 = s1 * s2;Stu s6 = s1 / s2;Stu s7 = s1 % s2;s1.show();s2.show();s3.show();s4.show();s5.show();s6.show();s7.show();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/153724.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微电网单台并网逆变器PQ控制matlab仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 微电网运行在并网模式下且公共电网供应正常时&#xff0c;因为公共电网给定了电 压和频率的参考值&#xff0c;所有的逆变器可以使用PQ控制方式。 当系统频率为额定频率f0时&#xff0c;系统稳定在A点&#x…

awvs 中低危漏洞

低危 X-Frame-Options Header未配置 查看请求头中是否存在X-Frame-Options Header字段 会话Cookie中缺少secure属性(未设置安全标志的Cookie) 当cookie设置为Secure标志时&#xff0c;它指示浏览器只能通过安全SSL/TLS通道访问cookie。 未设置HttpOnly标志的Cookie 当cookie设置…

终于找到了!多种类型的电子期刊模板在这里!

经过我不懈的努力和搜寻&#xff0c;终于找到了一个提供多种类型电子期刊模板的网站。这个网站拥有丰富多样的模板&#xff0c;可以满足各种不同的需求&#xff0c;无论是学术研究、商业报告还是个人兴趣爱好&#xff0c;都能在这里找到心仪的模板。 一、网站介绍 这个网站叫做…

软件行业与就业(导师主讲)

在企业软件应用的整体架构体系中&#xff0c;有一部分被称为中间件&#xff0c;那么什么叫中间件&#xff1f; 中间件&#xff08;Middleware&#xff09;是指位于操作系统和应用程序之间的一层软件层&#xff0c;它提供了一组工具和服务&#xff0c;用于简化和增强企业软件应用…

关于hive的时间戳

unix_timestamp&#xff08;&#xff09;和 from_unixtime&#xff08;&#xff09;的2个都是格林威治时间 北京时间 格林威治时间8 from_unixtme 是可以进行自动时区转换的 (4.0新特性) 4.0之前可以通过from_utc_timestamp进行查询 如果时间戳为小数&#xff0c;是秒&#…

Java基本数据类型

Java基本数据类型 1 数值型 整型数据类型 数据类型内存空间&#xff08;8位1字节&#xff09;取值范围byte(字节型&#xff09;8位&#xff08;1字节&#xff09;-128~127 &#xff08;2的8次方&#xff09;short(短整型&#xff09;16位&#xff08;2字节&#xff09;-32768~3…

利用MobaXterm连接服务器的全程配置

一、服务器上的操作 1.1 保证openssh的安装 openssh安装命令如下 apt-get update apt install openssh-server1.2 保证SSH服务没有在相应端口上侦听连接 1确保本地 SSH 服务正在运行 可以尝试使用以下命令检查 SSH 服务的状态&#xff08;在大多数 Linux 系统上&#xff0…

若依微服务部署,裸服务部署、docker部署、k8s部署

目录 前言windows 部署若依-微服务版本浏览器验证docker部署若依-微服务版本浏览器验证k8s部署若依-微服务版本浏览器验证总结 前言 环境&#xff1a;centos7、Win10 若依是一个合适新手部署练习的开源的微服务项目&#xff0c;本篇讲解Windows部署若依微服务、docker部署若依…

【NLTK系列02】NLTK库应用:使用 NLTK 进行情绪分析

使用 NLTK 进行情绪分析 上篇&#xff1a;【NLTK系列】&#xff1a;nltk库介绍&#xff08;01&#xff09;_无水先生的博客-CSDN博客 一、说明 上篇《NLTK库介绍》介绍了NLTK的基本用法&#xff0c;本篇介绍NLTK的一个具体应用&#xff1a;“使用 NLTK 进行情绪分析”&#xf…

基于SpringBoot的桂林旅游景点导游平台

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 景点类型管理 景点信息管理 线路推荐管理 用户注册 线路推荐 论坛交流 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实…

阶段六-Day02-Maven

一、学习Maven 使用Maven创建Web项目&#xff0c;并部署到服务器。 二、Maven介绍及加载原理 1. 介绍 Maven是使用Java语言编写的基于项目对象模型&#xff08;POM&#xff09;的项目管理工具。开发者可以通过一小段描述信息来管理项目的构建、报告和文档。 使用Maven可以…

记录在搭建Jenkins时,所遇到的坑,以及解决方案

项目场景&#xff1a; 记录在搭建Jenkins时,所遇到的坑,以及解决方案.问题描述1 在使用Jenkins构建时,报错如下&#xff1a; cp: cannot stat /project/xx/xxxx/dist/: No such file or directory Build step Execute shell marked build as failure Finished: FAILURE解决方…

【网络豆送书第五期】Kali Linux高级渗透测试

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 本期好书推荐&#xff1a;《Kali Linux高级渗透测试…

MySQ 学习笔记

1.MySQL(老版)基础 开启MySQL服务: net start mysql mysql为安装时的名称 关闭MySQL服务: net stop mysql 注: 需管理员模式下运行Dos命令 . 打开服务窗口命令 services.msc 登录MySQL服务: mysql [-h localhost -P 3306] -u root -p****** Navicat常用快捷键 键动作CTRLG设…

Sentinel入门

文章目录 初始Sentinel雪崩问题服务保护技术对比认识Sentinel微服务整合Sentinel 限流规则快速入门流控模式关联模式链路模式 流控效果warm up排队等待 热点参数限流全局参数限流热点参数限流 隔离和降级FeignClient整合Sentinel线程隔离熔断降级慢调用异常比例、异常数 授权规…

dockerfile lnmp 搭建wordpress、docker-compose搭建wordpress

-----------------安装 Docker--------------------------- 目前 Docker 只能支持 64 位系统。systemctl stop firewalld.service setenforce 0#安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 --------------------------------------------------…

软考高级架构师下篇-18

目录 1. 引言2. 传统数据处理系统的问题1.传统数据库的数据过载问题2.大数据的特点3.大数据利用过程4.大数据处理系统架构分析3.典型的大数据架构1. Lambda架构2.Kappa架构3. Lambda架构与Kappa架构的对比4.大数据架构的实践1.大规模视频网络2.广告平台3.公司智能决策大数据系统…

网络安全(骇客)—技术学习

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…

企业视频直播画面时移看点的用法

企业视频直播画面时移时移功能&#xff0c;可以让客户在观看直播的时&#xff0c;实时回看直播内容&#xff1b;看点功能&#xff0c;可以将视频内容分段标记&#xff0c;能让客户明确内容结构&#xff0c;快速定位目标信息&#xff0c;提升观看体验&#xff0c;跟我一起来体验…

十五、异常(7)

本章概要 其他可选方式 历史观点把异常传递给控制台把“检查的异常”转换为“不检查的异常” 异常指南 其他可选方式 异常处理系统就像一个活门&#xff08;trap door&#xff09;&#xff0c;使你能放弃程序的正常执行序列。当“异常情形”发生的时候&#xff0c;正常的执行…