网站首页 > 基础教程 正文
1 浅拷贝和深拷贝
1)如果一个类包含指针形式的成员变量,缺省拷贝构造函数只是复制了指针成员变量的本身,而没有复制指针所指向的内容,这种拷贝称为浅拷贝。
class STRING
{
public:
STRING( const char* s = "" ) :_str( new char[strlen(s)+1] )
{
strncpy( _str, s, strlen(s)+1 );
}
~STRING()
{
cout << "~STRING" << endl;
if (_str)
{
delete[] _str;
_str = NULL;
}
}
void show()
{
printf ("_str = %s\n", _str);
}
private:
char* _str;
};
想要学习更多C/C++编程知识,可以加入C/C++学习交流群:1121175506和大家一起交流学习。
2)浅拷贝将导致不同对象间的数据共享,同时会在析构函数中引发 "double free" 异常。因此必须提供一个支持复制内容的深拷贝构造函数。
浅拷贝原理:
int* p1 = new int(100);
int* p2 = p1;
delete p1;
delete p2; //erroe, double free
深拷贝原理:
int* p1 = new int(100);
int* p2 = new int(*p1);
delete p1;
delete p2; //ok
浅拷贝构造函数
STRING( const STRING& s )
{
_str = s._str;
}
深拷贝构造函数
STRING( const STRING& s )
{
_str = new char[strlen(s._str) + 1];
strncpy( _str, s._str, strlen(s._str) + 1 );
}
想要学习更多C/C++编程知识,可以加入C/C++学习交流群:1121175506和大家一起交流学习。
2 深拷贝赋值和浅拷贝赋值
拷贝赋值函数即对赋值运算符的重载。
类的缺省拷贝赋值和缺省的拷贝构造一样,是浅拷贝,为了得到深拷贝效果,防止现"double free"异常,就需要自己定义一个支持深拷贝的拷贝赋值函数,其步骤如下:
类名& operator = (const 类名& that) {
1)防止自赋值
3)释放旧资源
2)分配新资源
4)赋值新内容
5)返回自引用
*6)复用深拷贝构造和析构
}
浅拷贝赋值函数:
STRING& operator = (const STRING& s)
{
if (this != &s)
{
this->_str = s._str;
}
return *this;
}
深拷贝赋值函数:
STRING& operator = (const STRING& s)
{
if (this != &s)
{
delete[] _str;
this->_str = new char[strlen(s._str) + 1];
strncpy(this->_str, s._str, strlen(s._str) + 1);
}
return *this;
}
想要学习更多C/C++编程知识,可以加入C/C++学习交流群:1121175506和大家一起交流学习。
猜你喜欢
- 2024-10-12 全面剖析 C++ Boost 智能指针!| CSDN 博文精选
- 2024-10-12 C++设计模式——原型模式 设计模式之原型模式
- 2024-10-12 如何攻克 C++ 中复杂的类型转换? c++中四种类型转换的方式
- 2024-10-12 C++|由成员函数到运算符重载(类内、类外、友元方式重载)
- 2024-10-12 C++11新特性(49)- 用移动类对象代替拷贝类对象
- 2024-10-12 C++类的默认成员函数 c++类中定义的成员默认访问属性为( )
- 2024-10-12 C++的23种设计模式(上篇-创建型模式)
- 2024-10-12 C++构造函数和析构函数详解 c语言构造函数和析构函数
- 2024-10-12 c++——默认成员函数 c++成员变量默认值
- 2024-10-12 C++|类中实现操作符重载,用操作符代替成员函数名
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)