<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C++移動構造與std::move()

      背景及問題

      如下程序所示:
      #include<iostream>
      
      class MyString {
      public:
      	MyString() = default;
      	MyString(const char* data)
      	{		
      		printf("%s", "MyString Constructed!!\n");
      		size = strlen(data);
      		m_data = new char[size];
      		memcpy(m_data, data, size);	
      	}
      	~MyString()
      	{
      		if (m_data)
      		{
      			printf("%s", "MyString Destroyed!!\n");
      			delete m_data;
      		}	
      	}
      	//copy constructor
      	MyString(const MyString& other) noexcept
      	{
      		printf("%s", "MyString Copyed!!\n");
      		size = other.size;
      		m_data = new char[size];
      		memcpy(m_data, other.m_data, size);
      	}
      
      private:
      	char* m_data;
      	int size;
      };
      
      class Entity
      {
      public:
      	//constructor
      	Entity(const MyString& string):m_string(string) {}
      private:
      	MyString m_string;
      };
      
      int main()
      {	
      
      	Entity entity("Hello");
      	return 0;
      }
      

      程序說明

      程序定義了一個MyString類,其中構造函數和拷貝構造函數需要對傳進來的字符串開辟空間并復制內容,另外一個Entity類含有一個MyString成員,并在初始化時復制傳入的MyString對象。主程序Main中以常量字符串構造一個entity示例。

      image

      運行程序會發現,MyString構造了一次,拷貝一次,程序結束析構兩次,符合運行邏輯。“Hello”字符串先通過構造函數構造一個臨時變量MyString,臨時變量再通過Entity內的構造函數拷貝構造給成員變量m_string

      問題在于臨時變量拷貝構造需要重新開辟空間,并且“用完即扔”,為什么不直接將“hello”構造好的MyString直接“移動”到Entity?這樣會節省空間,提高效率。用此引出移動構造和std::move()

      移動構造與std::move()

      若要實現將臨時變量移動到Entity,首先MyString要加入移動構造,如下:
      	MyString(MyString&& other) noexcept
      	{
      		printf("%s", "MyString Moved!!\n");
      		size = other.size;
      		m_data = other.m_data;
      
      		//clear origin data
      		other.size = 0;
      		other.m_data = nullptr;
      	}
      
      

      此為移動構造,接受的是一個右值,構造是直接復制原MyString的size與data,不重新開辟空間做深拷貝。并將原MyString清零。接著對Entity構造時使用std::move通知移動構造函數,如下:

      	Entity(MyString&& string) :m_string(std::move(string)) {}
      

      image

      需要注意的是

      1. Entity右值構造時也可不使用std::move,直接將參數強轉為右值類型也可以,std::move相當于通知構造函數以移動構造的方式進行
      Entity(MyString&& string) :m_string((MyString&&)string) {}
      

      2. 對于形參為Const YourType &類型的既可以接受左值,也可以接受右值。但是使用std::move會編譯錯誤,因為Const值不能被移動,所以Entity構造仍要單獨寫一個右值構造

      3. MyString移動構造時,復制了臨時數據的值還要對其清空,因為數據已經被移動,指針沒有置空,析構兩次會引起Crash問題
      posted @ 2023-12-19 12:03  robot2017  閱讀(193)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 熟女一区| 亚洲精品电影院| 亚洲精品视频一二三四区| 九色精品国产亚洲av麻豆一| 亚洲男女羞羞无遮挡久久丫| 日韩精品三区二区三区| 中国少妇人妻xxxxx| 久久精品国产99精品亚洲| 精品免费看国产一区二区| 精品国产高清中文字幕| 午夜福利yw在线观看2020| 国产永久免费高清在线观看| 东京一本一道一二三区| 干老熟女干老穴干老女人| 国产午夜精品理论大片| 图片区小说区av区| 日韩丝袜欧美人妻制服| 九九综合九色综合网站| 在线免费观看毛片av| 麻豆成人av不卡一二三区| 无码日韩精品一区二区三区免费| 欧美三级中文字幕在线观看| 亚洲夂夂婷婷色拍ww47| 精品综合久久久久久98| AV无码免费不卡在线观看 | 草裙社区精品视频播放| 18禁裸乳无遮挡自慰免费动漫| 国产成人欧美一区二区三区在线| 亚洲天堂激情av在线| 中文字幕国产精品日韩| 在线亚洲午夜片av大片| 伊人久久大香线蕉网av| 成人动漫综合网| 国产午夜福利视频合集| 国产无套内射普通话对白| 肥城市| 国产精品中文字幕自拍| 国产亚洲精品第一综合麻豆| 四虎精品国产永久在线观看| 国产精品久久毛片| 特黄大片又粗又大又暴|