游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3572|回复: 11

[求助]C++高手请进

[复制链接]

2

主题

7

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2004-7-30 22:30:00 | 显示全部楼层 |阅读模式
高手请解释下为什么下面的代码不能得到正确结果。(在思考用值传递时候要用到复制构造函数时发现的问题)
#include <iostream>
using namespace std;
class Cat
{
public:
        Cat(int age);
        Cat(Cat&);
        ~Cat();
        int getage() const {return itsage;}
private:
        int itsage;
};
Cat::Cat(int age)
{
        itsage=age;
        cout <<"构造"<<endl;
}
Cat::Cat(Cat&)
{
        cout <<"复制构造"<<endl;
}
Cat::~Cat()
{
        cout <<"析构"<<endl;
}
Cat function();
int main()
{
        Cat sky(100);
        cout <<sky.getage()<<endl;
    sky=function();
        cout <<sky.getage()<<endl;
        return 0;
}
Cat function()
{
        Cat asky(200);
        return asky;
}
//如果把复制构造函数给注释掉,就能得到正确结果。

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-7-31 03:07:00 | 显示全部楼层

Re:[求助]C++高手请进

应该是没有为参数命名的原因吧?

21

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2004-7-31 07:45:00 | 显示全部楼层

Re:[求助]C++高手请进

Cat&是什么?
小弟初学C++也来凑个热闹!

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2004-7-31 09:55:00 | 显示全部楼层

Re:[求助]C++高手请进

要参数的,而且你还得为复制构造定义行为

2

主题

7

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2004-7-31 13:08:00 | 显示全部楼层

Re:[求助]C++高手请进

Cat(Cat&);是复制构造函数,在进行对象的值传递时要用的,
函数在声明时可以不用给参数命名的,它只说明参数的类型就可以,参数名是不被电脑读取的。

“要参数的,而且你还得为复制构造定义行为”,楼上的能具体写出来么?简单的形式就可以。为什么我注释掉复制构造函数后,反而能运行正确?

3

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
发表于 2004-7-31 13:34:00 | 显示全部楼层

Re: [求助]C++高手请进

int main()
{
    Cat sky(100);                        [1]
    cout <<sky.getage()<<endl;           [2]     
    sky=function();                      [3]
    cout <<sky.getage()<<endl;           [4]
    return 0;                            [5]
}

Cat function()
{
    Cat asky(200);                       [3][1]
    return asky;                         [3][2]
}

[1]    构造(sky)
[2]    100
[3][1] 构造(asky)
[3][2] 拷贝构造(asky->未命名)
       析构(asky)
       析构(未命名)
[3]    sky = 已经被析构的"未命名"
[4]    值不确定
[5]    析构(sky) [em2]

3

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
发表于 2004-7-31 13:38:00 | 显示全部楼层

Re: [求助]C++高手请进

#include <iostream>
using namespace std;
class Cat
{
public:
Cat(int age);
Cat(Cat&);
~Cat();
int getage() const {return itsage;}
private:
int itsage;
};
Cat::Cat(int age)
{
itsage=age;
cout <<"构造"<<endl;
}
Cat::Cat(Cat&)
{
cout <<"复制构造"<<endl;
}
Cat::~Cat()
{
cout <<"析构"<<endl;
}
Cat& function();
int main()
{
Cat sky(100);
cout <<sky.getage()<<endl;
    sky=function();
cout <<sky.getage()<<endl;
return 0;
}
Cat& function()
{
Cat asky(200);
return asky;
}

==================================
改变了Cat& function();
有一定的危险性,因为function()完了后asky已经析构,引用
析构的地址是很危险的.
==================================

2

主题

7

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2004-7-31 16:13:00 | 显示全部楼层

Re:[求助]C++高手请进

谢谢楼上,
我是想用值传递的方式把局部对象asky返回,如果按上面用引用返回是错误的,因为局部对象被销毁后其引用还存在是错误的语法,
Cat &sky=function();
Cat &function()
{
   Cat asky(200);
   return asky;
}
上面的是错误的,用new也不行,

2

主题

7

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2004-7-31 16:18:00 | 显示全部楼层

Re:[求助]C++高手请进

int main()
{
    Cat sky(100);                        [1]
    cout <<sky.getage()<<endl;           [2]     
    sky=function();                      [3]
    cout <<sky.getage()<<endl;           [4]
    return 0;                            [5]
}

Cat function()
{
    Cat asky(200);                       [3][1]
    return asky;                         [3][2]
}

[1]    构造(sky)
[2]    100
[3][1] 构造(asky)
[3][2] 拷贝构造(asky->未命名)
       析构(asky)
       析构(未命名)
[3]    sky = 已经被析构的"未命名"
[4]    值不确定
[5]    析构(sky)

“未命名”是什么意思?
为什么我把复制构造函数注释掉了,程序运行却是正确的。
下面的可以正常运行
#include <iostream>
using namespace std;
class Cat
{
public:
Cat(int age);
//Cat(Cat&);
~Cat();
int getage() const {return itsage;}
private:
int itsage;
};
Cat::Cat(int age)
{
itsage=age;
cout <<"构造"<<endl;
}
/*Cat::Cat(Cat&)
{
cout <<"复制构造"<<endl;
}*/
Cat::~Cat()
{
cout <<"析构"<<endl;
}
Cat function();
int main()
{
Cat sky(100);
cout <<sky.getage()<<endl;
    sky=function();
cout <<sky.getage()<<endl;
return 0;
}
Cat function()
{
Cat asky(200);
return asky;
}

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-7-31 16:26:00 | 显示全部楼层

Re:[求助]C++高手请进

你在复制构造的时候需要对itsage赋值。
这样写就好了:
Cat::Cat(Cat& a)
{
cout <<"复制构造"<<endl;
itsage = a.getage();
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-4 11:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表