所有读过的人都
我从教科书中自学C ++:
教科书中的一个问题要求我将一个函数作为一个类的朋友,因此友元函数可以访问所有类成员;这很好,我可以做到这一点。 问题是,问题继续要求朋友函数只能读取类成员(私有成员)但不写信给他们!
**请注意:我在'stackoverflow'上查看了类似的问题/答案 - 但我找不到我想要的相关简单的直接答案。
以下是我的一些相关代码,我们将不胜感激任何帮助:
非常感谢提前
#include <iostream>
#include <cstdio>
using namespace std;
class classroom{
private:
char name[25];
int student_id;
float grades[10];
float average;
int num_tests;
float letter_grade;
static int last_student_id;
public:
void enter_name_id(void);
void enter_grade(void);
void average_grades(void);
void letter_grades(void);
void output_name_id_grade(void);
void last_id(void);
classroom();
friend void readers(classroom&);
};
int classroom::last_student_id=1;
void readers(classroom& lee){
cout<<"\n number tests: "<<lee.num_tests;//friend function is reading class member -This is O.K!
lee.num_tests=15;//friend function is writing to class member - We don't want this to be allowed
cout<<"\n number tests: "<<lee.num_tests;//Used to test that class members are NOT accessed!
}
在主程序中我们有:
int main()
{
classroom students[10];
readers(students[0]);
//and so on...
答案 0 :(得分:5)
一个“类的朋友”的函数,允许对其“私有成员”进行“读访问”,但不能“写访问”?
一旦将函数声明为友元函数,访问说明符规则就会关闭,但您可以通过将const对象传递给友元函数来阻止写入成员。
friend void readers(const classroom&);
^^^^^
请注意access specifiers
和const
是两个不同的属性,不要混用它们。
请注意,您的友元函数仍然可以尝试通过使用constness
丢弃对象的const_cast
来修改对象,但这将导致根据标准的未定义行为。
答案 1 :(得分:1)
您需要阅读“const-ness”,包括常量变量,参数和成员函数。
具体来说,您可以指定friend函数将其参数作为 const 引用接收。它只能读取私有变量并调用const函数。
// ...
friend void readers(classroom const &);
// ...
void readers(classroom const &lee) {
// ...
}