2

我有一堂课。

class Books
{
private:
    int m_books;
public:
    Books(int books=0)
    {
        m_books = books;
    }

    Books(const Books &source)  //Here is what I don't understand.
    {
        m_books = source.m_books;
    }
};

我不明白为什么它必须是Books(const Books &source),而不是Books(const Books source)

4

7 回答 7

9

当你有

Books(const Books &source)

源是通过引用传递的。当你有

Books(const Books source)

它会按值传递。但是要按值传递,您就是复制构造函数。所以为了避免无限递归,复制构造函数必须接受一个引用。

于 2012-12-07T17:22:32.993 回答
8
Books(const Books &source)

表示传递的是引用,而不是实际的变量(如按值传递,如intor等​​原语char)。

在这种情况下,由于您正在构建一个复制构造函数,因此您不想对传入的引用的对象进行修改,因此参数签名以前缀为前缀const(这保证了传入的参数是不可变的)

注意,最重要的是:这里的按值传递会引入无限递归 - 请参阅@AProgrammer 的回答)除此之外,按值传递也会不必要地昂贵source(意思是:在复制时复制整个源构造函数被调用),我们只是使用一个引用来代替。


您可能感兴趣的其他阅读材料:C++ 引用传递与值传递

于 2012-12-07T17:18:06.450 回答
3

您正在查看的内容称为复制构造函数。您应该通过引用传递对象的原因是因为如果您通过值传递它,则必须构造对象的副本,因此必须再次调用复制构造函数。然后再次。然后再次 ...

于 2012-12-07T17:20:50.483 回答
1

所以 book 是通过引用传递而不是通过值复制。

于 2012-12-07T17:17:49.953 回答
1

使用引用意味着不涉及副本。如果你有:

Books(const Books source)

然后调用者传递的参数必须被复制到source. 如果您改用引用,则不会制作副本。这提供了更好的性能。对于少量数据,这并不重要,因为它是一个没有大量数据的简单类。但是对于更复杂的类,复制可能会很昂贵。使用引用可以避免这个问题。

但是,对于复制构造函数,避免复制是至关重要的。不是出于性能原因,而是因为复制涉及复制构造函数。当调用复制构造函数时,如果不使用引用,则必须制作另一个副本。这意味着对复制构造函数的另一个调用。在那里,必须制作另一个副本。又一次调用复制构造函数。

可以想象,这将导致无限量的复制构造函数调用。通过使用参考可以避免这种情况。

于 2012-12-07T17:18:54.103 回答
0

阅读复制构造函数:http ://www.cplusplus.com/articles/y8hv0pDG/

于 2012-12-07T17:18:43.283 回答
0

它传递对Books source对象的引用。这一切。

我希望这有帮助。

于 2012-12-07T17:18:45.677 回答