2

你好所有阅读

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

2 回答 2

5

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

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

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

注意access specifiersconstness是两个不同的属性,不要混用。

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

于 2011-11-15T18:59:03.147 回答
1

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

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

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

void readers(classroom const &lee) {
    // ...
}
于 2011-11-15T19:02:51.620 回答