【问题标题】:C++ copy constructor calling other constructors [duplicate]C ++复制构造函数调用其他构造函数[重复]
【发布时间】:2018-10-17 14:33:15
【问题描述】:

我有这个代码。我对C++不是很精通,所以我要问几个问题:

#include <iostream>

using namespace std;

class Line {

   public:
      int getLength( void );
      Line( int len );             // simple constructor
      Line( const Line &obj);  // copy constructor
      ~Line();                     // destructor

   private:
      int *ptr;
};

// Member functions definitions including constructor
Line::Line(int len) {
   cout << "Normal constructor allocating ptr" << endl;

   // allocate memory for the pointer;
   ptr = new int;
   *ptr = len;
}

Line::Line(const Line &obj) {
   cout << "Copy constructor allocating ptr." << endl;
   ptr = new int;
   cout<<&obj<<endl;
   *ptr = *obj.ptr; // copy the value
}

Line::~Line(void) {
   cout << "Freeing memory!" << endl;
   delete ptr;
}

int Line::getLength( void ) {
   return *ptr;
}

void display(Line obj) {
   cout << "Length of line : " << obj.getLength() <<endl;
}

// Main function for the program
int main() {

   int a = 10;
   cout<<&a<<endl;
   Line line(a);

   display(line);

   return 0;
}
  1. 这里我看不出我们在哪里称复制构造器。
  2. 析构函数被调用了两次。第二个对象在哪里创建?
  3. Line::Line(const Line &amp;obj) 接收a 的地址作为参数?我猜不会。但为什么? a 本身不是 Line 的实例,那么为什么函数会接受呢?
  4. Line::Line(const Line &amp;obj)Line::Line(const Line obj) 之间有什么区别
  5. 请您解释一下*ptr = *obj.ptr;。从这里我只知道lhs,它取消引用ptr(又名设置对象的值)。但我没有得到 rhs 中的内容?

为了清楚起见,如果您用更少的技术术语和更多的例子来解释,我将不胜感激

上面的代码输出如下:

0x7fff692196a4
Normal constructor allocating ptr
Copy constructor allocating ptr.
0x7fff69219698
Length of line : 10
Freeing memory!
Freeing memory!

【问题讨论】:

  • 那么这个程序的输出是什么?如果此处未实现默认构造函数,您是如何发现它被调用的?为linemain函数局部变量和objdisplay函数参数调用析构函数(这是复制构造的)。
  • 您没有默认构造函数。你在说Line(int)吗?
  • 是的,对不起。编辑
  • @Yura 你知道什么是传值吗?
  • @melpomene 我觉得所有问题都源于他们不知道按值传递会导致复制。

标签: c++


【解决方案1】:

这里由于某种原因调用了默认构造函数。我没有看到我们在没有参数的情况下创建对象的任何地方(也就是默认构造函数)

我也没有看到任何地方!你怎么能确定调用了默认构造函数?事实上,您的类不能使用默认构造函数构造,因为没有。如果你试试这个:

Line l;

由于没有默认构造函数,它不会编译。

析构函数被调用了两次。第二个对象在哪里创建?

这一行:

display(line);

你的函数接收一个值。要在 main 和 display 函数中都有一个值,你必须以某种方式复制它。传递 line 会将其从您的 main 复制到您的函数中。

Line::Line(const Line &obj) 接收a 的地址作为参数?我猜不会。但为什么? a 本身不是 Line 的实例,那么为什么函数会接受它呢?

没有。这是一个参考。复制构造函数接收来自其他上下文的引用来复制它。

Line::Line(const Line &amp;obj)Line::Line(const Line obj) 之间有什么区别

一个是引用,另一个是按值传递(复制、移动或其他构造)。如果复制构造函数必须接收一个值,您将如何将值复制到复制构造函数中?复制构造函数必须接收引用。

你能解释一下吗?*ptr = *obj.ptr; .从这里我只知道lhs,它取消引用ptr(又名设置对象的值)。但我没有得到 rhs 中的内容?

我不知道您所说的rhslhs 是什么意思,不在您发布的代码中。但实际上,*ptr = *obj.ptr 会将obj.ptr 指向的整数值设置为this-&gt;ptr 指向的变量。

我建议你买一本好的 C++ 书,并按照一个教程来教你基础知识。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多