阅读背景:

C++11移动构造函数,移动赋值运算符_Yjiokm的博客

来源:互联网 

(图来自互联网)

#include <iostream>

class Someclass
{
private:
	char * s;
public:// 如果手动提供了析构函数,复制构造函数,复制赋值运算符,编译器不自动提供移动构造函数和移动赋值运算符;
		// 如果手动提供了移动构造函数或移动赋值运算符,编译器奖不会自动提供复制构造函数和复制赋值运算符
	Someclass();
	Someclass(const char * _s);
	Someclass(const Someclass & _sc);
	Someclass(Someclass && _sc);
	Someclass & operator=(const Someclass & _sc);
	Someclass & operator=(Someclass && _sc);
	~Someclass();
public:
	void Print() const;
};

Someclass::Someclass() : s(nullptr)
{
}

Someclass::Someclass(const Someclass & _sc)
{
	std::cout << "copy" << std::endl;
	s = (char *)malloc(sizeof(char) * (strlen(_sc.s) + 1));
	strcpy(s, _sc.s);
}

Someclass::Someclass(Someclass && _sc)
{
	std::cout << "copy&&" << std::endl;
	s = _sc.s;
	_sc.s = nullptr;
}

Someclass & Someclass::operator=(const Someclass & _sc)
{
	std::cout << "=" << std::endl;
	if (this == &_sc)
	{
		return *this;
	}
	if (s)
	{
		free(s);
		s = nullptr;
	}
	s = (char *)malloc(sizeof(char) * (strlen(_sc.s) + 1));
	strcpy(s, _sc.s);
	return *this;
}

Someclass & Someclass::operator=(Someclass && _sc)
{
	std::cout << "&&=" << std::endl;
	if (this == &_sc)
	{
		return *this;
	}
	if (s)
	{
		free(s);
		s = nullptr;
	}
	s = _sc.s;
	_sc.s = nullptr;
	return *this;
}

Someclass::Someclass(const char * _s)
{
	s = (char *)malloc(sizeof(char) * (strlen(_s) + 1));
	strcpy(s, _s);
}

void Someclass::Print() const
{
	if (!s)
		return;
	std::cout << s << std::endl;
}

Someclass::~Someclass()
{
	if (s)
	{
		free(s);
		std::cout << "~" << std::endl;
	}
}

int main()
{
	Someclass sc = "abc";// 隐式调用构造函数
	Someclass sc2("xxx");
	sc2 = std::move(sc);// 强制调用移动复制运算符函数,std::move强制转化为右值<pre class="cpp" name="code" snippet_file_name="blog_20160929_1_515207" code_snippet_id="1907750">	// 可以理解为同一片堆内容分给了新的对象,旧的对象指向堆的指针设为nullptr
	sc.Print();// 空的
	sc2.Print();
	return 0;
}#include <iostream>

class Som



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: