extlpf 发表于 2012-10-26 22:48:20

一道C++题目等你来解答~

本帖最后由 extlpf 于 2012-10-26 22:49 编辑

周末晚上没事干来做一道C++题吧。看程序,写输出结果,并解释原因。很简单哦~

#include <iostream>

struct Dog {
   Dog(int a) {std::cout << 1;}
   Dog(const Dog& dog) {std::cout << 2;}
   Dog& operator=(const Dog& dog) {std::cout << 3;}
};

int main(int argc, char* argv[]) {
   Dog d1 = 1;
   Dog d2 = d1 = 2;
   Dog d3 = d2 = d1 = 3;
   return 0;
}



补充内容 (2012-10-28 15:51):
不好意思我忘记说明是标准C++了,用微软的东西编译可能会有点问题哦~

补充内容 (2012-10-28 15:54):
运算符重载是应该有返回值的,但g++或者clang++之类的编译器只要不把W选项全开应该能编译通过滴~

补充内容 (2012-10-28 15:56):
看了一下回复, X1n4n 同学第一个正解,热烈祝贺哇!

补充内容 (2012-10-28 15:58):
这个题我没注明清楚,是我的错哈,本想着你们不太会用VC之类的编译~ 稍后我重出一道,哈哈~

hslx111 发表于 2012-10-27 10:27:12

这个操作符重载要return吧。。。
如果一切正常应该是 113213232
每次给d1赋值都是调用 Dog(int a) {std::cout << 1;}所以输出1;
但是d1,d2,d3都是结构体,所以之间不是赋值而是复制指针,再加上=被重载了,所以每次=操作都会依次调用Dog& operator=(const Dog& dog) {std::cout << 3;}和 Dog(const Dog& dog) {std::cout << 2;}也就输出了3和2.
所以就出出现113213232的顺序。

390125133 发表于 2012-10-27 20:48:30

本帖最后由 390125133 于 2012-10-27 21:17 编辑

学长的程序报了个小错,赋值函数必须返回一个对象,我改成了Dog& Dog::operator=(const Dog& dog)
{Dog d;cout << 3<<endl;return d;}//调用无参默认构造函数,没有输出,应该不影响结果,最终运行结果为11321332,我认为赋值函数在对象已存在时,不会调用拷贝构造函数创建对象,只有对象不存在时赋值才调用拷贝构造函数,我自己改了下,改成Dog d1 = 1; Dog d2 = d1 = 2;Dog d3;d3 = d2 = d1 = 3;结果为11321333,对了,为什么最后会出现333,对象都已存在,最后应该是33,两次赋值才对啊?是还望学长指点迷津

X1n4n 发表于 2012-10-28 14:03:56

本帖最后由 X1n4n 于 2012-10-28 14:07 编辑

试验了一下:
关键就是 Dog d=1 ; 或 Dog d=dx ; 这样的事调用构造函数的,这里的等号不是赋值而是定义、初始化相当于Dog d(1) ;。
Dog d1 = 1;调用构造函数Dog(int a),输出 1   
d1 = 2 ;   此处是赋值符号。与重载函数的参数类型不匹配因此先调用转型构造函数Dog(int a),输出1,然后调用重载的赋值操作,输出 3
Dog d2 = d1 ; 定义d2,直接调用相应的构造函数 Dog(const Dog & dog) ; 输出2
Dog d3 = d2 = d1 = 3; 这句同理了,自右向左运算,依次输出 1 3   32

综合起来就是: 11321332

390125133 发表于 2012-10-28 14:28:13

X1n4n 发表于 2012-10-28 14:03 static/image/common/back.gif
试验了一下:
关键就是 Dog d=1 ; 或 Dog d=dx ; 这样的事调用构造函数的,这里的等号不是赋值而是定义、初 ...

正解,c++ primer里也说了int a=1;等同于int a(1);都是初始化,int a;a=1;才是赋值,我也发现了,这里的关键处是Dog d1;d1=2;用了个没有int参数的赋值函数,先转型后赋值,其他时候碰到两个对象的=,左对象已存在就赋值函数,左对象不存在就拷贝构造函数,赋值函数并没有调用拷贝,拷贝也没有调用赋值,虽说网上很多人自己写的赋值函数都调用了拷贝构造函数,或是拷贝调用赋值,exceptional关于拷贝和赋值是有条建议的,多谢楼上的解惑

X1n4n 发表于 2012-10-28 16:15:08

学长。。多出题啊 活跃气氛~~~~

extlpf 发表于 2012-10-28 16:33:29

X1n4n 发表于 2012-10-28 16:15 static/image/common/back.gif
学长。。多出题啊 活跃气氛~~~~

刚发过新的题目帖,去看看吧~

hslx111 发表于 2012-10-28 19:03:55

好吧,其实是我改了一下操作符重载。
改成了Dog operator=(const Dog& dog) {std::cout << 3;return dog;}
所以会有这个输出,是我没有之前说明。
页: [1]
查看完整版本: 一道C++题目等你来解答~