标题:有复制构造函数时最后析构函数的顺序问题
只看楼主
xxmmxmxm
Rank: 2
等 级:论坛游民
帖 子:9
专家分:11
注 册:2013-8-19
结帖率:66.67%
已结贴  问题点数:20 回复次数:3 
有复制构造函数时最后析构函数的顺序问题
#include<iostream>
#include<string>
using std::cout;
using std::endl;
class my
{
private:
       char *pname;
       int len;
       static int mys;
public:
      my(char *p);
      my();
      ~my();
      my(const my&);
       void showp();
};
int my::mys=0;
my::my(const my & s)   //复制构造函数
{
    mys++;
    cout<<"this is copy hanshu:  ";
}
my::my(char *p)       //普通构造函数
{
    len=strlen(p);
    pname=new char[len+1];
    strcpy(pname,p);mys++;}

my::my()
{
    len=4;
    pname=new char[len];
    strcpy(pname,"C++");
    mys++;
}
void my::showp()    //自定义函数
{
    cout<<pname<<endl;
}
my::~my()           //析构函数
{
    mys--;cout<<pname<<" left"<<mys<<";\n";
}

void show(my s){s.showp();}    //自定义函数

int main()
{
    my my1="tets";
    show(my1);
}

输出结果是(这个荅?什么的是乱码):
this is copy hanshu:  荅
荅?left1;
tets left0;
Press any key to continue


有个地方不懂了,书上说自动存储对象被删除的顺序与创建顺序相反,那么理论上输出结果应该是这样的:
this is copy hanshu: tets
tets left1;
荅?left0;
Press any key to continue

求指教,哪里弄错了,第一次发帖哈哈
搜索更多相关主题的帖子: private include public 
2013-08-19 19:59
xxmmxmxm
Rank: 2
等 级:论坛游民
帖 子:9
专家分:11
注 册:2013-8-19
得分:0 
忘了在析构函数里加 delete [] pname;
不加这行代码问题也不大啊,my1和创建的副本对象的pname都指向同一个字符串
2013-08-19 20:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
输出结果是(这个荅?什么的是乱码):
----------- 因为你的“复制构造函数”中根本没有初始化pname

书上说自动存储对象被删除的顺序与创建顺序相反
----------- 先构造 my1,后来才有传值给 void show(my s),所以当然是输出 “荅?left1;” 然后才输出 “tets left0;”

说句题外话,教你C++的人或书是完完全全的外行,不要被那些误人子弟的家伙给骗了。
2013-08-20 09:00
alive050289
Rank: 2
等 级:论坛游民
帖 子:1
专家分:10
注 册:2013-8-19
得分:10 
使用strcpy输出会出现乱码,就像你那个“ 荅”和“荅?”其实都是"tets",
你得my()这个不带参数的构造函数不会执行,直接带参的构造函数,所以你这个打印出来的顺序是对的,只不过编译出现问题了,还有你还是多看看拷贝构造函数去吧
2013-08-20 12:03



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




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

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