| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1426 人关注过本帖
标题:不散分,100分只给一个人(疑惑在代码中)
取消只看楼主 加入收藏
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:9 
不散分,100分只给一个人(疑惑在代码中)
程序代码:
#include<iostream>
using namespace std;
class CStrtemp
{
public:
    CStrtemp(char *s);
    CStrtemp(const CStrtemp&);
    ~CStrtemp();
    void show();
    void set(char *s);
private:
    char *str;
};
CStrtemp::CStrtemp(char *s)
{
    cout<<"constructor."<<endl;
    str=new char[strlen(s)+1];
    if(!str)
    {
        cout<<"Allocation Error."<<endl;
        exit(1);
    }
    strcpy(str,s);
}

CStrtemp::CStrtemp(const CStrtemp& temp)
{
    cout<<"copy constructor."<<endl;
    str=new char[strlen(temp.str)+1];
    if(!str)
    {
        cout<<"Allocation Error."<<endl;
        exit(1);
    }
    strcpy(str,temp.str);
}

CStrtemp::~CStrtemp()
{
    cout<<"destructor."<<endl;
    if(str!=NULL)
    {
        delete[] str;
    }
}

void CStrtemp::show()
{
    cout<<str<<endl;
}
void CStrtemp::set(char *s)
{
    delete[] str;
    str=new char[strlen(s)+1];
    if(!str)
    {
        cout<<"Allocation Error."<<endl;
        exit(1);
    }
    strcpy(str,s);
}
CStrtemp Input(CStrtemp temp)
{
    char s[20];
    cout<<"Please input the string:";
    cin>>s;
    temp.set(s);
    return temp;
}

int main()
{
    CStrtemp A("hello");
    A.show();
    CStrtemp B=Input(A);//此处对象B的创建不需要调用复制构造函数吗,形式上为对象复制的一般格式<类名><对象2>=<对象1>;,为什么没调用?
    A.show();
    B.show();
    return 0;
}


















图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 100分 cha 一个人 
2011-10-02 11:21
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
回复 2楼 hoho568
你的第二句话貌似能合理的解释我的问题,但不够充分;下面的说明我想指出一点,在函数内返回对象时调用了复制构造函数创建临时对象,再将临时对象的值复制给B,然后临时对象就析构了。所以有输出的第一个destructor。关于那个形参,传递实参时调用了一次复制构造函数,但没有析构。书上没说明这点,我猜想形参随着函数的调用结束本来就该释放内存的,所以没必要析构。我想再等等,看有没有跟充分的解释。

A real warrior never quits.
2011-10-02 15:48
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
回复 3楼 pangding
第二个copy constuctor不是构造B而是构造临时对象才调用的;书上有明确说明。

A real warrior never quits.
2011-10-02 15:50
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
回复 6楼 hoho568
那我想问一下,形参temp传递给临时对象后跑哪儿了,如果析构了的话怎么没输出destructor?

A real warrior never quits.
2011-10-02 16:30
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
回复 6楼 hoho568
你给的例子运行出现了,我分析了一下在对象的赋值时,类的数据成员中不能包括动态分配的数据,否则在最后析构时由于“浅复制”会出现错误,程序不能正常运行。

A real warrior never quits.
2011-10-02 16:49
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
回复 9楼 hoho568
输出的第一个destructor是析构临时对象的,后面两个析构B和A,哪儿输出了?

A real warrior never quits.
2011-10-02 16:58
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
回复 12楼 hoho568
你的意思是说临时对象没析构吗?

A real warrior never quits.
2011-10-02 17:29
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
回复 14楼 hoho568
我修改了部分代码明白了形参在函数结束后会析构,但临时对象到底是怎么一回事,好像复制给B后没有析构,我有点不明白,应该析构的。

A real warrior never quits.
2011-10-02 17:42
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
回复 17楼 Mack2
我说的临时对象不是temp,temp是形参,临时对象是返回对象时临时创建的。

A real warrior never quits.
2011-10-02 18:13
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
我懂了,刚在网上看到的。和hoho说的差不多。这部分没学好的请耐心看一下。
http://blog.

A real warrior never quits.
2011-10-02 19:03
快速回复:不散分,100分只给一个人(疑惑在代码中)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018667 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved