标题:不散分,100分只给一个人(疑惑在代码中)
只看楼主
mengcan555
Rank: 4
等 级:业余侠客
帖 子:104
专家分:253
注 册:2011-9-17
得分:0 
Input(A);把A传递过去,对A有影响吗?
2011-10-02 17:00
hoho568
Rank: 5Rank: 5
等 级:职业侠客
帖 子:101
专家分:378
注 册:2009-7-14
得分:0 
以下是引用QQ346957135在2011-10-2 16:49:19的发言:

你给的例子运行出现了,我分析了一下在对象的赋值时,类的数据成员中不能包括动态分配的数据,否则在最后析构时由于“浅复制”会出现错误,程序不能正常运行。

对,是存在那个问题。我写这个例子主要是为了验证临时对象的析构过程。


而在你的程序中之所以没有被析构,就是相当于把临时对象给了B;即B指向这个临时变量,从而完成初始化过程。
类似于引用。

注意一下,因为system("pause");所以A和B的析构函数还没有调用,不要误解了。

[ 本帖最后由 hoho568 于 2011-10-2 17:03 编辑 ]
2011-10-02 17:02
hoho568
Rank: 5Rank: 5
等 级:职业侠客
帖 子:101
专家分:378
注 册:2009-7-14
得分:0 
以下是引用QQ346957135在2011-10-2 16:58:16的发言:

输出的第一个destructor是析构临时对象的,后面两个析构B和A,哪儿输出了?


形参temp,就是你函数里面的那个temp。
2011-10-02 17:17
hoho568
Rank: 5Rank: 5
等 级:职业侠客
帖 子:101
专家分:378
注 册:2009-7-14
得分:0 
一般而言,拷贝构造函数就是构造函数+赋值操作; 所以会生成一个临时变量。
对象作为形参传入函数中,构造的那个对象就是函数里面的实参。所以中间没有临时变量。。
2011-10-02 17:19
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
Mack2
Rank: 1
来 自:山东
等 级:新手上路
帖 子:8
专家分:2
注 册:2010-11-26
得分:0 
constructor.  构造A
hello  输出A
copy constructor.   构造input函数的那个形参temp
Please input the string:abcd
copy constructor.  构造B
destructor.  析构temp
hello  输出A
abcd 输出B
destructor.  析构B
destructor.  析构A
过程很清晰,楼主怎么说临时对象temp没有析构呢。我修改一点你的程序,更容易理解
程序代码:
#include<iostream>
using namespace std;
class CStrtemp
{
public:
    CStrtemp():str(NULL){
    }//无参数构造函数
    CStrtemp(char *s);
    CStrtemp(const CStrtemp&);
    ~CStrtemp();
    void show();
    void set(char *s);
    CStrtemp Input();
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 CStrtemp::Input()
{
    char s[20];
    cout<<"Please input the string:";
    cin>>s;
    CStrtemp temp;//创建临时对象
    temp.set(s);
    return temp;//调用拷贝构造函数之后调用析构函数析构temp
}

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

2011-10-02 17:54
hoho568
Rank: 5Rank: 5
等 级:职业侠客
帖 子:101
专家分:378
注 册:2009-7-14
得分:0 
你可以按照楼上的方式理解。其实那个临时变量就是给了B。。。前面已经解释的很清楚了,相当于把那块内存空间给了B。
2011-10-02 18:03
hoho568
Rank: 5Rank: 5
等 级:职业侠客
帖 子:101
专家分:378
注 册:2009-7-14
得分:0 
以下是引用QQ346957135在2011-10-2 17:42:22的发言:

我修改了部分代码明白了形参在函数结束后会析构,但临时对象到底是怎么一回事,好像复制给B后没有析构,我有点不明白,应该析构的。


这个临时变量就是B。。相当于把这块内存给了B。。也就是B的值。。所以我前面说相当于引用。。
假设这个临时变量是t ..相当于 b = &t;就是说B就是这块内存空间。。。
楼上有几位的解释说那个拷贝构造函数是构造B,不能完全说是错误的。。因为那块的确给了B。不过是临时对象的。
2011-10-02 18:06
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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-351449-1-1.html




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

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