在 c++++ 中,友元函数与访问控制可能会冲突。要访问私有成员,可以将成员声明为受保护或使用代理函数。例如,student 类有私有成员 name 和 score,友元函数 printname 和 printscore 可分别打印这些成员。

C++ 友元函数与访问控制的冲突
在 C++ 中,友元函数是可以访问类私有成员的非成员函数。但是,当涉及到访问控制时,友元函数可能会遇到与类成员访问控制的冲突。
访问控制
立即学习“C++免费学习笔记(深入)”;
C++ 提供了三种访问控制级别:
友元函数
友元函数是通过 friend 关键字声明的。友元函数可以访问类的所有成员,无论访问控制级别如何。但是,友元函数不会成为类的一部分。
访问控制冲突
当友元函数试图访问私有成员时,就会发生访问控制冲突。例如:
class MyClass {
private:
int x;
friend void printX(MyClass& obj) {
std::cout << obj.x << std::endl;
}
};在这个例子中,printX 函数是类的友元,但它试图访问私有成员 x。这会导致编译器错误。
解决冲突
要解决访问控制冲突,可以使用以下方法:
1. 使用保护成员
将私有成员声明为受保护成员。这允许派生类和友元函数访问该成员。
class MyClass {
protected:
int x;
friend void printX(MyClass& obj) {
std::cout << obj.x << std::endl;
}
};2. 使用代理函数
创建另一个类成员函数作为私有成员的代理。这个代理函数可以公开访问,供友元函数使用。
class MyClass {
private:
int x;
public:
int getX() const { return x; }
friend void printX(MyClass& obj) {
std::cout << obj.getX() << std::endl;
}
};实战案例
在以下实际案例中,我们有一个 Student 类,它有 name 和 score两个私有成员。我们想要创建两个友元函数 printName() 和 printScore(),用来分别打印这些私有成员。
class Student {
private:
std::string name;
int score;
friend void printName(Student& obj) {
std::cout << "Name: " << obj.name << std::endl;
}
friend void printScore(Student& obj) {
std::cout << "Score: " << obj.score << std::endl;
}
};使用友元函数,我们可以轻松地打印学生的姓名和成绩,即使它们是私有成员。
int main() {
Student student;
student.name = "John Doe";
student.score = 95;
printName(student);
printScore(student);
return 0;
}输出:
Name: John Doe Score: 95
以上就是C++ 友元函数与访问控制的冲突的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号