把代码都放最后吧
友元函数的作用:
可以访问该类的私有属性
但在类的外面定义的时候没有”类::“
所以该友元函数不属于该类
友元函数的意义:
C++友元函数_Bussy的博客-CSDN博客_c++友元函数 csdn
1、友元存在的意义
为什么要有友元函数?友元的存在可以共享数据资源,减小系统的调用开销,提升运行效率。funA想访问B类中的私有成员函数,只需要在B类的声明中加个friend returntype funA(T t);即可。其中friend是友元函数的标识,告诉编译器这是友元函数,不具备this指针,但是它能访问B类的私有成员函数,returntype 函数返回类型, T入参类型,t实参。
2、友元的优点以及缺点:
优点:提升编程效率,提升运行效率,并且表达清晰简单
缺点:破坏了封装机制,所以尽量不使用友元。
友元类的作用:
可以让友访问自身的私有属性
#pragma once的作用
1.#pragmaonce这个宏有什么作用?
为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。
在能够支持这两种方式的编译器上,二者并没有太大的区别。但两者仍然有一些细微的区别。
#pragma once用法总结_程序猿老樊的博客-CSDN博客_#pragma once
大家可以试着看一下我的代码
可以删一删#pragma once
friend class A
之类的看看删了哪里报错
出错的内容自己看一下怎么解决
这个字要打的话太多了
第一个
friend.cpp
第二个
friendA.h
第三个
friendB.h
#include <iostream>
#include "friendA.h"
#include "friendB.h"
using namespace std;
int main()
{
A a(2,3,4);
B b(4,5,6);
cout<<ave(a)<<endl;//不是a.ave(a),这是友元函数
cout<<a.aveB(b)<<endl;
return 0;
}
#pragma once
#include <iostream>
#include "friendB.h"
using namespace std;
class A{
private:
int score1;
int score2;
public:
int score3;
friend int ave(A); //注意括号里面是类,跟函数指针的定义有点像
//友元函数可以访问私有属性
// friend void set();
//对成员进行赋值
//我可以用构造函数
//那从功能上讲,可不可以用友元函数
//友元函数不是类的方法(不能写::)
//那么就不能访问类的对象的私有属性了
//所以就需要在友元函数里面用一个可以访问类的对象的私有属性的类的方法了
//所以比较麻烦
//所以我就用构造函数了
A(int a,int b,int c);
int aveB(B b);
//这个不是友元函数,就是一个普通的类的方法
};
int ave(A a)
{
//能访问私有属性
return (a.score1+a.score2+a.score3)/3;
//发现这样写是不是没什么特别的
}
int A::aveB(B b)
{
//能访问私有属性
return (b.score11+b.score22+b.score33)/3;
//发现这样写是不是没什么特别的
}
// void set(A a)
// {
// // cin>>a.score1;//外部函数不能访问私有属性
// // cin>>a.score2;
// //所以这种方法不行
// //所以我要全都注释掉
// //哈哈哈哈
// return;
// }
A::A(int a,int b,int c)
{
score1 = a;
score2 = b;
score3 = c;
}
#pragma once
#include <iostream>
#include "friendA.h"
using namespace std;
class B{
private:
int score11;
int score22;
public:
int score33;
B(int a,int b,int c);
friend class A;
//用一个比较理想的现实举例子
//如果我认同了你作为我的朋友,那么我会允许你用一些我的物品
//比如笔,橡皮之类的(代指成员变量)(没有函数(类似的叫做友元函数))
//但我不能随便用你的东西,因为你还没有认同我作为你的朋友
};
B::B(int a,int b,int c)
{
score11 = a;
score22 = b;
score33 = c;
}