友元函数
友元函数不是类的内部函数,是一个全局函数,但是可以改变类的私有属性
友元函破坏了类的封装性
友元函数没有this指针,因为它是全局函数不在类内部,只是要在类的内部声明。
友元类
若B类是A类的友员类,则B类的所有成员函数都是A类的友员函数
友员类通常设计为一种对数据操作或类之间传递消息的辅助类
#include <iostream>
using namespace std;
class Address;
class Student
{
// 友元函数: 可以让全局函数操作类的私有成员变量
// 友元函数声明:在函数原型前加 friend 关键字
// printS 是 该类的友元函数,可以使用该类的任何(包括私有)成员变量和成员函数
// 友元函数不是类的内部函数 是一个全局函数(外部函数)
// 友元函数的声明可以放在类的任意位置, public、private、protected 对 friend声明无效
// 友元函数破坏了类的封装性,友元函数能不用就不要用
friend void printS(Student &s);
private:
Student(const Student &obj);
public:
Student (int a, char *name)
{
this->age = a;
this->name = name;
}
void printS()
{
printf ("age = %d, name = %s\n", age, name);
}
void printAddess(Address *addr);
private:
int age;
char *name;
};
// 全局函数
void printS(Student &s)
{
printf ("age = %d, name = %s\n", s.age, s.name);
}
class Address
{
// A 类如果是 B 类的友元类,则 A 类的所有成员函数都是 B 类的友元函数
friend Student;
public:
Address(char *s, char *c, char *x):shen(s), city(c), xian(x)
{
}
private:
char *shen;
char *city;
char *xian;
};
void Student::printAddess(Address *addr)
{
printf("省: %s, 市:%s, 县:%s\n", addr->shen, addr->city, addr->xian);
}
int main2_1()
{
Student s(10, "小明");
printS(s);
Address *addr = new Address("江苏", "南京", "江宁");
// Address addr ("江苏", "南京", "江宁");
s.printAddess(addr);
delete addr;
return 0;
}
执行结果:
age = 10,name = 小明
省 : 江苏 市 : 南京 县 : 江宁