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

昌吉市建设局网站软文写作要求

昌吉市建设局网站,软文写作要求,做剧情游戏的网站,淄川政府网站建设哪家专业使用动态内存的一个常见原因是允许多个对象共享相同的状态。 例如,假定我们希望定义一个名为Blob 的类,保存一组元素。与容器不同,我们希望Blob对象的不同拷贝之间共享相同的元素。即,当我们拷贝一个Blob时,原Blob对象…

使用动态内存的一个常见原因是允许多个对象共享相同的状态。

例如,假定我们希望定义一个名为Blob 的类,保存一组元素。与容器不同,我们希望Blob对象的不同拷贝之间共享相同的元素。即,当我们拷贝一个Blob时,原Blob对象及其拷贝应该引用相同的底层元素。现在我们先定义一个管理string的类,此版本命名为StrBlob

定义 StrBlob类

实现一个新的集合类型的最简单方法是使用某个标准库容器来管理元素。采用这种方法,我们可以借助标准库类型来管理元素所使用的内存空间。在本例中,我们将使用vector来保存元素。

但是,我们不能在一个Blob对象内直接保存vector,因为一个对象的成员在对象销毁时也会被销毁。例如,

  • 假定b1 b2是两个Blob对象,共享相同的vector
  • 如果此vector保存在其中一个Blob中——例如b2中,那么当b2离开作用域时,此vector也将被销毁,也就是说其中的元素都将不复存在。为了保证 vector中的元素继续存在,我们将vector保存在动态内存中。

为了实现我们所希望的数据共享,我们为每个StrBlob设置一个shared_ptr来管理动态分配的 vector。此 shared_ptr的成员将记录有多少个StrBlob 共享相同的vector,并在vector的最后一个使用者被销毁时释放vector

我们还需要确定这个类应该提供什么操作。当前,我们将实现一个vector操作的小的子集。我们会修改访问元素的操作(如 frontback): 在我们的类中,如果用户试图访问不存在的元素,这些操作会抛出一个异常。

我们的类有一个默认构造函数和一个构造函数,接受单一的 initializer_list<string>类型参数。此构造函数可以接受一个初始化器的花括号列表

initializer_list对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值。在进行函数调用的时候需要使用花括号将所有的参数括起来。

class StrBlob{
public:typedef std::vector<std::string>::size_type size_type;StrBlob();StrBlob(std::initializer_list<std::string> il);size_type size() const { return data->size(); }bool empty() const { return data->empty(); }//添加和删除元素void push_back(const std::string &t){ data->push_back(t); }void pop_back();//元素访问std::string& front();std::string& back();private:std::shared_ptr<std::vector<std::string>> data;//如果data[i]不合法,抛出一个异常void check(size_type i, const std::string &msg) const;
};

在此类中,我们实现了sizeemptypush_back成员。这些成员通过指向底层vectordata成员来完成它们的工作。例如,对一个 StrBlob对象调用size()会调用data->size(),依此类推。

StrBlob构造函数

两个构造函数都使用初始化列表来初始化其data成员,令它指向一个动态分配的vector。默认构造函数分配一个空vector:

StrBlob::StrBlob() : data(make_shared<vector<string>>()){ }
StrBlob::StrBlob(initializer_list<string> il): data(make_shared<vector<string>>(il)) { }

接受一个initializer_list的构造函数将其参数传递给对应的vector构造函数。此构造函数通过拷贝列表中的值来初始化vector的元素。

元素访问成员函数

pop_backfrontback操作访问vector中的元素。这些操作在试图访问元素之前必须检查元素是否存在。由于这些成员函数需要做相同的检查操作,我们为StrBlob定义了一个名为checkprivate工具函数,它检查一个给定索引是否在合法范围内。除了索引,check还接受一个string参数,它会将此参数传递给异常处理程序,这个string描述了错误内容:

void StrBlob::check(size_type i, const string &msg) const
{if(i >= data->size())throw out_of_range(msg);
}

pop_back元素访问成员函数首先调用check。如果check成功,这些成员函数继续利用底层vector的操作来完成自己的工作:

string& StrBlob::front()
{//如果vector为空,check会抛出一个异常check(0, "front on empty StrBlob");return data->front();
}
string& StrBlob::back()
{check(0, "back on empty StrBlob");return data->back();
}
void StrBlob::pop_back()
{check(0, "pop_back on empty StrBlob");data->pop_back();
}

StrBlob 的拷贝、赋值和销毁

StrBlob使用默认版本的拷贝、赋值和销毁成员函数来对此类型的对象进行这些操作。默认情况下,这些操作拷贝、赋值和销毁类的数据成员。
我们的StrBlob类只有一个数据成员,它是shared_ptr类型。因此,当我们拷贝、赋值或销毁一个 StrBlob对象时,它的shared_ptr成员会被拷贝、赋值或销毁。

  • 拷贝一个shared_ptr会递增其引用计数;
  • 将一个shared_ptr赋予另一个shared_ptr会递增赋值号右侧shared_ptr的引用计数,而递减左侧shared_ptr的引用计数。
  • 如果一个shared_ptr的引用计数变为0,它所指向的对象会被自动销毁。因此,对于由 StrBlob构造函数分配的vector,当最后一个指向它的StrBlob对象被销毁时,它会随之被自动销毁。

注:仅供学习参考,如有不足,欢迎指正!

http://www.shuangfujiaoyu.com/news/43490.html

相关文章:

  • 佰汇康网站建设店铺推广软文300字
  • 单页网站怎么做有友情链接的网站
  • 网站正在建设中mp4怎么注册网站免费的
  • 郓城住房和城乡建设厅网站烟台seo关键词排名
  • 北京做网站的大公司今日热点新闻2022
  • 网站首页开发收费关键词完整版免费听
  • 优质网站建设哪家好seo系统是什么意思
  • 招聘网站怎么做吸引人最新的军事新闻
  • 珠海网站建设多少钱疫情最新政策最新消息
  • 网站制作哪家好成都关键词优化排名
  • 用linux做网站重庆网站推广
  • 创建wordpress主题seo网站优化流程
  • 怎么做微信电影网站石家庄seo报价
  • 网站推荐靠谱的懂得免费网站建设费用明细表
  • 免费做兼职的网站有吗淘宝指数查询工具
  • 泰国如何做网站推广内存优化大师
  • wix做网站教程千锋教育怎么样
  • 做影视网站怎么样不犯法注册网站免费注册
  • 做试管婴儿的网站郑州中原区最新消息
  • 怎么用自己电脑做服务器发布网站搭建网站平台需要多少钱
  • 亚马逊用什么网站上传做新品好软文媒体
  • 武汉网站建设网站网络推广有哪些常见的推广方法
  • wordpress建站案例视频教程庆云网站seo
  • 沃尔玛超市佛山seo按效果付费
  • 小米公司网站前建设分析济南特大最新消息
  • 怎么做像天猫类似的网站软文小故事200字
  • b2c商城网站建设国内永久免费云服务器
  • wordpress.com打不开百度搜索怎么优化
  • 商务网站策划 网站目标与经营模式定位泰安百度推广电话
  • 建筑素材网站中国疾控卫生应急服装