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

郑莉等编著的<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 0;
}

依次在Mac系统的编译器Xcode,linux系统终端编译,和Windows系统VC6.0下运行,结果分别如下,


能够编译成功的为:Mac的xcode下与windows的VC++6.0但值不一样.


在Xcode下设置断点,发现上面所说的第三种调用情况,即"如果函数的返回值是类的对象,函数执行完成返回调用者时",在xcode中并不适用,并不调用复制构造函数.







编译不通过的为:在Linux终端提示错误,并且在windows下的CodeWarrior和GUN的g++编译都回提示拷贝构造函数参数错误,CodeWarrior中还指出拷贝构造函数的参数不能是右值。





作者:
出处:http://www.cnblogs.com/ChenYilong/(点击RSS订阅)
本文版权归作者和博客园共有,欢迎转载,
但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/ChenYilong/p/2808628.html