面试题答案
一键面试-
友元函数声明位置:
- 友元函数可以在类定义内部声明。它不属于类的成员函数,声明时不需要加上
class
关键字限定其作用域。通常放在类定义的开头或结尾位置都可以,但为了代码的可读性,常放在类定义的开头部分。
- 友元函数可以在类定义内部声明。它不属于类的成员函数,声明时不需要加上
-
访问权限特点:
- 友元函数打破了类的封装性。虽然类的私有成员和保护成员对于类外部的代码是不可访问的,但友元函数作为类的 “朋友”,可以访问该类的私有成员和保护成员。
- 友元关系是单向的。即如果类
A
将函数func
声明为友元,那么func
可以访问A
的私有和保护成员,但这并不意味着类A
可以访问func
所在作用域中的私有元素(如果func
是某个类的成员函数,A
也不能直接访问该类的私有成员)。 - 友元关系不能传递。若类
A
是类B
的友元,类B
是类C
的友元,这并不意味着类A
是类C
的友元。
-
举例说明:
#include <iostream>
class Rectangle {
private:
int width;
int height;
public:
Rectangle(int w, int h) : width(w), height(h) {}
// 声明友元函数
friend int calculateArea(Rectangle rect);
};
// 定义友元函数
int calculateArea(Rectangle rect) {
return rect.width * rect.height;
}
int main() {
Rectangle rect(5, 3);
std::cout << "The area of the rectangle is: " << calculateArea(rect) << std::endl;
return 0;
}
在上述代码中,calculateArea
函数被声明为 Rectangle
类的友元函数,因此它可以访问 Rectangle
类的私有成员 width
和 height
来计算矩形的面积。在 main
函数中创建了 Rectangle
对象并调用 calculateArea
函数来计算并输出矩形的面积。