C ++ Передача объектов по ссылке - PullRequest
1 голос
/ 01 марта 2011

Я пытаюсь выучить C ++, и я работаю через "Sams Teach Yourself C ++ за 21 день".

До сих пор я неплохо развивался и даже без труда прошел через главу по указателям.,Тем не менее, список «Передача объектов по ссылке» оставил меня в замешательстве.

Существует класс с двумя конструкторами:

class SimpleCat
{
public :
    SimpleCat();
    SimpleCat(SimpleCat&);
...
};

две функции с прототипом:

SimpleCat FunctionOne( SimpleCat theCat );
SimpleCat* FunctionTwo( SimpleCat *theCat );

/ Что меня смущает, так это то, что при вызове второй функции вызывается второй конструктор SimpleCat(SimpleCat&);.Может кто-нибудь объяснить, пожалуйста?Любые дальнейшие поиски оставили меня одинаково смущенным. /

РЕДАКТИРОВАТЬ: Я допустил ошибку в своем посте здесь, конструктор копирования (как я теперь знаю, что это, большое спасибо)вызывается с первой функцией.Я прошу прощения за путаницу.Я знаю, что понимаю ссылку сейчас, и вы все очень помогли.

Ответы [ 4 ]

1 голос
/ 01 марта 2011

Я не могу воспроизвести поведение, которое вы описываете. Как вы можете видеть здесь , конструктор копирования вызывается только тогда, когда вы вызываете FunctionOne.

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

Источник:

#include <iostream>

class SimpleCat {
    public:
        SimpleCat() {
            std::cout << "\tSimpleCat() called\n";
        }

        SimpleCat(SimpleCat&) {
            std::cout << "\tSimpleCat(SimpleCat&) called\n";
        }
};

SimpleCat FunctionOne( SimpleCat theCat ){
    return theCat;
}

SimpleCat* FunctionTwo( SimpleCat* theCatPtr ){
    return theCatPtr;
}

int main() {
    SimpleCat cat;
    std::cout << "-----\n";

    std::cout << "FunctionOne{\n";
    FunctionOne(cat);
    std::cout << "}\n";

    std::cout << "FunctionTwo{\n";
    FunctionTwo(&cat);
    std::cout << "}\n";
}

выход

    SimpleCat() called
-----
FunctionOne{
    SimpleCat(SimpleCat&) called
    SimpleCat(SimpleCat&) called
}
FunctionTwo{
}
1 голос
/ 01 марта 2011

SimpleCat(SimpleCat&) является конструктором копирования . SimpleCat FunctionOne(SimpleCat theCat) использует передачу по значению семантики. Это требует, чтобы экземпляр класса был скопирован. Отсюда и вызов конструктора копирования.

0 голосов
/ 01 марта 2011

Ваш FunctionOne получает объект по значению.
Это означает, что всякий раз, когда вызывается функция, создается копия типа данных. Это справедливо для обычных типов данных, таких как int, char, ..., но также и для объектов (в вашем случае это объект SimpleCat).
Поэтому, когда у вас есть такая функция, как void doIt(int a), то при вызове doIt (3) значение 3 копируется , создавая новый экземпляр целого числа со значением 3.
В переводе на FunctionOne вызов FunctionOne(cat) сделает копию вашего объекта cat, что приведет к вызову конструктора копирования.

0 голосов
/ 01 марта 2011

Конструктор, который берет ссылку на свой собственный тип, называется «конструктором копирования» (он будет в вашей книге).

Всякий раз, когда компилятору необходимо сделать копию объекта определенного типа, если определение класса имеет конструктор копирования, он будет использовать его, в противном случае он использует реализацию по умолчанию, которую он предоставляет. Таким образом, конструктор копирования позволяет вам контролировать процесс копирования вашего класса.

Скорее всего, ваш конструктор копирования используется при вызове FunctionOne, а не FunctionTwo, поскольку параметр передается по значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...