一个“类的朋友”的功能,允许对其“私人成员”进行“读访问”,但不允许“写访问”?

时间:2011-11-15 18:56:04

标签: c++ class function friend restrictions

所有读过的人都

我从教科书中自学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...

2 个答案:

答案 0 :(得分:5)

  

一个“类的朋友”的函数,允许对其“私有成员”进行“读访问”,但不能“写访问”?

一旦将函数声明为友元函数,访问说明符规则就会关闭,但您可以通过将const对象传递给友元函数来阻止写入成员。

friend void readers(const classroom&);
                    ^^^^^

请注意access specifiersconst是两个不同的属性,不要混用它们。

请注意,您的友元函数仍然可以尝试通过使用constness丢弃对象的const_cast来修改对象,但这将导致根据标准的未定义行为。

答案 1 :(得分:1)

您需要阅读“const-ness”,包括常量变量,参数和成员函数。

具体来说,您可以指定friend函数将其参数作为 const 引用接收。它只能读取私有变量并调用const函数。

// ...
friend void readers(classroom const &);
// ...

void readers(classroom const &lee) {
    // ...
}