c++ 基础知识-类和对象-友元

c++ 基础知识-类和对象-友元

1.全局函数做友元

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

class Person
{
	//利用friend修饰函数构造友元函数,可以访问类内私有成员 
	friend void test(Person * p);
public:
	void fun()
	{
		m_age = 25;
		m_ID = 123;
		cout<<"fun()"<<endl;
	}
	int  m_ID;
private:
	int  m_age;	
};

void test(Person * p)
{
	cout<<p->m_ID<<endl;
	cout<<p->m_age<<endl;//error C2248: “Person::m_age”: 无法访问 private 成员(在“Person”类中声明)
	cout<<"test()"<<endl;
}

int main()
{
	Person  p;
    p.fun();
	test(&p);
	return 0;
}  

2.友元类

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

class Person
{
	//声明友元
	friend class Student;

public:
	//构造函数
	Person();
	//析构函数
	~Person();
public:
	int m_age;

private:
	int m_ID;
};

Person::Person()
{
	this->m_age = 1;//有无this都可以
	this->m_ID = 123456;//有无this都可以
}

Person::~Person()
{
	cout<<"Person() : 析构函数"<<endl;
}
class Student
{
	//friend class Person;
public:
	//构造函数
	Student();
	~Student();
	void visit();

private:
	Person * person;
};

Student::Student()
{
	person = new Person;//
	
}

Student::~Student()
{
	cout<<"Student() : 析构函数"<<endl;
	delete person;//释放
}

void Student::visit()
{
	cout<<person->m_age<<endl;
	cout<<person->m_ID<<endl;//error C2248: “Person::m_ID”: 无法访问 private 成员(在“Person”类中声明)   在Person中声明友元后可以访问
}

//调用
void fun()
{
	//Person p;
	Student s;
	s.visit();
}

int main()
{
	//特别注意这种调用方式,类和调用都写在main函数外面,main内部只写一些简单的
	fun();
	return 0;
}  

3.成员函数做友元

注意访问顺序
#include <iostream>  
#include <string>  
using namespace std;

class Person;//注意先声明Person

class Student
{
	//friend class Person;
public:
	//构造函数
	Student();
	~Student();
	void visit();

private:
	Person * person;
};

class Person
{
	//声明友元类
	//friend class Student;
	friend void Student::visit();

public:
	//构造函数
	Person();
	~Person();
public:
	int m_age;

private:
	int m_ID;
};

Person::Person()
{
	this->m_age = 1;
	this->m_ID = 123456;
}
Person::~Person()
{
	cout<<"Person() : 析构函数"<<endl;
}

Student::Student()//注意位置
{
	person = new Person;//
}

Student::~Student()
{
	cout<<"Student() : 析构函数"<<endl;
	delete person;
}

void Student::visit()
{
	cout<<person->m_age<<endl;
	cout<<person->m_ID<<endl;//error C2248: “Person::m_ID”: 无法访问 private 成员(在“Person”类中声明)   在Person中声明友元后可以访问
}

//调用
void fun()
{
	//Person p;
	Student s;
	s.visit();
}

int main()
{
	//特别注意这种调用方式,类和调用都写在main函数外面,main内部只写一些简单的
	fun();
	return 0;
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值