我上课了。
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)
。
答案 0 :(得分:9)
当你有
时Books(const Books &source)
源是通过引用传递的。当你有
Books(const Books source)
它会通过价值传递。但要传递值,您就是复制构造函数。因此,为避免无限递归,复制构造函数必须接受引用。
答案 1 :(得分:8)
Books(const Books &source)
表示传递了一个引用,而不是实际的变量(如pass-by-value,就像int
或char
这样的基元一样。
在这种情况下,由于您正在构建复制构造函数,因此您不希望对传入其引用的对象进行修改,因此参数签名的前缀为const
(这可以保证参数被传入是不可变的)
(注意,最重要的是:这里的值传递将引入无限递归 - 请参阅@AProgrammer的答案)除此之外,传递source
也会不必要地花费按值(意思是:在调用复制构造函数时复制整个源代码),我们只使用引用。
您可能感兴趣的其他阅读材料:C++ Pass by Reference vs. Value
答案 2 :(得分:3)
您正在查看的内容称为复制构造函数。你应该通过引用传递一个对象的原因是因为如果你通过一个值传递它,那么必须构造一个对象的副本,所以它必须再次调用复制构造函数。然后再次。再次......
答案 3 :(得分:1)
因此,书籍通过引用传递,而不是按值复制。
答案 4 :(得分:1)
使用引用意味着不涉及复制。如果你有:
Books(const Books source)
然后调用者传递的参数必须复制到source
。如果您使用引用,则不会进行复制。这提供了更好的性能。使用少量数据并不重要,因为它是一个没有大量数据的简单类。但是对于更复杂的类,复制可能很昂贵。使用引用可以避免这个问题。
但是,对于复制构造函数,避免复制至关重要。不是出于性能原因,而是因为复制涉及复制构造函数。调用复制构造函数时,如果未使用引用,则必须创建另一个副本。这意味着再次调用复制构造函数。在那里,还需要制作另一份副本。又是对复制构造函数的调用。
可以想象,这将导致无限量的复制构造函数调用。通过使用引用,可以避免这种情况。
答案 5 :(得分:0)
答案 6 :(得分:0)
传递对Books source
对象的引用。这一切。
我希望这会有所帮助。