面试题答案
一键面试1. 友元函数和友元类打破封装性的原理
- 封装性是指将数据和操作数据的方法绑定在一起,并隐藏对象的内部实现细节,只对外提供有限的接口。
- 友元函数和友元类打破封装性在于它们能够访问类的私有和保护成员,而这些成员通常是类的内部实现细节,对外是隐藏的。通过授予友元这种特殊的访问权限,使得外部函数或类可以绕过类的访问控制机制直接访问这些私有和保护成员,从而打破了封装。
2. 友元函数定义方式及对访问权限的改变
友元函数是在类定义中使用 friend
关键字声明的非成员函数,它可以访问该类的私有和保护成员。
#include <iostream>
class MyClass {
private:
int privateData;
public:
MyClass(int data) : privateData(data) {}
// 声明友元函数
friend void printPrivateData(MyClass obj);
};
// 友元函数的定义
void printPrivateData(MyClass obj) {
std::cout << "Private data: " << obj.privateData << std::endl;
}
int main() {
MyClass myObj(10);
printPrivateData(myObj);
return 0;
}
在上述代码中,printPrivateData
函数被声明为 MyClass
的友元函数,因此它可以直接访问 MyClass
的私有成员 privateData
。
3. 友元类定义方式及对访问权限的改变
友元类是在一个类中使用 friend
关键字声明另一个类,声明为友元类的所有成员函数都可以访问该类的私有和保护成员。
#include <iostream>
class FriendClass; // 前向声明
class MyClass {
private:
int privateData;
public:
MyClass(int data) : privateData(data) {}
// 声明友元类
friend class FriendClass;
};
class FriendClass {
public:
void accessPrivateData(MyClass obj) {
std::cout << "Private data from FriendClass: " << obj.privateData << std::endl;
}
};
int main() {
MyClass myObj(20);
FriendClass friendObj;
friendObj.accessPrivateData(myObj);
return 0;
}
在上述代码中,FriendClass
被声明为 MyClass
的友元类,所以 FriendClass
的成员函数 accessPrivateData
可以访问 MyClass
的私有成员 privateData
。