无法理解类构造函数

Som*_*ger 2 c++ constructor reference class

我上课了.

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

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

APr*_*mer 9

当你有

Books(const Books &source)
Run Code Online (Sandbox Code Playgroud)

源通过引用传递.当你有

Books(const Books source)
Run Code Online (Sandbox Code Playgroud)

它本来是通过价值传递的.但要传递值,您就是复制构造函数.因此,为了避免无限递归,复制构造函数必须接受引用.


sam*_*hen 8

Books(const Books &source)
Run Code Online (Sandbox Code Playgroud)

表示传递了一个引用,而不是实际的变量(如pass-by-value,就像诸如intor 之类的基元一样char).

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

(注意,最重要的是:这里的值传递将引入无限递归 - 请参阅@AProgrammer的答案)除此之外,传递source值也是不必要的(意思是:在复制时制作整个源的副本)构造函数被调用),我们只是使用引用.


您可能感兴趣的附加阅读:C++ Pass by Reference vs. Value