【C++基础】类和对象——友元
友元的概念
在C++中,不能被外部访问的私有属性,通过友元可以访问。
友元的关键字:friend
友元的三种实现
- 全局函数做友元
- 类做友元
- 成员函数做友元
一、全局函数做友元
函数名复制到类内,并在开头加上friend关键字;
示例:
#include<iostream>
using namespace std;
class Student
{
//友元可以访问私有(private)内容
friend void showStudent(Student* s);
public:
string name;
int age;
Student()
{
name = "张三";
age = 10;
gender = "彩虹小马";
}
private:
string gender;
};
void showStudent(Student* s)
{
cout << "看看你的性别:" << s->gender;
}
void main()
{
Student s;
showStudent(&s);
}
输出:
二、类做友元
Teacher类
是Student类
的友元。
那个在Teacher类
内可以访问到Student类
内的私有属性。
但创建的Teacher对象
不能访问到Student类
内的私有属性。
示例:
#include<iostream>
using namespace std;
class Teacher;
class Student
{
//友元可以访问私有(private)内容
friend class Teacher;
public:
string name;
int age;
Student();
private:
string gender;
};
//类外实现
Student::Student()
{
name = "张三";
age = 10;
gender = "彩虹小马";
}
class Teacher
{
public:
string name;
void visit()
{
cout << "看看性别:" << s->gender << endl;
}
Teacher()
{
s = new Student;
}
private:
Student* s;
};
void main()
{
Teacher t;
t.visit();
//t.s.gender; 不能访问
}
输出:
三、成员函数做友元
这个友元就是在套娃,简单说就是先声明,声明的东西拿来做友元,最后再实现。先看示例,看完在分析。
友元成员函数和构造函数需要外部实现,不然会报未定义错误。
示例:
#include<iostream>
using namespace std;
class Student;
class Teacher
{
public:
string name;
//visit函数做友元
void visit();
Teacher();
private:
Student* s;
};
class Student
{
//友元可以访问私有(private)内容
friend void Teacher::visit();
public:
string name;
Student()
{
name = "张三";
gender = "彩虹小马";
}
private:
string gender;
};
Teacher::Teacher()
{
s = new Student;
}
void Teacher::visit()
{
cout << "visit看看性别:" << s->gender << endl;
}
void main()
{
Teacher t;
t.visit();
输出:
成员函数友元的声明实现:
声明:类B
类A
{
public:
声明:函数a
声明:构造函数A
private
创建对象B
}
类B
{
友元 返回值 类A::函数a
public:
构造函数B
private:
属性b
}
实现:构造函数A
{
对象B = new 类B
}
实现:函数a
{
访问属性b
}
注意事项:
- 友元的实现
- 构造函数的实现
- 提供私有属性的类B
声明类B
实现类B
是不是先讲类的声明和实现,再讲友元的声明和实现会好理解点?