24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 1469  |  回复: 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的回帖

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的回帖

微尘、梦想

木虫 (知名作家)

引用回帖:
Originally posted by libralibra at 2011-06-07 21:43:57:
不过我vs2008编译器有调用啊

[code]调用复制构造函数
10      40
调用复制构造函数
100     800
调用复制构造函数
30      100

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

可我用VS2005就米有调用呀,虾米情况????
任风云变幻,我笑对人生!
5楼2011-06-07 21:46:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

★ ★
余泽成(金币+2): 谢谢参与应助! 2011-06-08 16:12:34
引用回帖:
Originally posted by 微尘、梦想 at 2011-06-07 21:38:31:
书上是这么说的,然后我去网上查了查也是这么说的啊~~
http://baike.baidu.com/view/2329038.htm
5.何时使用复制构造函数

5.何时使用复制构造函数:按值传递对象,函数返回对象,用一个对象初始化另一个对象即复制初始化时,根据元素初始化列表初始化数组元素。这四种情况都将调用复制构造函数。记住,复制构造函数只能用于初始化,不能用于赋值,赋值时不会调用复制构造函数,而是使用赋值操作符。

=======================
我觉得不应该调用,但是vc调用了
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
6楼2011-06-07 21:49:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

gcc编译器跟我想的一样,你第二种情况是赋值操作,而非复制构造函数,因为g()返回一个q对象,左值p2已经存在了.应该不调用复制构造函数
CODE:
调用复制构造函数
10      40
调用复制构造函数
100     800
3       5

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

不知道为什么vs2008会调用,看来跟编译器有关
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
7楼2011-06-07 22:21:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

微尘、梦想

木虫 (知名作家)

引用回帖:
Originally posted by libralibra at 2011-06-07 22:21:00:
gcc编译器跟我想的一样,你第二种情况是赋值操作,而非复制构造函数,因为g()返回一个q对象,左值p2已经存在了.应该不调用复制构造函数

[code] 调用复制构造函数
10      40
调用复制构造函数
100     800
3   ...

可能跟一些标准有关吧,毕竟书上也这么说的,所以需要找一些权威的书籍,查一下……
任风云变幻,我笑对人生!
8楼2011-06-07 22:35:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

【答案】应助回帖

★ ★ ★
余泽成(金币+3): 谢谢参与应助! 2011-06-08 16:13:32
微尘、梦想(金币+5): 谢谢~~ 2011-06-09 07:37:58
你记住一些规则和一些例外就可以理解了:
规则1:任何C++对象都需要由构造函数初始化,特别的,内建类型也支持初始化语法,如int n(0);
规则2:任何已经存在的C++对象都不再调用构造函数,对已经存在的对象赋值的结果就是调用operator=
但是,C++的语法导致了很多陷进。陷进之一就是,对这样的语法:
CODE:
class A{
      A(int i=0){}
};
A a1(7);         //case1
A a2 = A(7);   // case 2
A a3(A(7));   //case 3

三种情况实际上是等价的,第一种是最有效的方式;第二种的话,如果编译器不够聪明,就会先初始化A(7)和a2,然后对a2调用operator=,如果没有默认构造函数,就会出错;第三种情况就是第二种情况的后备,更加有效,而且即使屏蔽默认构造函数也不会有出错的风险。
当然,如果编译器足够聪明,就会阻止楼主往陷进里面跳了。所以,嗯,工欲善其事必先利其器啊
漩涡的中心有一块空地,空空的。
9楼2011-06-08 12:09:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

上面的例子改成struct A{A(int i = 0){}};更正下。
漩涡的中心有一块空地,空空的。
10楼2011-06-08 12:12:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 微尘、梦想 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 081200-11408-276学硕求调剂 +4 崔wj 2026-04-05 4/200 2026-04-05 20:29 by 啵啵啵0119
[考研] 22408 总分320,一篇论文二作,两个国三,求调剂 +3 Leomulufu 2026-04-04 5/250 2026-04-05 19:04 by chongya
[考研] 08专硕275调剂 +5 AaAa7420 2026-04-05 5/250 2026-04-05 18:01 by jkddd
[考研] 270分求调剂 +4 maxjxbsk 2026-04-01 4/200 2026-04-05 17:04 by yulian1987
[考研] 工科277分求调剂材料 +8 上了上了上哦 2026-04-05 9/450 2026-04-05 13:05 by wwytracy
[考研] 085600,321分求调剂 +10 大馋小子 2026-04-04 11/550 2026-04-05 08:25 by 544594351
[考研] 266分,一志愿电气工程,本科材料,求材料专业调剂 +11 哇呼哼呼哼 2026-04-01 12/600 2026-04-04 23:17 by 永字号
[考研] 求调剂 +6 朔朔话 2026-04-02 7/350 2026-04-04 19:16 by 蓝云思雨
[考研] 材料383求调剂 +5 郭阳阳阳成 2026-04-04 5/250 2026-04-04 19:06 by dongzh2009
[考研] 一志愿沪985,326分求调剂 +3 刘墨墨 2026-04-03 3/150 2026-04-04 11:16 by 悲伤的芋头
[考研] 材料调剂 +11 吴棂颖! 2026-04-03 11/550 2026-04-04 09:56 by 小小树2024
[考研] 0856调剂 +8 曲听筠 2026-03-30 8/400 2026-04-04 08:46 by tianyyysss
[考研] 11408,284分,二战真诚求调剂 +4 12.27 2026-04-02 4/200 2026-04-03 14:14 by dxiaoxin
[考研] 085501一志愿天工大,机械专硕求调剂,跨材料 +3 33上 2026-04-03 3/150 2026-04-03 14:08 by 1753564080
[考研] 农学考研求调剂 +3 dkdkxm 2026-04-01 3/150 2026-04-02 16:04 by wangjagri
[考研] 0710生物学,325求调剂 +3 mkkkkkl 2026-04-01 3/150 2026-04-02 09:48 by Jaylen.
[考研] 302求调剂一志愿北航070300,本科郑大化学 +8 圣日耳曼条 2026-04-01 11/550 2026-04-02 07:40 by chemdavid
[考研] 08工科,295,接受跨专业调剂 +6 lmnlzy 2026-03-31 6/300 2026-04-01 11:02 by 逆水乘风
[考研] 288资源与环境专硕求调剂,不限专业,有学上就行 +25 lllllos 2026-03-30 26/1300 2026-04-01 09:52 by 一只好果子?
[考研] 340求调剂 +4 希望如此i 2026-03-31 4/200 2026-03-31 16:40 by 690616278
信息提示
请填处理意见