注册 登录
编程论坛 C++教室

有复制构造函数时最后析构函数的顺序问题

xxmmxmxm 发布于 2013-08-19 19:59, 539 次点击
#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

求指教,哪里弄错了,第一次发帖哈哈
3 回复
#2
xxmmxmxm2013-08-19 20:16
忘了在析构函数里加 delete [] pname;
不加这行代码问题也不大啊,my1和创建的副本对象的pname都指向同一个字符串
#3
rjsp2013-08-20 09:00
输出结果是(这个荅?什么的是乱码):
----------- 因为你的“复制构造函数”中根本没有初始化pname

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

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