c++第三次作业:类的友元
C++第三次作业:类的友元
1、友元的关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通俗的说友元关系就是一个类主动声明其他函数是他的朋友,可以使其获得特殊访问权利。
2、在友元函数中,是在类中用关键词friend修饰的非成员函数。虽然它不是本类的成员函数,但是在它的函数体可以通过对象名访问类的私有和保护成员。
如下面一段代码求利润:
#include"oo.h"
using namespace std;
class A {
public:
A(int x = , int y = ) :price(x), cost(y) {};
friend int profit(A& a);
private:
int price, cost;
};
int profit(A& a) {
return (a.price-a.cost);
}
int main() {
A pa(, );
cout << "Profit is:";
cout << profit(pa) << endl;
return ;
}
在类A中声明了其友元函数,还是非成员函数,这样就可以访问类A中的私有成员:原价及成本,将其相减就可以得出利润。其运行结果如下:

若不声明友元函数,则其非成员函数就不能访问类A的私有成员,也就是去了friend这个关键词,代码运行就会出错。
3、同友元函数一样,一个类可以将另一个类声明为友元类。若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有成员和保护成员。
如下代码:
class A {
public:
A(int x = , int y = ) :price(x), cost(y) {};
int getp() { return price; }
int getc() { return cost; }
friend class B;
private:
int price, cost;
};
class B {
public:
void show();
private:
A a;
};
void B::show() {
cout << "price is:" << a.getp()<< endl;
cout << "cost is:" << a.getc() << endl;
}
int main() {
B mb;
mb.show();
return ;
}
友元需要注意的:
1、友元的关系是不能传递的;
2、友元关系是单向的;
3、友元关系是不被继承的。
c++第三次作业:类的友元的更多相关文章
- OO前三次作业总结
一.第一次作业 1.程序设计分析  图1 第一次作业类图 . ...
- C++第三次作业:友元类
友元类 将数据与处理数据的函数封装在一起,构成类,即实现了数据的共享又实现了隐藏,无疑是面向程序设计的一大优点,但是封装并不总是完美的,一旦需要涉及到一个类的两个对象的数据处理问题该怎么办?无论是设计 ...
- C++模板类内友元(友元函数,友元类)声明的三种情况
根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{ void bar(); ...
- 第三次作业:caculator
第三次作业 作业链接 ********* 遇到的问题: Scan类: 队列的使用方法不了解,上网查询并自己练习了一下才初步了解,才运用到作业 . 判断数字用的 if (input[i] >= ' ...
- 第三次作业——《K米评测》
第三次作业--<K米评测> 一.调研.评测 上手体验 APP的图标做的不错,一眼就知道和KTV唱歌相关的 点进去就是连接包箱的界面和直播界面,把软件最重要的两个功能展示出来了,一目了然 热 ...
- 软件工程(QLGY2015)第三次作业点评(含成绩)
相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 团队信息 本页点评团队1-22,其他组见:http://www.cnblogs.com/xiaozhi_5638/p/4490764.h ...
- 第三次作业随笔(new)包含了补作业
第三次作业的题目:http://www.cnblogs.com/fzuoop/p/5187275.html 第一次看到题目的时候觉得应该是挺简单的,只要把输入的那一串东西挨个判断,用数列的方法,如果碰 ...
- C++中模板类使用友元模板函数
在类模板中可以出现三种友元声明:(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数.(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权.(3)只授予对类模板或函数模板的特定 ...
随机推荐
- SSM项目模板
项目一:恒德物流平台(SSM) ◎开发周期:3个月 开发模式:团队4个人 ◎开发环境:jdk1.8.tomcat8.5 开发工具:IDE ...
- C#中Math方法总结
名称 说明 E 表示自然对数的底,它由常数 e 指定. PI 表示圆的周长与其直径的比值,它通过常数 π 指定. Abs 已重载.返回指定数字的绝对值. Acos ...
- 【VS开发】单文档中往视图中加入控件
[VS开发]单文档中往视图中加入控件 标签(空格分隔): [VS开发] 分隔视图的但文档窗口,要显示控件,推荐使用CFormView或者CCtrlView,前者和对话框的做法一致. 在MainFram ...
- ZOJ Problem Set - 1007
1.参考这个吧,一道数学公式题,还没看懂...好像需要把公式变形出来,先略过. http://dengbaoleng.iteye.com/blog/1504940
- A Mixed Flash Translation Layer Structure for SLC-MLC Combined Flash Memory System
http://blog.sina.com.cn/s/blog_502c8cc40100pztk.html 摘要 1.In this paper, we propose the SLC-MLC mixe ...
- 记录解决一个项目中遇到的maven打包问题
拿到同时给的代码,进行打jar包,这个jar包依赖一个第三方的jar包,一开始用IDEA打出来的包,没有把依赖的包打进去,后来查了相关的资料, 发现需要在maven的pom中添加相关的maven插件, ...
- Linux第三阶段题型测试
1.如何取得/etiantian文件的权限对应的数字内容,如-rw-r--r--为644,要求使用命令取得644或0644这样的数字. 解答: 1)最土的方法:ls -l /etiantian |cu ...
- Redis(1.2)Redis的数据结构与基本操作
Redis的数据结构,其本身大方向是键值对 [0]大概特点 相关产品:Redis.Riak.SimpleDB.Chordless.Scalaris.Memcached 形式:Key 指向 Value ...
- .NET 表达式计算:Expression Evaluator
Expression Evaluator 是一个轻量级的可以在运行时解析C#表达式的开源免费组件.表达式求值应该在很多地方使用,例如一些工资或者成本核算系统,就需要在后台动态配置计算表达式,从而进行计 ...
- 跨域以及WebService对跨域的支持
无耻收藏该博主的成果啦!https://www.cnblogs.com/yangecnu/p/introduce-cross-domain.html 通过域验证访问WebService:https:/ ...