Как инициализировать закрытые члены класса с помощью дружественной функции в C ?

#c #private-members #friend-function

#c #private-members #friend-функция

Вопрос:

Я написал простой код на cpp, как показано ниже. Я получаю доступ к закрытым членам данных, используя 2 способа. Сначала с помощью метода get set, а затем с помощью функции friend . Но для функции friend я получаю значение мусора для элементов данных объекта. Кто-нибудь может сказать мне, как я могу это исправить?

 #include<iostream>
#include<cstring>
using namespace std;

class Student
{
    int roll_no;
    string name;
    public:
        void set(int r, string n)
        {
            roll_no = r;
            name = n;
        }
        void get()
        {
            cout<<roll_no<<" "<<name<<endl;
        }
        friend void access(Student s);
};

void access(Student s)
{
    s.roll_no = 5;
    s.name = "Shivansh";
}

int main()
{
    Student s;
    s.set(10,"Shrut");
    s.get();
    Student s1;
    access(s1);
    s1.get();
    return 0;
}
 

Комментарии:

1. void access(Student s) Это принимает его аргумент по значению, поэтому он изменяет только копию объекта. Чтобы он действительно изменялся s1 , измените функцию, чтобы принимать аргумент по ссылке.

2. access(Student s) -> access(Student amp; s)

3. Можете ли вы уточнить это подробнее?

Ответ №1:

Происходит то, что ваша функция принимает Student по значению. (он копирует его) Для того, чтобы изменить объект Student, он должен использовать его по ссылке.

 // take it by reference to modify the Student.
void Access(Studentamp; s) {
     s.roll_no = 5;
     s.name = "Shivansh";
}
 

Ответ №2:

Передайте объект класса по ссылке, чтобы получить доступ к объекту и изменить содержимое объекта, т.Е. в вашем случае номер и имя. Невыполнение этого требования приведет к вызову конструктора копирования по умолчанию и созданию копии объекта.

 access(Student amp;s)
{
 //Change object s
}
 

Подробнее о передаче по ссылке и передаче по значению читайте здесь
https://www.google.com/amp/s/www.geeksforgeeks.org/passing-and-returning-objects-in-c/amp /