#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等于夏天?从哪里获得这些价值?
答案 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的成员变量。因此number
和string
将包含随机数据 - 无论发生在新对象实例化的位置的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
。