【问题标题】:Can't understand class constructor无法理解类构造函数
【发布时间】:2012-12-07 17:15:15
【问题描述】:

我有课。

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)

【问题讨论】:

  • 抱歉网页浏览器把代码搞砸了:/.

标签: c++ class reference constructor


【解决方案1】:

当你有

Books(const Books &source)

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

Books(const Books source)

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

【讨论】:

    【解决方案2】:
    Books(const Books &source)
    

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

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

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


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

    【讨论】:

    • @sampson-chen,是的,我发表了我的评论,然后注意到你更新了。我现在把它删了。关于“不必要的昂贵” - 在复制构造函数的上下文中提及它有点毫无意义,因为它根本不可能做到。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 也感谢您的快速回答。
      【解决方案5】:

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

      Books(const Books source)
      

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

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

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

      【讨论】:

      • 这不是关于性能,而是关于避免无限递归。
      【解决方案6】:

      了解复制构造函数:http://www.cplusplus.com/articles/y8hv0pDG/

      【讨论】:

        【解决方案7】:

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

        我希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-29
          • 1970-01-01
          • 2017-04-03
          • 1970-01-01
          • 2015-05-05
          • 2017-02-28
          • 2016-09-18
          • 1970-01-01
          相关资源
          最近更新 更多