Part5 数据的共享与保护 5.4类的友元5.5共享数据的保护

友元是C++提供的一种破坏数据封装和数据隐藏的机制。
通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。
可以使用友元函数和友元类。
为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元。

 

友元函数:
  1 友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问 private 和 protected成员
  2 作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择。
  3 访问对象中的成员必须通过对象名。

//5-6友元函数
#include<iostream>
#include<cmath>
using namespace std;
class Point{
public:Point(int x = 0, int y = 0):x(x), y(y){}int getX(){return x;}int getY(){return y;}friend float dist(Point &a, Point &b);
private:int x,y;
};
float dist(Point &a, Point &b){double x = a.x - b.x;double y = a.y - b.y;return static_cast<float>(sqrt(x*x+y*y));
}
int main(){Point p1(1,1), p2(3,4);cout << "The distance is:";cout << dist(p1,p2) << endl;return 0;
}

 

友元类:
  1 若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员。
  2 声明语法:将友元类名在另一个类中使用friend修饰说明。

class A{friend class B;
public:void display(){cout << x << endl;}
private:int x;
}
class B{
public:void set(int i);void display();
private:A a;//A是B的组件
}
void B::set(int i){a.x = i;
}
void B::display(){a.display();
}

类的友元关系是单向的:
  如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有、保护数据。

 


5.5共享数据的保护
对于既需要共享、又需要防止改变的数据应该声明为常类型(用const进行修饰)。
对于不改变对象状态的成员函数应该声明为常函数。

常类型:
  1 常对象:必须进行初始化,不能被更新。
const 类名 对象名
  2 常成员:用const进行修饰的类成员:常数据成员和常函数成员
  3 常引用:被引用的对象不能被更新。
const 类型说明符 &引用名
  4 常数组:数组元素不能被更新
类型说明符 const 数组名[大小]
  5 常指针:指向常量的指针

常对象例:

class A{
public:A(int i, int j){x = i; y = j;}
private:int x,y;
};
A const a(3,4);//a是常对象,不能被更新

 

常成员:用const修饰的对象成员
  1 常成员函数:使用const关键字说明的函数。
      常成员函数不更新对象的数据成员。
      const关键字可以被用于参与对重载函数的区分
      通过常对象只能调用它的常成员函数。
  2 常数据成员:使用const说明的数据成员。

//5-7 常成员函数举例
#include<iostream>
using namespace std;
class R{
public:R(int r1, int r2):r1(r1),r2(r2){}void print();void print() const;
private:int r1,r2;
};
void R::print(){cout << r1 << " : " << r2 << endl;
}
void R::print() const{//编译器会审查内部有没有改变数据cout << r1 << " : " << r2 << endl;
}
int main(){R a(5,4);a.print();//调用void print()const R b (20,39);b.print();//调用void print() constreturn 0;
}
//5-8 常数据成员举例
#include<iostream>
using namespace std;
class A{
public: A(int i);void print();
private:const int a;static const int b;//静态常数据成员
};
const int A::b = 10;
A::A(int i):a(i){}//常成员a只能在初始化列表中初始化,不能再函数体中赋值
void A::print(){cout << a << " : " << b << endl;
}
int main(){//建立对象a和b,并以100和0作为初值,分别调用构造函数,//通过构造函数的初始化例表给对象的场数据成员赋初值A a1(100), a2(0);a1.print();a2.print();return 0;
}

 

常引用:
  如果在声明引用时用const修饰,被声明的引用就是常引用。
  常引用所引用的对象不能被更新。
  如果用常引用做形参,便不会意外地发生对实参的更改。

//5-9常引用作形参
#include<iostream>
#include<cmath>
using namespace std;
class Point{
public:Point(int x = 0, int y = 0):x(x),y(y){}int getX(){return x;}int getY(){return y;}friend float dist(const Point &p1, const Point &p2);
private:int x,y;
};
float dist(const Point &p1, const Point &p2){double x = p1.x - p2.x;double y = p1.y - p2.y;return static_cast<float>(sqrt(x*x+y*y));
}
int main(){const Point myp1(1,1),myp2(4,5);cout << "The distance is: ";cout << dist(myp1,myp2) << endl;return 0;
}

 

转载于:https://www.cnblogs.com/leosirius/p/7967908.html

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

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

相关文章

webp转换gif_用 WebP 创建尺寸更小、细节更丰富的图片,以此来提高网站的速度...

WebP 文件格式是一种基于 RIFF(资源互换文件格式)的文档格式。WebP 是 2010 年 Google 开发的一种图片格式&#xff0c;它为网页上的图片提供了卓越的无损和有损压缩。网站开发者们可以使用 WebP 来创建尺寸更小、细节更丰富的图片&#xff0c;以此来提高网站的速度。更快的加载…

myeclipse java注释模板_Eclipse/MyEclipse Java注释模板设置详解 ---转载自百度空间

设置注释模板的入口&#xff1a; Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素啦。现就每一个元素逐一介绍&#xff1a;文件(Files)注释标签&#xff1a;/*** Title: ${file_name}* Package ${package_name…

php之快速入门学习-9(switch)

PHP Switch 语句 switch 语句用于根据多个不同条件执行不同动作。 PHP Switch 语句 如果您希望有选择地执行若干代码块之一&#xff0c;请使用 switch 语句。 <?php switch (n) { case label1:如果 nlabel1&#xff0c;此处代码将执行;break; case label2:如果 nlabel2&…

python 如何判断excel单元格为空_如何用python处理excel(二)

读取excelimport xlrdworkbookxlrd.open_workbook(rC:\Users\Desktop\hebing\学生登记表.xls)sheetworkbook.sheet_by_index(0)#根据序列号来打开某一个sheetrowsheet.nrows#将excel的行数赋值给变量colsheet.ncols#将excel的列数赋值给变量print(sheet.cell_value(1,0))#打印出…

mysql 事务 数量_MySQL 数据查询语言(DQL) 事务控制语言(TCL)详解

一、 数据查询语言(DQL)(重中之重)完整语法格式&#xff1a;select 表达式1|字段,....[from 表名 where 条件][group by 列名][having 条件][order by 列名 [asc|desc]][limit 位置,数量]<1> 普通查询select 查询表达式; // 最简单的sql语句&#xff0c;是一个函数select…

web前端到底是什么?有前途吗

web前端到底是什么&#xff1f; 某货&#xff1a; “前几年前端开发人员鱼目混杂&#xff0c;技术参差不齐&#xff0c;相对学习起来不规范&#xff0c;导致> 前端开发人员聚集&#xff0c;所以现在前端工种和工资还是没得到普遍重视&#xff0c;但近2年来&#xff0c;> …

此加载项为此计算机的所有用户安装_MDI Jade 6.5软件安装教程

软件下载▼关注微信公众号&#xff1a;贵州永航科技回复Jade即可获得软件安装包下载地址以及详细安装教程更多软件安装教程可点击菜单栏获取软件介绍MDI Jade是一款专门用于XRD分析的软件&#xff0c;XRD分析就是X射线衍射分析&#xff0c;MDI Jade通过对材料进行X射线衍射&…

java 线程定时器_Java线程之Timer定时器

定时/计划功能主要使用的就是Timer对象&#xff0c;它在内部还是使用多线程的方式进行处理&#xff0c;所以它和线程技术还是有非常大的关联。Timer类主要作用就是设置计划任务&#xff0c;但封装任务的类却是TimerTask类。TimerTask类是一个抽象类。执行任务的时间晚于当前时间…

博客已经迁移到 http://imbotao.top 也会同步到这儿

完全是看到别人搭建的 hexo github Pages 博客界面很好看&#xff0c;很简洁&#xff0c;自己也喜欢折腾&#xff0c;就鼓捣了一个。 也在阿里云买了自己的域名&#xff0c;个人感觉在博客的样式和功能上花费了太多的时间&#xff0c;不过现在终于搞的差不多了&#xff0c;以后…

vscode 写vue 没有js提示_如何用VSCode实现一个vue.js项目?

1,新建项目打开Visual studio code打开一个你想要创建项目的文件夹打开集成终端&#xff1a;查看 –> 集成终端 或者直接按 ctrl\ 如果没有安装vue-cli&#xff0c;在终端输入&#xff1a;npm install \-g vue-cli全局安装vue-cli然后新建项目vue init webpack projectNamep…

python有没有类似unity3d_像web一样使用python

使用传统的web开发技术,也就是htmljs,然后搭配一个后端语言,已经成为当今web开发的固定模式了,为此也形成了众多的toolkit,譬如ror,django,各种js图形库更是玲琅满目,从非常大程度上也加速了开发过程.但传统web应用也非常自然地有一些诟病,有些特殊效果,c端能够轻而易举地完毕,…

邓白氏编码查询_外贸人常用查询工具汇总

外贸工具类网站FOB价格计算器http://bbs.fobshanghai.com/fobprice.htmCIF价格计算器http://www.easiertrade.com/public/cif.html?_1487894720000海关原产地证真伪查询https://dwz.cn/f3O8YGK6出口退税查询https://dwz.cn/kGWsBclu国家已正式于2018年11月1日起调整产品的出口…

超简单的走马灯效果

虽然走马灯的效果看起来很简单&#xff0c;网上也有很多的教程能够直接copy&#xff0c;然而还是第一次研究这个的实现方法。 先把div给定义出来&#xff0c;写好布局。 <div class"wrapper"><div id"box"><div>slide1</div><d…

winscp

简介&#xff1a;是linux的一个连接工具 1.winscp的下载&#xff1a;就会自动下载的了 2.安装配置&#xff1a; https://jingyan.baidu.com/article/6525d4b15bae6fac7d2e94a0.html 3.生成密钥&#xff1a; https://jingyan.baidu.com/article/ed2a5d1f377ccb09f6be178b.html 4…

gitlab-ee使用mysql_在 GitLab 我们是如何扩展数据库的

很长时间以来 GitLab.com 使用了一个单个的 PostgreSQL 数据库服务器和一个用于灾难恢复的单个复制。在 GitLab.com 最初的几年&#xff0c;它工作的还是很好的&#xff0c;但是随着时间的推移&#xff0c;我们看到这种设置的很多问题&#xff0c;例如&#xff0c;数据库长久处…

哈希表数据结构_Java数据结构哈希表如何避免冲突

前言一、哈希表是what&#xff1f;这是百度上给出的回答&#xff1a;简而言之&#xff0c;为什么要有这种数据结构呢&#xff1f;因为我们想不经过任何比较&#xff0c;一次从表中得到想要搜索的元素。所以就构造出来了哈希表&#xff0c;通过某种函数(哈希函数)使元素的存储位…

Python 高级网络操作 - Python Advanced Network Operations

1 Python 高级网络操作 - Python Advanced Network Operations2 3 Half Open Socket,4 一个单向的 socket 被称为 half open socket, 即数据只能在一个方向上传输.5 Half Open Socket 是通过在 socket 对象上调用 shutdown() 方法得到.6 shutdown 接收一个 numeric…

java getattribute为空_Java TransMeta.getAttribute方法代码示例

import org.pentaho.di.trans.TransMeta; //导入方法依赖的package包/类Overridepublic void getData( TransMeta transMeta ) throws KettleException {try {String serviceName transMeta.getAttribute( StreamingConst.STREAMING_GROUP, StreamingConst.STREAMING_SERVICE_…

python summary writer_tensorflow中summary操作

tf中 tensorboard 工具通过读取在网络训练过程中保存到本地的日志文件实现数据可视化&#xff0c;日志数据保存主要用到 tf.summary 中的方法。tf.summary中summary是tf中的一个py文件&#xff0c;位置在 /tensorflow/python/summary/ 文件夹下&#xff0c;提供了像tf.summary.…

10 3 java_10.3 UiPath如何调用Java

调用Java方法(Invoke Java Method)的介绍从Java Scope中的.jar加载的方法中调用指定的Java方法。并结果存储在变量中二、Invoke Java Method 在UiPath中的使用打开设计器, 在设计库中新建一个Sequence&#xff0c;为序列命名及设置Sequence存放的路径, 在Activities中搜索Java …