24小时热门版块排行榜    

查看: 1383  |  回复: 14
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

微尘、梦想

木虫 (知名作家)

[求助] 复制构造函数问题

书上说:复制构造函数在以下3种情况下会被调用:
1、用类的对象去初始化该类的另一个对象时;
2、函数的形参是类的对象时;
3、函数的返回值是类的对象时。
程序:
CODE:
#include
using namespace std;
class point
{
private:
        int x,y;
public:
        point(int a=0,int b=0)      //定义构造函数
        {
                x=a;
                y=b;
        }
        point(point &p);            //声明复制构造函数
        int getx()
        { return x; }
        int gety()
        { return y; }
};
point::point(point &p)          //定义复制构造函数
{
        x=p.x*10;
        y=p.y*20;
        cout <<"调用复制构造函数"< }
void f(point p)
{  cout < point g()
{  point q(3,5); return q; }
void main()
{
        point p1(1,2);
        point p2(p1);    //第一种情况
        cout <         f(p2);      //第二种情况
        p2=g();     //第三种情况
        cout < }

问题:该程序在第三种情况时并没有调用复制构造函数,其执行结果为:
调用复制构造函数
10      40
调用复制构造函数
100     800
3       5
不知道为什么,谢谢各位指点!!!
回复此楼

» 猜你喜欢

任风云变幻,我笑对人生!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

★ ★ ★
微尘、梦想(金币+3): 鼓励交流! 2011-06-20 19:43:12
引用回帖:
Originally posted by 来自天狼 at 2011-06-20 16:28:15:
看了楼主的问题,才知道自己的C++功底不扎实,为了搞明白这个问题,这几天真是寝食难安。查了所有能找到的C++书,还在网上扒了无数网页,加上自己的思考,终于有所收获,虽然已经结贴,但还是想谈谈自己的看法。
...

来唱个反调

我感觉标准其实不是条条框框,而是对于一个问题,大家的实现方式不一样,然后发现这样会给后来人带来困扰,于是标准才出现了

当然c++的新标准也才出来不久,还没来得及阅读,虽然其中可能有一些有争议的东西,但是,总体来说不能否定标准存在的价值。(咳虽然C++的标准不像C标准那么深入人心)

VC6很老的东西了,很多c++特性都不支持(C++ Primer上的好多例子在VC6上是有问题的,好像说当年标准没定,也难怪。不过这些东西在今天看来是司空见惯了),用它的行为反过来来解释标准,有点偏颇了

对编译器而言,完全遵循标准似乎还没哪个做得到。但是,倒是没有哪个编译器因为不遵守标准还理直气壮的......嘛,新的c++标准争议还挺多,姑且不论,下一代编译器也还没出来...
15楼2011-06-20 18:39:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 15 个回答

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖

★ ★
余泽成(金币+2): 谢谢参与应助! 2011-06-08 16:09:43
微尘、梦想(金币+5): 谢谢~~ 2011-06-09 07:37:32
point g()
.....
p2=g();     //第三种情况
============

第三种情况直接返回了一个point对象,不会调用的
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
2楼2011-06-07 21:36:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

微尘、梦想

木虫 (知名作家)

引用回帖:
Originally posted by libralibra at 2011-06-07 21:36:08:
point g()
.....
p2=g();     //第三种情况
============

第三种情况直接返回了一个point对象,不会调用的

书上是这么说的,然后我去网上查了查也是这么说的啊~~
http://baike.baidu.com/view/2329038.htm
5.何时使用复制构造函数
任风云变幻,我笑对人生!
3楼2011-06-07 21:38:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

不过我vs2008编译器有调用啊
CODE:
调用复制构造函数
10      40
调用复制构造函数
100     800
调用复制构造函数
30      100

Process returned 0 (0x0)   execution time : 0.047 s
Press any key to continue.

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
4楼2011-06-07 21:43:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见