为什么需要在友元函数中提及对象?

Why there is need to mention object in friend function?

是否需要在friend函数中写一个对象来访问class的私有成员。

#include <iostream>
#include <vector>
using namespace std;
class project
{
  private:
  vector<int> v1;
  public:
    void addelement(int a)
    {
      v1.push_back(a);

    }

    void view()
    {
      for(auto i=v1.begin();i<v1.end();i++)
      {
        cout<<*i<<endl;
      }
    }

    friend void modify(int,int,project);

};

void modify(int data,int index,project p)//is it necessary here to make an object of class .
    {
      p.v1[index]=data;//As here without "p." it shows errors,it says use 
                        //of unidentified identifier v1
    }

int main()
{
  project p1;
  p1.addelement(7);
  p1.addelement(91);
  modify(24,0,p1);
  modify(22,3,p1);
  p1.view();
}

我想知道友元函数是否是 class 的友元并且它可以自己访问 class 的私有成员那么为什么需要提及 [=15= 的对象]?

一个friend函数不是那个class的成员函数。

modify(24,0) 如何知道您指的是 project 的哪个实例?至此,您需要将 project 的实例传递给 friend 函数。

附加说明,void modify(int data, int index, project p) 创建了 p 的副本,如果您想修改传递给 modify 的对象,您需要编写:

void modify(int data, int index, project &p) {
  p.v1[index]=data;
}
//...
modify(24,0,p1)

void modify(int data, int index, project *p) {
  p->v1[index]=data;
}
//...
modify(24,0,&p1)

像这样的对象只调用非静态成员函数:

object_arg.name_of_member_function(regular_args);

因此,非静态成员函数可以访问指向 object_argthis 指针,并且隐式地访问 this 指向的对象的成员。

所有其他函数,包括静态成员函数和自由函数,包括那些作为 class 的朋友的自由函数,例如您的 modify,在调用时没有像这样的对象参数:

name_of_function(regular_args);

因此,它们没有 this 指针。如果您想访问某个对象,则必须将其作为常规参数传递。


P.S。修改按值传递的参数几乎没有用。