c++构造函数详解--深拷贝与浅拷贝
2013-01-06 15:58
148 查看
四、附录(浅拷贝与深拷贝)
上面提到,如果没有自定义复制构造函数,则系统会创建默认的复制构造函数,但系统创建的默认复制构造函数只会执行“浅拷贝”,即将被拷贝对象的数据成员的值一一赋值给新创建的对象,若该类的数据成员中有指针成员,则会使得新的对象的指针所指向的地址与被拷贝对象的指针所指向的地址相同,delete该指针时则会导致两次重复delete而出错。下面是示例:
【浅拷贝与深拷贝】
#include <iostream.h>
#include <string.h>
class Person
{
public :
//
构造函数
Person(char *
pN)
{
cout << "一般构造函数被调用
!\n";
m_pName = new char[strlen(pN)
+ 1];
//在堆中开辟一个内存块存放pN所指的字符串
if(m_pName
!= NULL)
{
//如果m_pName不是空指针,则把形参指针pN所指的字符串复制给它
strcpy(m_pName ,pN);
}
}
//
系统创建的默认复制构造函数,只做位模式拷贝
Person(Person & p)
{
//使两个字符串指针指向同一地址位置
m_pName = p.m_pName;
}
~Person( )
{
delete m_pName;
}
private :
char *
m_pName;
};
void main(
)
{
Person man("lujun");
Person woman(man);
//
结果导致 man 和 woman 的指针都指向了同一个地址
//
函数结束析构时
//
同一个地址被delete两次
}
// 下面自己设计复制构造函数,实现“深拷贝”,即不让指针指向同一地址,而是重新申请一块内存给新的对象的指针数据成员
Person(Person & chs);
{
//
用运算符new为新对象的指针数据成员分配空间
m_pName=new char[strlen(p.m_pName)+
1]; //p应该改为chs
//m_pName 编译的时候编译器居然不认识,将private那儿申明的
char *
m_pName放在拷贝构造函数之上的位置就编译通过
if(m_pName)
{
//
复制内容
strcpy(m_pName ,chs.m_pName);
}
//
则新创建的对象的m_pName与原对象chs的m_pName不再指向同一地址了
}
以上代码编译没通过,更改之后通过#include <iostream> #include <string.h> using namespace std; class Person { private : char * m_pName; public : // 构造函数 Person(char * pN) { cout << "一般构造函数被调用 !\n"; m_pName = new char[strlen(pN) + 1]; //在堆中开辟一个内存块存放pN所指的字符串 if(m_pName != NULL) { //如果m_pName不是空指针,则把形参指针pN所指的字符串复制给它 strcpy(m_pName ,pN); } } Person(Person & chs) { // 用运算符new为新对象的指针数据成员分配空间 cout<<"复制构造函数被调用\n"; m_pName=new char[strlen(chs.m_pName)+ 1]; if(m_pName) { // 复制内容 strcpy(m_pName ,chs.m_pName); } // 则新创建的对象的m_pName与原对象chs的m_pName不再指向同一地址了 } ~Person( ) { cout << "析构函数~Person( )被调用 !\n"; delete m_pName; } }; int main( ) { Person man("lujun"); Person woman(man); return 0; }
运行结果:
C:\MinGW>g++ 03深拷贝与浅拷贝.cpp
03深拷贝与浅拷贝.cpp: 在函数‘int main()’中:
03深拷贝与浅拷贝.cpp:59:27: 警告:不建议使用从字符串常量到‘char*’的转换 [-Wwri
te-strings]
C:\MinGW>a.exe
一般构造函数被调用 !
复制构造函数被调用
析构函数~Person( )被调用 !
析构函数~Person( )被调用 !
参考:
/content/3670957.html
相关文章推荐
- C++拷贝(复制)构造函数详解
- C++ - explicit在构造函数的使用 及 详解
- C++ Primer Plus学习笔记之拷贝构造函数
- C++构造函数详解及显式调用构造函数
- C++之显式构造函数详解
- C++虚基类构造函数详解(调用顺序)之一
- C++虚基类构造函数详解(调用顺序)之一
- C++中拷贝(复制)构造函数和赋值运算符重载函数
- 【C++】C++问题——显式构造函数、常量引用返回值、深浅拷贝
- C++ 构造函数 深拷贝和浅拷贝的区别和用途
- C++内存拷贝函数详解(转载的)
- C++自定义拷贝(复制)构造函数的用途
- C++拷贝构造函数(深拷贝与浅拷贝)详解
- 详解C++ 编写String 的构造函数、拷贝构造函数、析构函数和赋值函数
- c++中内存拷贝函数详解
- C++中构造函数与析构函数的调用顺序详解
- C++中拷贝构造函数、浅拷贝与深拷贝的详解
- C++中的构造函数与拷贝构造的优化处理
- C++ 类的构造函数详解及实例