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

单例模式、构造函数、左值右值

拷贝构造函数

简单的说就是——用一个对象构造另外一个对象

class Myclass
{
	public:
		int d=0;
		Myclass(int d_){d = d_};	//常用的构造函数
		Myclass(Myclass c) //拷贝构造函数
		{
			d = c.d;
		}
};
//对比
class Myclass
{
	public:
		int d=0;
		Myclass(int d_){d = d_};	//常用的构造函数
		Myclass(const Myclass& c) //高效安全的拷贝构造函数
		{
			d = c.d;
		}
};
//调用
int main()
{
	Myclass A(3);
	Myclass B(A);
}

简单的说一下,main中展示了两种构造对象的方式:
一种是用了一般构造函数,构造了对象A
一种是用了拷贝构造函数,利用A构造了对象B

这里注意一下,对比 展示了拷贝构造函数的写法,后者传入参数用了常引用,避免了一次形参到实参的拷贝,同时const保护了A在函数内不被意外修改。

左值右值(会转换)

左值:c++中可以取地址的,有名字的。
右值: 不可取地址,无名字

左值k变右值:std::move(k);

移动构造函数

先给一个简单的例子

class A
{
	public:
		int* a;
		A(){a=new int(2);}//普通的构造函数
		A(A&& a_out){a = a_out.a;a_out.a =nullptr;}//移动构造
		A(const A& c_){a = c_.a;c_.a = nullptr;};//拷贝构造
		~A(){if(a!=nullptr)delete a;}//析构函数
};
int main()
{
	A k = A();
  A ak = k;		
  A ck = std::move(ak);
}

这里A&& 类型我们称为右值引用。

A k = A();显然 A() 先调用了普通的构造函数,然而由于是个右值(因为没有变量)。用来初始化k对象,这里就调用了移动构造

我们利用左值k来初始化ak对象,显然就是拷贝构造。

最后虽然ak是左值,但是move运算后得到右值,所以也是移动构造。

单例模式——懒汉模式(只有在调用的时候才初始化)

class Singletem
{
	public:
		static Singletem& getitem()
		{
			static Singletem it;
			return it;
		}	
		Singletem(const Singletem & itt) = delete;//禁用拷贝构造;
		Singletem(Singletem && itt) = delete;//禁用移动构造
		Singletem& operator=(const Singletem & itt) = delete; //禁用拷贝赋值运算符
		//例如 Singletem A; Singletem B;
		// A = B;
		Singletem& operator=(Sinletem&& itt) = delete;//禁用移动赋值运算符  
		//例如 Singletem A;
		// A = Singletem();
	private:
	  Singletem();
};
或者写作
class noncopyable
{
protected:
    noncopyable() = default;
    ~noncopyable() = default;
		noncopyable(const noncopyable & itt) = delete;//禁用拷贝构造;
		noncopyable(noncopyable && itt) = delete;//禁用移动构造
		noncopyable& operator=(const noncopyable & itt) = delete; //禁用拷贝赋值运算符
		noncopyable& operator=(noncopyable&& itt) = delete;//禁用移动赋值运算符  
}
class Singletem:noncopyable
{
	public:
		static Singletem& getitem()
		{
			static Singletem it;
			return it;
		}	
	private:
	  Singletem();
};

这里有一个小细节,operator返回的是引用,这是为了链式法则,例如a=b=2;

单例模式——饿汉模式(未经调用就先初始化)

class Singletem:noncopyable
{
	public:
		static Singletem& getitem()
		{
			static Singletem it;
			return it;
		}	
	private:
	  static Singletem tem;
	  Singletem();
};
Singletem Singletem::tem;//实例初始化
int main()
{
Singletem s1 = Singletem::getitem();
Singletem s2 = Singletem::getitem();
bool c= &s1==&s2;
return 1;
}

相关文章:

  • 数控机床设备分布式健康监测与智能维护系统MTAgent
  • leetcode 1594. 矩阵的最大非负积
  • Java8适配的markdown转换html工具(FlexMark)
  • STL介绍1:vector、pair、string、queue、map
  • 深度学习之图像回归(二)
  • python windows services demo
  • 条款13:以对象管理资源
  • C++ 的时间库之二:Ratio
  • 【Elasticsearch】分页查询
  • 自然语言处理入门1——单词的表示和距离
  • el-table的hasChildren不生效?子级没数据还显示箭头号?树形数据无法展开和收缩
  • 数据治理中 大数据处理一般都遵循哪些原则
  • idea日常报错之UTF-8不可映射的字符
  • 关于如何利用群晖Docker搭建Project Zomboid(僵尸毁灭工程)私人服务器-保姆级教程
  • P2814 家谱 C++
  • MVTEC数据集笔记
  • 第435场周赛:奇偶频次间的最大差值 Ⅰ、K 次修改后的最大曼哈顿距离、使数组包含目标值倍数的最少增量、奇偶频次间的最大差值 Ⅱ
  • 【进阶】微服务
  • Unity合批处理优化内存序列帧播放动画
  • 深度优先搜索
  • 普京提议于15日在土耳其恢复俄乌直接谈判
  • 中国社科院:网文市场超430亿元,作者破3000万人
  • 侧记|青年为何来沪创新创业?从这一天寻找答案
  • 成就彼此,照亮世界:“中欧建交50周年论坛”在沪成功举行
  • 经济日报:降准降息,提前还房贷划算吗?
  • 圆桌丨权威专家解读中俄关系:在新形势下共同应对挑战、共创发展机遇