Почему я получаю копию объекта, когда я передаю тот же объект в конструктор? - PullRequest
0 голосов
/ 15 апреля 2019

Я хочу выяснить, что здесь происходит. Почему я получаю копию объекта, когда передаю его конструктору, который вместо этого ожидает строковый параметр? Вот мой код, просто чтобы уточнить:

#include <iostream>

using namespace std;

class Person
{
public:
    Person( string name ):itsName(name){}

    /*operator std::string()
    {
        return itsName;
    }*/

    void SetName( string name )
    {
        itsName = name;
    }

    string GetName()
    {
        return itsName;
    }

private:
    string itsName;
};

int main()
{
    Person p1( "Lois" );
    Person p2( p1 );

    cout << p1.GetName() << endl;
    cout << p2.GetName();
    return 0;
}

Кому я вижу имя p2, которое совпадает с именем p1? Конечно, это интуитивно понятно, но я не установил какой-либо объект в качестве параметра в конструкторе Person. Следует ожидать строку. Я прокомментировал перегруженный оператор строки, который выглядел здесь как «плохой парень», но это не так. Этот код компилируется в Code :: Blocks с использованием MinGW (gcc).

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Как сказал @Sam Varshavchik в своем комментарии, вы используете конструктор копирования.Это определено неявно для каждой структуры, класса или объединения, которое вы создаете при условии, что все переменные-члены также имеют конструктор копирования!

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

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

ссылка на предмет

1 голос
/ 15 апреля 2019

Причина в том, что компилятор генерирует конструктор копирования по умолчанию. См. Копировать конструктор . Если вам не нравится поведение по умолчанию, вы можете явно удалить его.

 Person(const Person& ) = delete;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...