[技术| 编程·课件·Linux] 一道C++题目等你来解答~

extlpf · 发布于 2012-10-26 22:48 · 1122 次阅读
613
本帖最后由 extlpf 于 2012-10-26 22:49 编辑

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

[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之类的编译~ 稍后我重出一道,哈哈~
共收到 7 条回复
hslx111 · #2 · 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的顺序。

点评

前面分析得对,很可惜后面错了。离正确答案只有一步之遥,感谢热心回复~ 哈哈  发表于 2012-10-28 16:02
390125133 · #3 · 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,两次赋值才对啊?是还望学长指点迷津

点评

楼下已经帮你弄明白了~  发表于 2012-10-28 16:04
X1n4n · #4 · 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   3  2

综合起来就是: 11321332

点评

回答正确!撒花庆贺~~  发表于 2012-10-28 16:05
正解,c++ primer里也说了int a=1;等同于int a(1);都是初始化,int a;a=1;才是赋值,我也发现了,这里的关键处是Dog d1;d1=2;用了个没有int参数的赋值函数,先转型后赋值,其他时候碰到两个对象的=,左对象已存在就赋  详情 回复 发表于 2012-10-28 14:28
390125133 · #5 · 2012-10-28 14:28:13  回复 支持 反对
X1n4n 发表于 2012-10-28 14:03
试验了一下:
关键就是 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 · #6 · 2012-10-28 16:15:08  回复 支持 反对
学长。。多出题啊 活跃气氛~~~~

点评

刚发过新的题目帖,去看看吧~  详情 回复 发表于 2012-10-28 16:33
extlpf · #7 · 2012-10-28 16:33:29  回复 支持 反对
X1n4n 发表于 2012-10-28 16:15
学长。。多出题啊 活跃气氛~~~~

刚发过新的题目帖,去看看吧~
hslx111 · #8 · 2012-10-28 19:03:55  回复 支持 反对
好吧,其实是我改了一下操作符重载。
改成了Dog operator=(const Dog& dog) {std::cout << 3;return dog;}
所以会有这个输出,是我没有之前说明。
回帖
B Color Image Link Quote Code Smilies
Command + Enter
快速回复 返回顶部 返回列表