C++友元——friend

目录

1.友元函数(全局函数做友元)

 2.友元哈函数(类的成员函数做友元)

3.友元类


友元的两种使用形式

        友元函数、友元类。

1.友元函数(全局函数做友元)

#include<iostream>
#include<string>
#include<sstream>
using namespace std;

class Computer {
    //全局函数做友元,可以放在类内任意位置
	friend void Upgrade(Computer* compt);   
public:
	Computer() {
		this->cpu = "i7";
	}
	string DescriPtion() {
		stringstream ret;
		ret << "CPU:" << this->cpu;
		return ret.str();
	}
private:
	string cpu;
};

//友元函数
void Upgrade(Computer *compt) {
	compt->cpu = "i9";
}

int main() {
	Computer compt;
	cout << compt.DescriPtion() << endl;
	Upgrade(&compt);
	cout << compt.DescriPtion() << endl;
	system("pause");
	return 0;
}

 2.友元哈函数(类的成员函数做友元)

将类B的成员函数做类A的友元

A.h

#pragma once
//因为要识别类B作用域下的函数,所有要添加头文件
#include"B.h"  


class A {
public:
	A();
	int GetNumber();
    //类的成员函数做友元
	friend void B::numDouble(A* a);    
private:
	int temp;
};

A.cpp

#include "A.h"
A::A() {
	this->temp = 10;
}
int  A::GetNumber() {
	return this->temp;
}

B.h

#pragma once

class A;   //函数声明中仅识别类A就行
 
class B {
public:
	void numDouble(A* a);
};

B.cpp

#include"B.h"
//要识别类A的实列对象中的成员,所有要添加头文件
#include"A.h"      

void B::numDouble(A* a) {
	a->temp *= 2;    
}

main.cpp

#include <stdio.h>
#include <iostream>
#include <Windows.h>

#include "A.h"
#include "B.h"
using namespace std;

int main(void) {
	A a;
	B b;

	cout << a.GetNumber() << endl;
	b.numDouble(&a);
	cout << a.GetNumber ()<< endl;

	system("pause");
	return 0;
}

运行结果:

3.友元类

友元类的作用:把A类作为B类的友元类,那么A类的所有成员函数,就可以直接访问【使用】B类的私有成员。即友元类可以直接访问对应类的所有成员。

A.h

#pragma once

//声明一下类
class B;
class A {
public:
	A();
	int GetNumber();
	friend B;
private:
	int temp;
};

A.cpp

#include "A.h"
A::A() {
	this->temp = 10;
}
int  A::GetNumber() {
	return this->temp;
}

B.h

#pragma once

class A;   //函数声明中仅识别类A就行
 
class B {
public:
	void numDouble(A* a);
};

B.cpp

#include"B.h"
#include"A.h"      //要识别类A的实列对象中的成员,所有要添加头文件

void B::numDouble(A* a) {
	a->temp *= 2;    
}

main.cpp

#include <stdio.h>
#include <iostream>
#include <Windows.h>

#include "A.h"
#include "B.h"
using namespace std;

int main(void) {
	A a;
	B b;

	cout << a.GetNumber() << endl;
	b.numDouble(&a);
	cout << a.GetNumber ()<< endl;

	system("pause");
	return 0;
}

运行结果:

 友元类,和友元函数,使用friend关键字进行声明即可,与访问权限无关,

所以,可以放在private/pulic/protected任意区域内。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值