C++中的浅复制与深复制
2009-04-27 12:48
162 查看
转载自 天之痕
C++中的浅复制与深复制收藏
默认构造函数将作为参数传入的对象的每个成员变量复制到新对象的成员变量中,这被称为成员浅复制。这虽然对大多数成员变量可行,但对于指向自由存储区中对象的指针成员变量不可行。
成员浅复制只是将对象成员变量的值复制到另一个对象中,两个成员变量的指针最后指向同一个内存块,当其中任何一个指针被delete时,将生成一个迷途指针,程序将处于危险之中。如图:
假如旧对象指针成员变量所指堆内存被释放后,此时新对象指针成员变量仍指向该内存块,这是不合法的。这种情况的解决办法是:创建自己的复制构造函数并根据需要来分配内存。分配内存后,可以将原对象的值复制到新内存中。这称之为深层复制。
程序实例如下:
#include <iostream>
using namespace std;
class Cat
{
public:
Cat();
Cat(const Cat &);
~Cat();
int GetAge() const { return *itsAge; }
int GetWeight() const { return *itsWeight; }
void SetAge(int age) { *itsAge=age; }
private:
int *itsAge; //实际编程并不会这样做,
int *itsWeight; //我仅仅为了示范
};
Cat::Cat()
{/*构造函数,在堆中分配内存*/
itsAge=new int;
itsWeight=new int;
*itsAge=5;
*itsWeight=9;
}
Cat::Cat(const Cat & rhs)
{/*copy constructor,实现深层复制*/
itsAge=new int;
itsWeight=new int;
*itsAge=rhs.GetAge();
*itsWeight=rhs.GetWeight();
}
Cat::~Cat()
{
delete itsAge;
itsAge=0;
delete itsWeight;
itsWeight=0;
}
int main()
{
Cat Frisky;
cout << "Frisky's age: "<<Frisky.GetAge()<<endl;
cout << "Setting Frisky to 6.../n";
Frisky.SetAge(6);
cout << "Create Boots from Frisky/n";
Cat Boots=Frisky; //or Cat Boots(Frisky);
cout << "Frisky's age: " <<Frisky.GetAge()<<endl;
cout << "Boots' age : "<<Boots.GetAge()<<endl;
cout << "Set Frisky to 7.../n";
Frisky.SetAge(7);
cout << "Frisky's age: "<<Frisky.GetAge()<<endl;
cout << "Boots' age: "<<Boots.GetAge()<<endl;
return 0;
}
//输出:
//Frisky's age: 5
//Setting Frisky to 6...
//Create Boots from Frisky
//Frisky's age: 6
//Boots' age : 6
//Set Frisky to 7...
//Frisky's age: 7
//Boots' age: 6
C++中的浅复制与深复制收藏
默认构造函数将作为参数传入的对象的每个成员变量复制到新对象的成员变量中,这被称为成员浅复制。这虽然对大多数成员变量可行,但对于指向自由存储区中对象的指针成员变量不可行。
成员浅复制只是将对象成员变量的值复制到另一个对象中,两个成员变量的指针最后指向同一个内存块,当其中任何一个指针被delete时,将生成一个迷途指针,程序将处于危险之中。如图:
假如旧对象指针成员变量所指堆内存被释放后,此时新对象指针成员变量仍指向该内存块,这是不合法的。这种情况的解决办法是:创建自己的复制构造函数并根据需要来分配内存。分配内存后,可以将原对象的值复制到新内存中。这称之为深层复制。
程序实例如下:
#include <iostream>
using namespace std;
class Cat
{
public:
Cat();
Cat(const Cat &);
~Cat();
int GetAge() const { return *itsAge; }
int GetWeight() const { return *itsWeight; }
void SetAge(int age) { *itsAge=age; }
private:
int *itsAge; //实际编程并不会这样做,
int *itsWeight; //我仅仅为了示范
};
Cat::Cat()
{/*构造函数,在堆中分配内存*/
itsAge=new int;
itsWeight=new int;
*itsAge=5;
*itsWeight=9;
}
Cat::Cat(const Cat & rhs)
{/*copy constructor,实现深层复制*/
itsAge=new int;
itsWeight=new int;
*itsAge=rhs.GetAge();
*itsWeight=rhs.GetWeight();
}
Cat::~Cat()
{
delete itsAge;
itsAge=0;
delete itsWeight;
itsWeight=0;
}
int main()
{
Cat Frisky;
cout << "Frisky's age: "<<Frisky.GetAge()<<endl;
cout << "Setting Frisky to 6.../n";
Frisky.SetAge(6);
cout << "Create Boots from Frisky/n";
Cat Boots=Frisky; //or Cat Boots(Frisky);
cout << "Frisky's age: " <<Frisky.GetAge()<<endl;
cout << "Boots' age : "<<Boots.GetAge()<<endl;
cout << "Set Frisky to 7.../n";
Frisky.SetAge(7);
cout << "Frisky's age: "<<Frisky.GetAge()<<endl;
cout << "Boots' age: "<<Boots.GetAge()<<endl;
return 0;
}
//输出:
//Frisky's age: 5
//Setting Frisky to 6...
//Create Boots from Frisky
//Frisky's age: 6
//Boots' age : 6
//Set Frisky to 7...
//Frisky's age: 7
//Boots' age: 6
相关文章推荐
- C++ 复杂链表的复制
- c++ 类初始化列表,构造函数,复制构造函数
- C++文件的复制
- 【C++ rimer 学习笔记】ch13 复制控制
- C++中对象作为函数形参,返回值时,构造函数,复制构造函数,析构函数的调用顺序(1)
- C++IO对象不可复制或赋值
- C++ 类型自动转换 构造函数 复制构造函数 赋值操作运算符函数
- [并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]
- 【C++】把map复制给vector和直接输出map的key和value
- C++走向远洋——40(第九周,深复制体验)
- 2013级C++第7周(春)项目——深复制、友元、模板 【项目2-体验常成员函数】
- 2013级C++第7周(春)项目——深复制、友元、模板 【项目3-成员函数、友元函数和一般函数有区别】
- C++之--拷贝(复制)构造函数
- C++中复制构造函数与重载赋值操作符总结
- c++OOP之复制控制 ------复制构造函数、赋值重载、析构
- c++ 构造函数深层复制示例
- c++中vector的=(赋值)操作是深复制
- C++复习 13 复制控制
- 2、C++ 实现文件复制(非类实现)
- C++ 实现文件的复制和移动