Есть ли способ всегда передавать по значению (сделать копию) вместо передачи по ссылке при работе с функциями-членами класса? - PullRequest
0 голосов
/ 12 мая 2019

Для небольшого прошлого я изучал c ++ в течение 3 месяцев, поэтому я в основном новичок, и я пытаюсь понять классы, которые содержат необработанные указатели в качестве элементов данных, и как использовать копирующих подрядчиков и перемещать семантику с ними.

Итак, у меня есть этот простой класс, который содержит простой конструктор / деструктор и нереализованный конструктор копирования.

Все, что я делаю, - это создание объекта с использованием указанного класса, а затем вызов членафункция с ним.

Итак, мой вопрос:

Могу ли я как-то всегда гарантировать, что при вызове функции-члена я сделаю копию объекта, вызывающего ее, а не передам ее по ссылке?

Вы можете легко передать что-либо по ссылке, если добавите оператор "&", но как насчет передачи чего-либо по значению?Я прочитал, что передача по значению является способом по умолчанию для компилятора, но по какой-то причине, когда я выполняю свой код, конструктор копирования не вызывается.

using namespace std;

    class dog {
    public:
        string* name;
        int* age;

        dog(string NameVal = { "Null" }, int AgeVal = { 10 }) { 
            name = new string{ NameVal };
            age = new int{ AgeVal };
            cout << "constructor for " << *name << endl;
        }
        ~dog() {
            cout << "destructor for " << *name << " " << age << endl;
        }
        dog(const dog &source) {
            cout << "copy constructor for " << *name << endl;
        }
        void talk(string text) {
            cout << text << *name << endl;
        }
    };

    int main() {
        dog test;

        test.talk("Test_Text ");
        return 0;
    }

Поэтому я ожидал, что конструктор копирования будет вызван длятестовый объект, но, похоже, он передается по ссылке с помощью указателя «this».

Как я могу изменить это и фактически сделать копию объекта при вызове функции?

Спасибоза любую помощь.

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Что ж, если вы хотите скопировать объект, а затем вызвать функцию для нового объекта, вам нужно сделать это явно:

dog test{};
dog{test}.talk("copy talk");

Обратите внимание, что вам также нужно будет реализовать конструктор копирования для этого, иначе поля класса останутся неинициализированными:

dog(const dog &source)
: name{new string{*(source.name)}}
, age{new int{*(source.age)}}
{
       cout << "copy constructor for " << *name << endl;
}
1 голос
/ 12 мая 2019

Есть ли способ всегда передавать по значению (создавать копию) вместо передачи по ссылке при работе с функциями-членами класса?

использовать статическую операцию, получая экземпляр по значению

class dog {
       ...
       static void talk(dog inst, string text) {
            cout << text << *(inst.name) << endl;
        }
       ...
};

int main() {
    dog test;

    dog::talk(test, "Test_Text ");
    // or even
    test.talk(test, "Test_Text ");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...