64,654
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
class B
{
public:
char* str;
B(){}
B(char* s)
{
str = s;
}
~B()
{
printf("B\n");
delete str;
}
};
class A
{
public:
B b;
A(){}
A(B bb)
{
b = bb;
}
~A()
{
printf("A\n");
}
};
int main()
{
char* objectStr = new char[5];
for(int i = 0; i < 4; i++)
objectStr[i] = 'a';
objectStr[4] = '\0';
B* objectB = new B(objectStr);
printf("%s\n", objectB->str);
A* objectA = new A(*objectB);
//delete objectA;
/*delete objectB;
delete objectA;*/
//printf("%s", objectB->str);
printf("%s\n", objectB->str);
return 0;
}
/*
1. 主要是B的默认拷贝构造函数没有处理好指针,发生了str已被析构,程序的
最后语句要求打印(printf("%s\n", objectB->str);)。
2. 从新定义一个B(const B& temp)和重载一个 = 赋值运算符,采用深层复制的方法,就可以了。
*/
#include <iostream>
#include <cstring>
using namespace std;
class B
{
public:
char* str;
B(){}
B & operator=(const B& x)
{
cout<<"调用赋值运算符重载"<<endl;
if (this != &x)
{
str=new char [strlen(x.str)+1];
strcpy(str , x.str);
}
return *this;
}
B(const B& temp)
{
cout<<"调用拷贝构造函数"<<endl;
str=new char [strlen(temp.str)+1];
strcpy(str , temp.str);
}
B(char* s)
{
if (s==NULL)
{
str=new char [2];
strcpy(str,"");
}
else
{
str=new char [strlen (s)+1];
strcpy( str, s);
}
}
~B()
{
printf("B\n");
delete str;
str=NULL;
}
};
class A
{
public:
B b;
A(){}
A(B bb)
{
cout<<"A生成了"<<endl;
b = bb;
}
~A()
{
printf("A\n");
}
};
int main()
{
char* objectStr = new char[5];
for(int i = 0; i < 4; i++)
objectStr[i] = 'a';
objectStr[4] = '\0';
B* objectB = new B(objectStr);//这是第一个B
printf("%s\n", objectB->str);
A* objectA = new A(*objectB);//括弧里的*objectB先调用B的拷贝构造函数
// 然后调用=运算符重载。
printf("%s\n", objectB->str);//仍然可以打出第一个B的str。
delete objectA;//delete A,然后A里的B也被析构了。
delete objectB;//delete 这是第一个B。
return 0;
}
A(B& bb)
{
b = bb;
}