在 c++++ 中,友元函数与访问控制可能会冲突。要访问私有成员,可以将成员声明为受保护或使用代理函数。例如,student 类有私有成员 name 和 score,友元函数 printname 和 printscore 可分别打印这些成员。
C++ 友元函数与访问控制的冲突
在 C++ 中,友元函数是可以访问类私有成员的非成员函数。但是,当涉及到访问控制时,友元函数可能会遇到与类成员访问控制的冲突。
访问控制
C++ 提供了三种访问控制级别:
- public: 可从类的任何地方访问。
- protected: 只能从类及其派生类中访问。
- private: 只能从类内部访问。
友元函数
友元函数是通过 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++ 友元函数与访问控制的冲突的详细内容,更多请关注编程网其它相关文章!