在C ++中复制构造函数并将值复制到对象中

时间:2013-03-11 03:37:55

标签: c++

#include <iostream>
#include <cstring>
using namespace std;

class foo {
     int number;
     char string[20];
public:
     foo( ) { 
          set(3, 5); 
     }
     void set (int a, int b) { 
          number = a + b;
        strcpy( string, "summer" ); 
     }

     foo (const foo & c ) { 
     }

     void output() { 
          cout << number << ',' << string << endl;  
     }
};

void showyanothing (foo);

int main() {
     foo a, b;
     showyanothing( a );
     a.output();
     b.output();
}

void showyanothing (foo z) { 
     cout << "... how are you?\n";
     z.output(); 
}

输出

... hello ...
... how are you?
-1218897013,l·ôl·Y·ôl·À
8,summer
8,summer

-1218897013,l·ôl·Y·ôl·À行,这些是复制构造函数创建的对象Z中的值。如果我将我的复制构造函数更改为以下内容,则输出对象z将生成10, summer.1.2.3。为什么?神奇地将值从哪里插入Z?

新的复制构造函数

 foo (const foo & c ) { 
     number = c.number + 2;
     strcpy( string, c.string );
     strcat( string, ".1.2.3" );
 }

新产品:

... how are you?
10,summer.1.2.3
8,summer
8,summer

在复制构造函数中,我感到困惑的是为什么c.number等于8,c.string等于夏天?从哪里获得这些价值?

3 个答案:

答案 0 :(得分:4)

简单检查函数调用

void showyanothing (foo z) 

此处调用复制构造函数。由于您在早期代码中有一个复制构造函数,并且没有初始化数据成员,因此它会打印随机值。另一方面,当您编辑复制构造函数时,您将获得结果(即调用以下内容!)

foo (const foo & c ) { 
     number = c.number + 2;
     strcpy( string, c.string );
     strcat( string, ".1.2.3" );
 }

希望它能解决你的疑问:)

答案 1 :(得分:0)

复制构造函数的第一个版本不会初始化foo的成员变量。因此numberstring将包含随机数据 - 无论发生在新对象实例化的位置的RAM中。

第二个版本根据引用传入的对象(我们假设“复制”的对象)正确地为成员变量赋值。在这种情况下,您传入a(因为您调用showyanothing(a)),它是使用默认构造函数实例化的,它为数字8和字符串“summer”。

答案 2 :(得分:0)

对象占用内存是否初始化。内存包含一些任意值。如果你没有初始化它,它可以是任何东西。这解释了你得到的初始垃圾输出。

接下来,您将提供合理的复制构造函数,该构造函数基于传递给它的源对象初始化对象。在main()的开头,您创建了使用默认构造函数构造的对象a,因此number调用会将其set(3,5)成员设置为8。 showyanothing (foo z)函数通过值传递其参数,这意味着使用接收对象foo的复制构造函数创建类a的新实例,它向a添加2 { {1}}(即8)并复制number