友元是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

Part5 数据的共享与保护 5.4类的友元5.5共享数据的保护相关推荐

  1. 如何看待李开复演讲称早期帮旷视拿了蚂蚁金服大量人脸数据,以及李开复、蚂蚁和旷视的澄清?该如何保护隐私?...

    中生代技术 链接技术大咖,分享技术干货 接力技术,链接价值 IT之家报道:9月12日上午,李开复在 HICOOL 全球创业者峰会上表示,曾在早期帮助旷视科技公司找了包括美图和蚂蚁金服等合作伙伴,让他们 ...

  2. 达观数据中标大华智能搜索平台,助力企业打造知识共享系统

    近日,达观数据成功中标浙江大华技术股份有限公司(股票代码:002236)智能搜索项目,达观数据将基于自研智能搜索引擎,助力其构建知识共享管理平台,使运营管理更高效. 浙江大华技术股份有限公司是全球领先 ...

  3. pb数据窗口显示图片_中科院发布地球大数据共享服务平台 5PB数据现可共享

    图为数据共享服务系统的界面 中国科学院1月15日召开新闻发布会,对外发布其A类战略性先导科技专项"地球大数据科学工程"2018年度的重大成果--地球大数据共享服务平台. 记者从会上 ...

  4. excel连接没有自动计算机,共享的excel表格_为什么一台电脑总是没有数据_显示路径不对-在局域网上设置了EXCEL共享,为什么另一台电脑打开E......

    跪求高手解决!excel表格发到另外一台电脑打开数据... 估计表格里数据zd连接和引用的问题. 如果你通过数据表引用另外表格的数据,如你引用的表格没有同时发给同事,就可能出错. 估计你和同事用的软件 ...

  5. 数据爆发时代,英特尔携手腾讯构筑全面的数据长城

    作者 | 贾凯强 出品 | AI科技大本营(ID:rgznai100) 5G到来,边缘需求不断,IoT持续爆棚,数据在爆炸式增长. 在数据增长的过程中, 相应的其处理能力也需要增长,CPU等算力核心也 ...

  6. java单线程共享,「Java并发编程实战」之对象的共享

    前言 本系列博客是对<Java并发编程实战>的一点总结,本篇主要讲解以下几个内容,内容会比较枯燥.可能大家看标题不能能直观的感受出到底什么意思,这就是专业术语,哈哈,解释下,术语(term ...

  7. 共享单车显示不在服务器内,注意了,共享单车可不要随便骑,这七个规定先了解了再说...

    享单车已经渗透进了大多数人的生活 小白领通勤最后一公里骑着它 爷叔阿姨到菜场买菜骑着它 小情侣约会也骑着它 但是很多人也不堪其扰 因为在公共安全领域缺少约束力 乱停放的问题就不用说了 还有不少共享单车 ...

  8. oracle设置缓存大小设置多少,【数据库类※从V$DB_CACHE_ADVICE中设置数据缓冲大小※】...

    [数据库类※从V$DB_CACHE_ADVICE中设置数据缓冲大小※]     Oracle 9i引入了一个新的途径来预测数据缓冲cache中附加数据缓存的所带来的好处的多少.V$DB_CACHE_A ...

  9. jdbc 3种获得mysql插入数据的自增字段值的方法_【JDBC】向数据表插入数据时,自动获取生成的主键...

    数据表设计时,一般都会有一个主键(Key)(自己指定),有时也可以使用联合主键: 有许多数据库提供了隐藏列为表中的每行记录分配一个唯一键值(如:rowid): 当我们没有指定哪一列作为主键key时,数 ...

最新文章

  1. java6特性_Java6的新特性
  2. 二叉树中序遍历-递归与非递归
  3. MySQL 5.1.40新特性及下载
  4. C++ vector 容器浅析
  5. hibernate 模糊查询及not in子查询
  6. mysql 权限 机器_msyql 权限配置 (mysql 其他机器连不上 )
  7. CSS使表格不变形(原创)
  8. SpanBERT: 抽取式问答的利器
  9. 什么是分贝?如何计算声音分贝?一文解析Audition计算方法
  10. 关于java Stream流将list集合分组之后与原list的集合的顺序不一致的问题
  11. K13318 破译信息
  12. Mongodb stop: Unknown instance报错
  13. 嵌入式第四课(继续SPI之路)
  14. Debian11系统安装
  15. 推荐 6 个前后端分离项目
  16. 《Adobe Fireworks CS6中文版经典教程》——第1课 了解工作区1.1熟悉Adobe Fireworks...
  17. 统计找出一千万以内,一共有多少质数?(优化过程,效率更快)
  18. jzoj4210. 我才不是萝莉控呢(B组——Day4)
  19. 分享3款好用的图片工具,你们快来收藏
  20. 中国大学MOOC第10周编程题在线测试

热门文章

  1. 风变编程python论文_如何看待风变编程的 Python 网课?
  2. SQL分页查询的介绍以及好处~~
  3. e2140服务器性能,4000 还是E2140?两大人气CPU对决
  4. creo外观库_Proe软件技巧,颜色库下载及其使用方法揭晓
  5. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。
  6. react全局方法_前端面试题 ---react
  7. php写不了php,php写入内存不足怎么办
  8. C++ 异常类型以及多级catch匹配
  9. 网际风全推数据接口_智能风控系统设计与实践
  10. 如何删除Win All的流氓程序文件