最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你了解C++中的右值引用與移動(dòng)語(yǔ)義

 更新時(shí)間:2023年03月31日 10:48:39   作者:寡人正在Coding  
本篇文章主要為大家詳細(xì)介紹了C++中的右值引用與移動(dòng)語(yǔ)義的相關(guān)知識(shí),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧

意義

充分利用臨時(shí)對(duì)象,避免拷貝。

左值右值

值類別

在 C++11之后,C++根據(jù)

  • 被標(biāo)識(shí):可通過不同標(biāo)識(shí)符指代同一實(shí)體。(對(duì)象/內(nèi)存)
  • 可移動(dòng):可作為移動(dòng)語(yǔ)義函數(shù)的參數(shù),例如移動(dòng)構(gòu)造,移動(dòng)賦值。

將值分為以下類別:

泛左值:被標(biāo)識(shí)

  • 左值:被標(biāo)識(shí)且不可移動(dòng)
  • 將亡值:被標(biāo)識(shí)可移動(dòng)

右值:可移動(dòng)

  • 將亡值:被標(biāo)識(shí)可移動(dòng)
  • 純右值:不被標(biāo)識(shí)且可移動(dòng)

左值

int a = 1;

a是一個(gè)左值,左值是關(guān)聯(lián)了名稱的內(nèi)存位置。

純右值

int a = 1;

1是一個(gè)純右值,純右值是指不被標(biāo)識(shí)且可移動(dòng)的值,例如字面量。

將亡值

using std::string;
string get()
{
	string ret = "abc";
	return ret;
}

string str = get();

get() 函數(shù)調(diào)用會(huì)產(chǎn)生一個(gè)臨時(shí)變量賦給str,這個(gè)臨時(shí)變量是將亡值,此時(shí)的賦值是移動(dòng)語(yǔ)義(c++11之前是復(fù)制語(yǔ)義)。

左值引用

int a = 1;
int& a_lref = a;

a_lref是左值引用

右值引用

int&& rref = 1;

rref是右值引用(rref是類型為右值引用的左值)

std::move()

void foo(int&& rref)
{
}

int a = 1;
foo(std::move(a));

std::move本質(zhì)是類型轉(zhuǎn)換,即把左值轉(zhuǎn)換成右值

注意:被轉(zhuǎn)換的對(duì)象不應(yīng)再被使用,否則結(jié)果難以預(yù)計(jì)(通常內(nèi)存會(huì)被轉(zhuǎn)移)

移動(dòng)構(gòu)造&移動(dòng)賦值運(yùn)算符重載

class Foo
{

public:
	Foo()
	{
		m_data = malloc(32);
	}
	
	Foo(const Foo& rhs)
	{
		if(m_data == nullptr)
		{
			m_data = malloc(32);
		}
		memcopy(m_data,rhs.m_data,32);
	}
	
	Foo& operator = (const Foo& rhs)
	{
		if(m_data == nullptr)
		{
			m_data = malloc(32);
		}
		memcopy(m_data,rhs.m_data,32);
		return *this;
	}
	
	Foo(Foo&& rhs) noexcept
	{
		m_data = rhs.m_data;
		rhs.m_data = nullptr;
	}
	
	Foo& operator = (Foo&& rhs) noexcept
	{
		m_data = rhs.m_data;
		rhs.m_data = nullptr;
		return *this;
	}
private:
	void* m_data
}

移動(dòng)構(gòu)造的本質(zhì)就是內(nèi)存資源所有權(quán)的轉(zhuǎn)移

測(cè)試&驗(yàn)證

#include <iostream>
#include <cstdlib>

#define LOG(Args) std::cout << "==== " << Args << " ====" << std::endl

namespace My
{
	class Vector
	{
	public:
		Vector() noexcept
		{
			LOG("Ctor");
			m_data = new int[] {0, 0, 0, };
		}

		~Vector()
		{
			LOG("Dector");
			m_data = new int[] {0, 0, 0, };
		}

		Vector(const Vector& rhs)
		{
			LOG("Copy");
			if (m_data == nullptr)
			{
				m_data = new int[3];
			}
			memcpy(m_data, rhs.m_data, 3 * sizeof(int));

		}

		Vector& operator = (const Vector& rhs) 
		{
			LOG("Copy Operator = ");
			if (m_data == nullptr)
			{
				m_data = new int[3];
			}
			memcpy(m_data, rhs.m_data, 3 * sizeof(int));
			return *this;
		};

		Vector& operator = (Vector&& rhs) noexcept
		{
			LOG("Move Operator = ");
			m_data = rhs.m_data;
			rhs.m_data = nullptr;
			return *this;
		};

		Vector(Vector&& rhs) noexcept
		{
			LOG("Move");
			m_data = rhs.m_data;
			rhs.m_data = nullptr;
		}

		void print()
		{
			std::cout << "X = " << m_data[0] <<
				" , " << "Y = " << m_data[1] <<
				" , " << "Z = " << m_data[2] << std::endl;
		}

		void set(int x,int y,int z)
		{
			m_data[0] = x;
			m_data[1] = y;
			m_data[2] = z;
		}

	private:
		int* m_data;
	};
}

My::Vector Get()
{
	My::Vector vec;
	vec.set(4, 5, 6);
	return vec;
}

void main()
{
	My::Vector vec1;
	My::Vector vec2;

	LOG("vec1");
	vec1.print();

	vec1.set(0, 1, 2);
	LOG("vec1");
	vec1.print();

	vec1 = vec2;
	LOG("vec1");
	vec1.print();

	vec1 = std::move(vec2);
	LOG("vec1");
	vec1.print();

	My::Vector* vp1 = new My::Vector();
	LOG("vp1");
	vp1->print();

	My::Vector* vp2 = new My::Vector(*vp1);
	LOG("vp2");
	vp2->print();

	My::Vector* vp3 = new My::Vector(std::move(*vp1));
	LOG("vp3");
	vp3->print();

	My::Vector* vp4 = new My::Vector(Get());
	LOG("vp4");
	vp4->print();
}

輸出

到此這篇關(guān)于一文帶你了解C++中的右值引用與移動(dòng)語(yǔ)義 的文章就介紹到這了,更多相關(guān)C++右值引用 移動(dòng)語(yǔ)義 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++?多繼承詳情介紹

    C++?多繼承詳情介紹

    這篇文章主要介紹了C++?多繼承詳情,C++支持多繼承,即允許一個(gè)類同時(shí)繼承多個(gè)類。只有C++等少數(shù)語(yǔ)言支持多繼承,下面我們就來(lái)看看具體的多繼承介紹吧,需要的朋友可以參考一下
    2022-03-03
  • C++實(shí)現(xiàn)商店倉(cāng)庫(kù)管理系統(tǒng)

    C++實(shí)現(xiàn)商店倉(cāng)庫(kù)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)商店倉(cāng)庫(kù)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Qt自定義Widget實(shí)現(xiàn)互斥效果詳解

    Qt自定義Widget實(shí)現(xiàn)互斥效果詳解

    在使用Qt時(shí),可能會(huì)遇到這種問題:多個(gè)控件互斥,類似于QRadiButton控件,但又不是單純的QRadioButton控件,互斥的可能是一個(gè)窗口,也可能是幾個(gè)按鈕,等等多種情況。本文將介紹利用Qt自定義Widget實(shí)現(xiàn)的互斥效果,需要的可以參考一下
    2022-01-01
  • C++中關(guān)于std::queue?中遇到釋放內(nèi)存錯(cuò)誤的問題

    C++中關(guān)于std::queue?中遇到釋放內(nèi)存錯(cuò)誤的問題

    這篇文章主要介紹了std::queue中遇到釋放內(nèi)存錯(cuò)誤的問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • C語(yǔ)言商品銷售系統(tǒng)源碼分享

    C語(yǔ)言商品銷售系統(tǒng)源碼分享

    這篇文章主要為大家分享了C語(yǔ)言商品銷售系統(tǒng)源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C++類的繼承和派生及指針安全引用

    C++類的繼承和派生及指針安全引用

    這篇文章主要介紹了C++類的繼承和派生及指針安全引用,繼承指從現(xiàn)有類獲得其特性,派生指從已有類產(chǎn)生新的類,指針和引用并存,二者似乎有很多相同點(diǎn),但是又不完全相同,下面關(guān)于兩者的相關(guān)資料,需要的小伙伴可以參考一下
    2022-03-03
  • 一文搞懂C++中string容器的構(gòu)造及使用

    一文搞懂C++中string容器的構(gòu)造及使用

    本文小編將帶大家學(xué)習(xí)最常見的一個(gè)引用類型——string容器,學(xué)習(xí)string容器的構(gòu)造、以及C++API中String類的常用方法,感興趣的可以了解一下
    2022-07-07
  • 將字符串str1復(fù)制為字符串str2的三種解決方法

    將字符串str1復(fù)制為字符串str2的三種解決方法

    以下是對(duì)將字符串str1復(fù)制為字符串str2的三種解決方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • C++11特性小結(jié)之decltype、類內(nèi)初始化、列表初始化返回值

    C++11特性小結(jié)之decltype、類內(nèi)初始化、列表初始化返回值

    這篇文章主要介紹了C++11特性小結(jié)之decltype、類內(nèi)初始化、列表初始化返回值,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 一文快速掌握C++雙端數(shù)組容器deque的使用

    一文快速掌握C++雙端數(shù)組容器deque的使用

    本文和大家分享的是和vector容器功能很像的容器——deque,了解deque容器的本質(zhì),使用方法以及與vector容器的不同之處,感興趣的快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論

辽源市| 石嘴山市| 彩票| 开封市| 昭通市| 上林县| 随州市| 安溪县| 行唐县| 华安县| 军事| 惠安县| 洛浦县| 和林格尔县| 澎湖县| 本溪市| 新民市| 文化| 桓仁| 阿图什市| 阜宁县| 大连市| 浦东新区| 英超| 工布江达县| 屏东市| 西乡县| 车险| 天峨县| 侯马市| 永宁县| 龙泉市| 额敏县| 昭觉县| 绍兴县| 开远市| 扶余县| 竹溪县| 昂仁县| 永川市| 连州市|