友元 friend
友元的目的:让一个函数或一个类可以 访问另一个类中的 私有成员
友元的三种实现方式:
- 全局函数做友元
- 类做友元
- 成员函数做友元
1、全局函数做友元
class Building //房屋类
{
//声明 GoodGay()是 Building的 VIP,可以访问Building的私有属性(成员)
friend void GoodGay(Building& B);
public:
string b_SittingRoom; //客厅
private:
string b_BedRoom; //卧室
public:
Building()
{
b_SittingRoom = "客厅";
b_BedRoom = "卧室";
}
};
//全局函数
void GoodGay(Building &B)
{
cout << "好基友全局函数正在访问:" << B.b_SittingRoom << endl;
cout << "好基友全局函数正在访问:" << B.b_BedRoom << endl;
}
void test24()
{
Building b1;
GoodGay(b1);
}
int main30()
{
test24();
system("pause");
return 0;
}
2、类做友元
class Building1;
class GoodGay1
{
public:
Building1* building;
void visit(); //参观函数,访问Building1中的属性
GoodGay1();
};
class Building1
{
//声明 GoodGay1类是 Building1的 VIP,可以访问Building1的私有属性(成员)
friend class GoodGay1;
public:
string b_SittingRoom; //客厅
private:
string b_BedRoom; //卧室
public:
Building1();
};
//类外写成员函数
Building1::Building1()
{
b_SittingRoom = "客厅";
b_BedRoom = "卧室";
}
GoodGay1::GoodGay1()
{
building = new Building1;//创建建筑物对象
}
void GoodGay1::visit()
{
cout << "好基友类正在访问:" << building->b_SittingRoom << endl;
cout << "好基友类正在访问:" << building->b_BedRoom<< endl;
}
void test25()
{
GoodGay1 g;
g.visit();
}
int main31()
{
test25();
system("pause");
return 0;
}
3、成员函数做友元
例一(会报错)
class GoodGay2;
class Building2
{
friend void GoodGay2::visit1();
public:
string SittingRoom; //客厅
private:
string BedRoom; //卧室
public:
Building2()
{
SittingRoom = "客厅";
BedRoom = "卧室";
}
};
class GoodGay2
{
private:
Building2* building;
public:
GoodGay2()
{
building = new Building2;
}
void visit1() //使其 可以访问Building2类中的私有成员
{
cout << "visit1 正在访问:" << building->SittingRoom << endl;
cout << "visit1 正在访问:" << building->BedRoom << endl;
}
void visit2() //使其不可以访问Building2类中的私有成员
{
cout << "visit1 正在访问:" << building->SittingRoom << endl;
//cout << "visit1 正在访问:" << building->BedRoom << endl;
}
};
void test26()
{
GoodGay2 g1;
g1.visit1();
g1.visit2();
}
int main32()
{
test26();
system("pause");
return 0;
}
例二(没有问题)
class Building2;
class GoodGay2
{
private:
Building2* building;
public:
GoodGay2();
void visit1();//使其 可以访问Building2类中的私有成员
void visit2();//使其不可以访问Building2类中的私有成员
};
class Building2
{
friend void GoodGay2::visit1();
public:
string SittingRoom; //客厅
private:
string BedRoom; //卧室
public:
Building2()
{
SittingRoom = "客厅";
BedRoom = "卧室";
}
};
void GoodGay2::visit1()//使其 可以访问Building2类中的私有成员
{
cout << "visit1 正在访问:" << building->SittingRoom << endl;
cout << "visit1 正在访问:" << building->BedRoom << endl;
}
void GoodGay2::visit2()//使其不可以访问Building2类中的私有成员
{
cout << "visit1 正在访问:" << building->SittingRoom << endl;
//cout << "visit1 正在访问:" << building->BedRoom << endl;
}
GoodGay2::GoodGay2()
{
building = new Building2;
}
void test26()
{
GoodGay2 g1;
g1.visit1();
g1.visit2();
}
int main32()
{
test26();
system("pause");
return 0;
}
问题:两种类的声明方式,为什么一种可以跑通,另一种却会报错?编译器逐行读代码的原因????????????(求指导)
我的老师给出如下解答:
“前向声明(forward declaration),在声明之后、定义之前,声明的类是一个不完全类型(incomplete type),即已知是一个类型,但是不知道包含哪些成员”。“不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能使用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。”
(哔哩哔 哩黑马程序员 C++教程 学习笔记,如有侵权请联系删除)