本帖最后由 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之类的编译~ 稍后我重出一道,哈哈~ |
[技术| 编程·课件·Linux] 一道C++题目等你来解答~
extlpf
· 发布于 2012-10-26 22:48
· 1122 次阅读
转载文章时务必注明原作者及原始链接,并注明「发表于 软院网 RuanYuan.Net 」,并不得对作品进行修改。
这个操作符重载要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 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: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 |
正解,c++ primer里也说了int a=1;等同于int a(1);都是初始化,int a;a=1;才是赋值,我也发现了,这里的关键处是Dog d1;d1=2;用了个没有int参数的赋值函数,先转型后赋值,其他时候碰到两个对象的=,左对象已存在就赋值函数,左对象不存在就拷贝构造函数,赋值函数并没有调用拷贝,拷贝也没有调用赋值,虽说网上很多人自己写的赋值函数都调用了拷贝构造函数,或是拷贝调用赋值,exceptional关于拷贝和赋值是有条建议的,多谢楼上的解惑 |