您的位置:首页 > 运维架构 > Linux

一个C++复制构造函数在不同编译器上(xcode,linux终端,VC6.0)出现结果不一致的问题

2012-07-12 21:11 417 查看
郑莉等编著的<C++语言程序设计(第四版)>上类与对象章节,复制构造函数中提到复制构造函数被调用的三种情况,依次为

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中还指出拷贝构造函数的参数不能是右值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐