一个C++复制构造函数在不同编译器上(xcode,linux终端,VC6.0)出现结果不一致的问题
2012-07-12 21:11
417 查看
郑莉等编著的<C++语言程序设计(第四版)>上类与对象章节,复制构造函数中提到复制构造函数被调用的三种情况,依次为
1)当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值
2)当函数的返回值是类对象时,系统自动调用拷贝构造函数
3)如果函数的返回值是类的对象,函数执行完成返回调用者时
并举了一个例子,并特别说明了一点:
在有些编译环境下,该例子的运行结果可能不尽相同,因为编译器有时会针对复制构造函数(拷贝构造函数)的调用做优化,避免不必要的复制构造函数调用;
为了探究复制构造函数被调用的情况,并验证该情况,现书中例子,做了一个修改,修改处,图片也已经注明,源代码如下
依次在Mac系统的编译器Xcode,linux系统终端编译,和Windows系统VC6.0下运行,结果分别如下,
能够编译成功的为:Mac的xcode下与windows的VC++6.0但值不一样.
编译不通过的为:在Linux终端提示错误,并且在windows下的CodeWarrior和GUN的g++编译都回提示拷贝构造函数参数错误,CodeWarrior中还指出拷贝构造函数的参数不能是右值。
1)当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值
2)当函数的返回值是类对象时,系统自动调用拷贝构造函数
3)如果函数的返回值是类的对象,函数执行完成返回调用者时
并举了一个例子,并特别说明了一点:
在有些编译环境下,该例子的运行结果可能不尽相同,因为编译器有时会针对复制构造函数(拷贝构造函数)的调用做优化,避免不必要的复制构造函数调用;
为了探究复制构造函数被调用的情况,并验证该情况,现书中例子,做了一个修改,修改处,图片也已经注明,源代码如下
#include "iostream.h" using namespace std; class Point {public: Point(int xx=0,int yy=0) { x=xx; y=yy; } Point(Point &p); int getX() { return x; } int getY() { return y; } private: int x,y; }; Point::Point(Point &p) { x=p.x+1; y=p.y; cout<<"Calling the copy constructor"<<endl; } void fun1(Point p) { cout<<p.getX()<<endl; } Point fun2() { Point a(1,2); return a; } int main() { Point a(4,5); Point b=a; cout<<b.getX()<<endl; fun1(b); b=fun2(); cout<<b.getX()<<endl; return EXIT_SUCCESS; }
依次在Mac系统的编译器Xcode,linux系统终端编译,和Windows系统VC6.0下运行,结果分别如下,
能够编译成功的为:Mac的xcode下与windows的VC++6.0但值不一样.
编译不通过的为:在Linux终端提示错误,并且在windows下的CodeWarrior和GUN的g++编译都回提示拷贝构造函数参数错误,CodeWarrior中还指出拷贝构造函数的参数不能是右值。
相关文章推荐
- 一个C++复制构造函数例题在不同编译器上(xcode,CodeWarrior,GUN,VC6.0)出现结果不一致的问题
- 一个C++复制构造函数例题在不同编译器上(xcode,CodeWarrior,GUN,VC6.0)出现结果不一致的问题
- 标准库c++ string,转c string容易犯的一个错误。求此问题为什么在windows下和linux下结果不同???
- linux模块加载出现有关问题,printk打印信息,终端里看不到
- 将linux-2.6.34.13移植到s5pv210 在make时出现的编译器问题
- 一个在不同的编译器下会有不同结果的C++程序(程序本身只有四行)
- 一个Codility上的练习遇到和预期结果不同的问题。
- Linux下安装MyEclipse和Tomcat服务器详解,以及我安装过程中所出现的问题以及解决办法,并实现一个web小程序
- 遇到一个gcc编译器版本导致的运行结果有差异的问题
- 使用不同版本XCode出现的问题fatal error: malformed or corrupted AST file: 'Unable to load module
- 不同情景的同样问题:开机出现unable to load selinux policy
- 同一个文件Linux环境下和windows环境下md5_file处理出来的结果不一致
- 关于如何用rem兼容不同手机屏幕大小不一致问题以达到多终端自适应问题
- Linux下telnet登录欢迎界面出现缓慢问题[终端]
- 十六进制字符串转十进制整数,诡异的问题,Linux和Windows结果不同
- 命令在bash终端和脚本执行结果不一致问题
- 一个关于不同编译器对operator++和operator+=的处理方式的问题
- 解决通过VNC连Linux时只出现终端,没显示桌面的问题
- 在Linux系统终端下输入ls命令,不同颜色结果代表着不同的含义
- 搜索一个问题 C、C++判断操作系统 是 Linux还是windows 还是Unix【编译器内置宏 探索(不是特别满意)】