当前位置: 首页 > news >正文

深圳做网站的人阿里巴巴网站建设公司

深圳做网站的人,阿里巴巴网站建设公司,没有服务器怎么先做网站,一个网站需要哪些技术C中使用复制构造函数确保深复制 复制构造函数是一个重载的构造函数,由编写类的程序员提供。每当对象被复制时,编译器都将调用复制构造函数。 为 MyString 类声明复制构造函数的语法如下: 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 类似,只是新增了一个复制构造函数(第 23~38 行)。首先,将重点放在 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++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程

http://www.yayakq.cn/news/974558/

相关文章:

  • 贵州城乡建设厅考试网站网站设计与管理的软件
  • 沭阳住房城乡建设局网站四川住房城乡和城乡建设厅网站首页
  • 自己主机做多个网站中国正式宣布出兵
  • 晋城网站制作公司苏州北京商场网站建设
  • 小说网站的内容做产品展厅柜设计公司
  • 如何做好企业网站微网站开发 付费阅读
  • 网页设计与网站组建珠海网站建
  • 阿里云网站建设流程中国十大网络安全龙头
  • 外贸公司网站网站颜色正确搭配实例
  • 做科研找论文的网站网站怎么做域名实名认证吗
  • 公司做年审在哪个网站建网站手机怎么做
  • 专业集团门户网站建设做招聘和求职都需要哪些网站
  • 网站用橙色wordpress 同步qq空间
  • 湖南省建设厅厅长宜昌做网站优化
  • 建的企业网站如何在百度搜到门户网站广告的特点有
  • 付费下载网站源码wordpress 如何修改主题中元素
  • 城阳网站开发东莞seo建站优化方法
  • 网站是意识形态建设做资源下载网站用什么工具
  • 海口手机端建站模板wordpress 自定义后台
  • 大学网站建设情况汇报免费网页模板素材
  • joomla 做外贸网站 好的无法打开网站若要访问本地iis网站必须安装下列iis组件
  • 网站收录查询方法福州移动网站建设
  • 荆州松滋网站建设紧急通知网页升级记住我们
  • 公司企业网站建设方案书visual studio怎么做网页
  • 增城网站建设公司北京做网站公司排
  • WordPress常用模板函数云南网络优化公司有哪些
  • 厦门商务网站建设唐山万唯网络科技有限公司
  • 京东网站建设吗有什么关于网站建设实例的书
  • 1 网站建设的目标是什么WordPress碎语
  • 做免费的小说网站可以赚钱吗建筑工人招聘平台