#include <iostream>
using namespace std;
class Name {
public:
Name(const char* pname) {
size = strlen(pname);
pName = (char*)malloc(size + 1);
strcpy(pName, pname);
}
Name(const Name& obj) {
// 用对象obj初始化自己
pName = (char*)malloc(obj.size + 1);
strcpy(pName, obj.pName);
size = obj.size;
}
~Name() {
cout << "析构函数" << endl;
if (pName != NULL) {
free(pName);
pName = NULL;
size = 0;
}
}
void operator=(Name& obj3) {
cout << "operator=..." << endl;
// 注意:
// 在赋值pName之前,free释放内存,避免内存泄露
if (pName != NULL) {
free(pName);
pName = NULL;
size = 0;
}
// 用对象obj3来=号赋值自己
pName = (char*)malloc(obj3.size + 1);
strcpy(pName, obj3.pName);
size = obj3.size;
}
protected:
private:
char* pName;
int size;
};
// 对象的初始化和对象之间=号操作是两个不同的概念
void test() {
Name obj1("obj1.....");
// 创建并初始化(会调用copy构造函数)
Name obj2 = obj1; // 如果没有写copy构造函数是报错,应为c++编译器浅copy导致错误
Name obj3("obj3...");
//
obj2 = obj3; // =号赋值(没有调用copy构造函数),此处会报错,修复方法:重载=号操作符
cout << "业务操作....." << endl;
}
void main() {
test();
system("pause");
}
Demo2
#include <iostream>
using namespace std;
class Test {
public:
// 如果自定义了构造函数,那么编译器不会提供无参的构造函数
Test(Test& obj) {
cout << "我是copy构造函数" << endl;
a = obj.a;
b = obj.b;
}
Test(int _a, int _b) {
a = _a;
b = _b;
}
protected:
private:
int a;
int b;
};
void main() {
Test t1;
//Test t2;
//Test t3 = t2;
system("pause");
}
这篇博客探讨了C++中类的构造函数、拷贝构造函数以及赋值运算符的使用。通过示例代码展示了如何实现深拷贝以避免内存泄漏,并解释了对象初始化和赋值操作的区别。此外,还指出了在不自定义拷贝构造函数时可能出现的问题。
238

被折叠的 条评论
为什么被折叠?



