大理网站建设公司,扫描网站漏洞的软件,苏州做网站公司,建设网站技术标准C中使用复制构造函数确保深复制
复制构造函数是一个重载的构造函数#xff0c;由编写类的程序员提供。每当对象被复制时#xff0c;编译器都将调用复制构造函数。 为 MyString 类声明复制构造函数的语法如下#xff1a;
class MyString
{MyString(const MyString cop…C中使用复制构造函数确保深复制
复制构造函数是一个重载的构造函数由编写类的程序员提供。每当对象被复制时编译器都将调用复制构造函数。 为 MyString 类声明复制构造函数的语法如下
class MyString
{MyString(const MyString copySource); // copy constructor
};MyString::MyString(const MyString copySource)
{// Copy constructor implementation code
}复制构造函数接受一个以引用方式传入的当前类的对象作为参数。这个参数是源对象的别名您使用它来编写自定义的复制代码确保对所有缓冲区进行深复制如以下示例程序所示
#include iostream
#include string.h
using namespace std;class MyString
{
private:char* buffer;public:MyString() {}MyString(const char* initString) // constructor{buffer NULL;cout Default constructor: creating new MyString endl;if(initString ! NULL){buffer new char [strlen(initString) 1];strcpy(buffer, initString);cout buffer points to: 0x hex;cout (unsigned int*)buffer endl;}}MyString(const MyString copySource) // Copy constructor{buffer NULL;cout Copy constructor: copying from MyString endl;if(copySource.buffer ! NULL){// allocate own buffer buffer new char [strlen(copySource.buffer) 1];// deep copy from the source into local bufferstrcpy(buffer, copySource.buffer);cout buffer points to: 0x hex;cout (unsigned int*)buffer endl;}}MyString operator (const MyString addThis) {MyString newString;if (addThis.buffer ! NULL){newString.buffer new char[GetLength() strlen(addThis.buffer) 1];strcpy(newString.buffer, buffer);strcat(newString.buffer, addThis.buffer);}return newString;}// Destructor~MyString(){cout Invoking destructor, clearing up endl;delete [] buffer;}int GetLength() { return strlen(buffer); }const char* GetString(){ return buffer; }
};void UseMyString(MyString str)
{cout String buffer in MyString is str.GetLength();cout characters long endl;cout buffer contains: str.GetString() endl;return;
}int main()
{MyString sayHello(Hello from String Class);UseMyString(sayHello);return 0;
}输出
Default constructor: creating new MyString
buffer points to: 0x01232D90
Copy constructor: copying from MyString
buffer points to: 0x01232DD8
String buffer in MyString is 17 characters long
buffer contains: Hello from String Class
Invoking destructor, clearing up
Invoking destructor, clearing up分析
大多数代码都与程序清单 9.8 类似只是新增了一个复制构造函数第 2338 行。首先将重点放在 main( )上它与以前一样创建了对象 sayHello如第 65 行所示。创建 sayHello 导致了第 1 行输出这是由 MyString 的构造函数的第 12 行生成的。出于方便考虑这个构造函数还显示了 buffer 指向的内存地址。接下来 main( )将 sayHello 按值传递个函数 UseMyString( )如第 66 行所示这将自动调用复制构造函数输出指出了这一点。复制构造函数的代码与构造函数很像基本思想也相同检查 copySource.buffer 包含的 C 风格字符串的长度第 30 行分配相应数量的内存并将返回的指针赋给 buffer再使用 strcpy 将 copySource.buffer 的内容复制到 buffer第 33 行。这里并非浅复制复制指针的值而是深复制即将指向的内容复制到给当前对象新分配的缓冲区中。
程序的输出表明拷贝中的 buffer 指向的内存地址不同即两个对象并未指向同一个动态分配的内存地址。因此函数 UseMyString( )返回、形参 str 被销毁时析构函数对复制构造函数分配的内存地址调用 delete[] 而没有影响 main( )中 sayHello 指向的内存。 因此 这两个函数都执行完毕时成功地销毁了各自的对象没有导致应用程序崩溃。
该文章会更新欢迎大家批评指正。
推荐一个零声学院的C服务器开发课程个人觉得老师讲得不错 分享给大家LinuxNginxZeroMQMySQLRedis fastdfsMongoDBZK流媒体CDNP2PK8SDocker TCP/IP协程DPDK等技术内容 点击立即学习C/C后台高级服务器课程