欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++賦值函數(shù)+移動(dòng)賦值函數(shù)+移動(dòng)構(gòu)造函數(shù)詳解

 更新時(shí)間:2022年08月30日 14:45:33   作者:苦糖????????  
這篇文章主要介紹了C++賦值函數(shù)+移動(dòng)賦值函數(shù)+移動(dòng)構(gòu)造函數(shù)詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

左值引用和右值引用

左值與右值

左值:在內(nèi)存中占有確定位置的對(duì)象,即左值占有內(nèi)存。換句話來說,就是有地址,有值。

右值:不占內(nèi)存(科學(xué)地講是臨時(shí)寄存器),僅有值,為臨時(shí)變量。

左右值的切換

右值->左值:用*符號(hào)。

int a=10;
int* b=&a;// b為右值。
*b=20;// b為右值,*b為左值。

左值->右值:用&符號(hào)。

int a = 10;
&a = 40; //錯(cuò)誤:賦值操作要求一個(gè)左值
int* b = &(a + 1); //錯(cuò)誤:‘&'運(yùn)算符要求一個(gè)左值,a為左值,但a+1為右值。
int* c = &a; //正確:var是左值

左值引用:將左值綁定在引用上

第一種情況,函數(shù)返回右值。

int global = 10;
int test()
{
return global;// 返回右值
}
int main()
{
test() = 20;// error,右值不可賦值!
cout << "test為:"<<test();
return 0;
}

第二種情況,函數(shù)返回左值。

int global = 10;
int& test()
{
return global;// 返回左值
}
int main()
{
test() = 20;// 左值可賦值
cout << "test為:"<<test();
return 0;
}

測(cè)試:

說明了左值引用讓函數(shù)調(diào)用可以賦值成為可能。

常量左值引用和非常量左值引用

int a1=20; //非常量左值
const int a2=20; //常量左值
const int a3=20; //常量左值

//非常量左值引用
int &b1=a1; //正確,a1是一個(gè)非常量左值,可以被非常量左值引用綁定
int &b2=a2; //錯(cuò)誤,a2是一個(gè)常量左值,不可以被非常量左值引用綁定
int &b3=20; //錯(cuò)誤,10是一個(gè)非常量右值,不可以被非常量左值引用綁定
int &b4=a2+a3; //錯(cuò)誤,(a2+a3)是一個(gè)常量右值,不可以被非常量左值引用綁定

//常量左值引用
const int &c1=a1; //正確,a1是一個(gè)非常量左值,可以被非常量右值引用綁定
const int &c2=a2; //正確,a2是一個(gè)常量左值,可以被非常量右值引用綁定
const int &c3=a1+a2; //正確,(a1+a2)是一個(gè)非常量右值,可以被常量右值引用綁定
const int &c4=a2+a3; //正確,(a2+a3)是一個(gè)常量右值,可以被非常量右值引用綁定

總結(jié):

  • 1.非常量左值引用只能綁定到非常量左值上;
  • 2.常量左值引用可以綁定到非常量左值、常量左值、非常量右值、常量右值等所有類型。

(大->小,小引用綁大左值,常量左值范圍更小嘛)

右值引用:將右值綁定在引用上

常量右值引用和非常量右值引用

總結(jié):

  • 1.非常量右值引用只能綁定到非常量右值上;
  • 2.常量右值引用可以綁定到非常量右值、常量右值上。

移動(dòng)構(gòu)造函數(shù)

小狗狗類:

Dog(int age,string name) :m_age(new int(age)), m_name(name){}
Dog(Dog& d):m_age(d.m_age),m_name(d.m_name)
{
cout << "我是拷貝構(gòu)造函數(shù)······" << endl;
}
Dog(Dog&& d) :m_age(d.m_age), m_name(d.m_name)
{
d.m_age = nullptr;
cout << "我是移動(dòng)構(gòu)造函數(shù)······" << endl;
}
int* m_age;
string m_name;#include<string>
#include<iostream>
using namespace std;
class Dog
{
public:
Dog(){};
Dog(int age,string name) :m_age(new int(age)), m_name(name){}
Dog(Dog& d):m_age(d.m_age),m_name(d.m_name)
{
cout << "我是拷貝構(gòu)造函數(shù)······" << endl;
}
Dog(Dog&& d) :m_age(d.m_age), m_name(d.m_name)
{
d.m_age = nullptr;
cout << "我是移動(dòng)構(gòu)造函數(shù)······" << endl;
}
int* m_age;
string m_name;
};

客戶端類:

#include"construct.h"
int main()
{
int age = 19;
string name = "小狗狗";
Dog d1(age, name);
cout << "d1:" <<* d1.m_age << d1.m_name << endl;
Dog d2(move(d1));
bool is = d1.m_age == nullptr;
cout << is << endl;
cout << "d2.age:" << *d2.m_age <<endl<< "d2.name:" <<d2.m_name << endl;
return 0;
}

測(cè)試:

說明了移動(dòng)構(gòu)造運(yùn)行成功,d1銷毀了,d2獲取到了d1的內(nèi)存。

賦值和移動(dòng)賦值函數(shù)

賦值函數(shù)類:

#include<String>
using namespace std;
class Cat
{
public:
Cat(){}
Cat(int age ,string name):age(age),name(name) {}
Cat& operator=(Cat& c)
{
if (this!= &c)
{
age = c.age;
name = c.name;
}
return *this;
}
int age;
string name;
};

移動(dòng)賦值函數(shù)類:

#include"assign.h"
class Dog
{
public:
Dog() {}
Dog(int age, string name) :age(new int(age)), name(name) {}

Dog& operator=(Dog&& c)
{
age = c.age;
name = c.name;
c.age = nullptr;
return *this;
}
int* age;
string name;
};

客戶端類:

#include<iostream>
#include"moveAssign.h"
int main()
{
cout << "賦值函數(shù)" << endl;
Cat c1(18, "小貓咪");
Cat c2 ;
c2 = c1;
cout << "c1.age:" << c1.age << endl << "c1.name" << c1.name << endl;
cout << "c2.age:" << c2.age << endl << "c2.name" << c2.name << endl<<endl;;
cout << "移動(dòng)賦值函數(shù)" << endl;
Dog d1(19,"小狗狗");
cout << "d1.age:" << *d1.age << endl << "d1.name" << d1.name << endl << endl;
Dog d2;
d2 = move(d1);
bool is = (d1.age == nullptr);
cout << "d1是否為空:" << is << endl;
cout << "d2.age:" << *d2.age << endl << "d2.name" << d2.name << endl;
return 0;
}

測(cè)試:

到此這篇關(guān)于C++賦值函數(shù)+移動(dòng)賦值函數(shù)+移動(dòng)構(gòu)造函數(shù)詳解的文章就介紹到這了,更多相關(guān)C++賦值函數(shù) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于C++運(yùn)算符重載的一些困惑詳解

    關(guān)于C++運(yùn)算符重載的一些困惑詳解

    這篇文章主要給大家介紹了關(guān)于C++運(yùn)算符重載的一些困惑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C語言系統(tǒng)調(diào)用約定

    C語言系統(tǒng)調(diào)用約定

    這篇文章介紹了C語言系統(tǒng)調(diào)用約定,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值。需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • 關(guān)于C/C++中static關(guān)鍵字的作用總結(jié)

    關(guān)于C/C++中static關(guān)鍵字的作用總結(jié)

    以下是對(duì)C/C++中static關(guān)鍵字的作用進(jìn)行了總結(jié)介紹,需要的朋友可以過來參考下
    2013-09-09
  • 在C++中反射調(diào)用.NET的方法(三)

    在C++中反射調(diào)用.NET的方法(三)

    在.NET與C++之間傳輸集合數(shù)據(jù)的方法是怎么樣的呢?接下來通過本文給大家分享在C++中反射調(diào)用.NET(三),需要的朋友參考下吧
    2017-02-02
  • C++實(shí)現(xiàn)學(xué)生選課系統(tǒng)的思路與詳細(xì)過程

    C++實(shí)現(xiàn)學(xué)生選課系統(tǒng)的思路與詳細(xì)過程

    C語言是在國內(nèi)外廣泛使用的一種計(jì)算機(jī)語言,下面這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)學(xué)生選課系統(tǒng)的思路與詳細(xì)過程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • 用C語言實(shí)現(xiàn)三子棋

    用C語言實(shí)現(xiàn)三子棋

    這篇文章主要為大家詳細(xì)介紹了用C語言實(shí)現(xiàn)三子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++線程優(yōu)先級(jí)SetThreadPriority的使用實(shí)例

    C++線程優(yōu)先級(jí)SetThreadPriority的使用實(shí)例

    這篇文章主要介紹了C++線程優(yōu)先級(jí)SetThreadPriority的使用實(shí)例,較為詳細(xì)的講述了C++線程及其優(yōu)先級(jí)的用法,需要的朋友可以參考下
    2014-10-10
  • C語言超詳細(xì)i講解雙向鏈表

    C語言超詳細(xì)i講解雙向鏈表

    在實(shí)際生活中,我們用到的最多的兩種鏈表結(jié)構(gòu)就是單鏈表和雙向帶頭鏈表,上一篇已經(jīng)介紹了單鏈表的實(shí)現(xiàn)以及一些應(yīng)用,接下來我為大家詳細(xì)介紹一下雙向鏈表,以及一些鏈表oj題
    2022-05-05
  • C++實(shí)現(xiàn)LeetCode(62.不同的路徑)

    C++實(shí)現(xiàn)LeetCode(62.不同的路徑)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(62.不同的路徑),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實(shí)現(xiàn)歌手比賽系統(tǒng)

    C語言實(shí)現(xiàn)歌手比賽系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)歌手比賽系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論