999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C++函數返回可以被賦值的左值與&和*運算辨析

2018-01-04 10:59:48王玉山
電腦知識與技術 2018年28期

摘要: C++語言中的引用概念與&和*運算是幾個相關的概念。如何用簡明、準確的語言講解引用概念和相關的運算,讓學習者容易理解記憶,我們一直在探討。本文用例題和實驗來驗證有關概念,講清楚這些概念的關系。

關鍵詞:引用;指針;&運算;*運算

中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2018)28-0277-02

本文通過返回可以被賦值的左值(變量或對象)等幾個例子,對引用概念進行辨析。講清楚變量的引用、返回引用的函數,&運算,*運算等。希望對于學習C++的人有所幫助。

1 變量的引用

引用是給已經存在的變量指定一個別名,相當于給一個人起外綽號。是一種使用已經定義了的變量的方法。引用不分配新的存儲空間、不產生新變量。別名也是該變量空間的名字。并且這個別名不能再作為其他變量的名字或別名。

引用方法的一般格式是:

<類型名><&引用名> = <被引用的已經存在的變量名>;

其中<類型名> 要與 <被引用的已經存在的變量名>的類型保持一致。&在此是起標識作用。聲明引用時必須同時對其進行初始化,即上面的格式中不能少項。

例題1(本文所有例題都在VC++2017下實驗驗證)

#include

using namespace std;

int main(int argc, char *argv[])

{double p = 3.14;

cout <<"被重新賦值前p="<< p << endl;

double &bp; = p; //A行,聲明bp為p的別名。

//double &bp2; = p;//同一個變量,起2個別名。

//double &bp2; = bp;//變量的別名的別名。

bp = 3.14159;

cout <<"被重新賦值p="<< p << endl;

cout <<"bp="<< bp << endl;

cout <<"&p;="<<&p; << endl;

cout <<"&bp;="<<&bp; << endl; //B行

//cout <<"&bp2;="<<&bp2; << endl;

system("pause");

}

運行結果:

被重新賦值前p=3.14

被重新賦值p=3.14159

bp=3.14159

&p;=0097F828

&bp;=0097F828

其中p和bp的地址值都是0097F828相等,說明引用沒有分配新的存儲空間。

思考題1:如果在例題1的//A行后加double &bp2;=p; //B行后加cout<<"&bp2;="<<&bp2;<

答:說明同一個變量可以有多個別名。

思考題2:如果在例題1的//A行后加行改為double &bp2;=bp; 程序還能運行說明了什么?

答:說明可以給變量p的別名bp再指定別名bp2。

函數的引用參數就是變量的引用。如: void swap(int &a;,int &b;){…};int main( ){int x=1,y=2; swap(x, y); …}語句swap(x, y);可以看成swap(int &a;=x, int &b;=y);在swap開辟的新工作區中把a和b分別作為主函數中變量x和變量y的別名。對象也可以作為函數的引用參數。

關于引用的說明:

(1)變量的引用名不能再做其他變量的引用名。

(2)引用只是說明,沒有定義新變量。

(3)引用僅在說明時帶有&,使用引用名不能再帶&。

(4)函數參數的引用名,可以返回多個值。

(5)被引用的必須是左值。即可以被賦值的變量或對象。

(6)引用與被引用變量類型必須相同。

(7)不允許對void類型進行引用。如萬用指針變量void *kk。

(8)不能建立引用的數組。int a[10]; int &ra;[10] = a或a[10];都是非法的。

(9)引用不能用類型來初始化。如:int&h;=int;

(10)沒有空引用。如: int &rn;=NULL;錯誤。

2 用返回引用或指針的函數實現左值

函數返回值分為:值,引用,指針三種。c沒有引用類型。返回引用做左值可以實現連續賦值運算。

例題2:對于基本類型用返回引用的函數實現連續賦值

#include

using namespace std;

int& test()

{

int *b = new int();

*b = 2;

return *b;

delete b;//此語句沒有被執行,不能清理int *b = new int();產生的垃圾。

}

int main(int argc, char *argv[])

{

int a;

a = test() += test() += 1;

cout <<"a="<< a << endl;

system("pause");

}

運行結果:

a=5

本例做適當修改后,可以驗證返回指針也可以實現連續賦值。

例題2用基本類型返回引用會帶來一個問題,那就是語句return *b之后,無法實現清理退出被調函數int& test()之后,語句int *b = new int();產生的垃圾。

用返回基本類型引用的函數實現左值,在主調函數中一般要定義一個同類型的變量保存結果。a = test() += test() += 1;雖然實現了連續賦值,但不符合賦值習慣。

變量的引用是C++中新添加的概念。在C++中返回引用的函數、返回的是左值即主動對象本身,可以進行連續賦值。

例題3:用類返回引用的成員函數實現賦值運算。

#include

#include

using namespace std;

class String

{

protected:

int Length; // 字符串的長度

char *Strp; // 指向字符串的指針

public:

String(){ Strp =NULL; Length=0; }

String(const char *s);

String(const String &);

~String()

{

if (Strp) delete[] Strp;

}

void Show()

{

if (Strp) cout << Strp << '\n';

}

int GetLen() { return Length; }

String &operator;=(String &);

};

String::String(const char *s)

{

if (s)

{

Length = strlen(s);

Strp = new char[Length+1];

strcpy_s(Strp,strlen(s)+1, s);

//要注意字符串s不可太長。

}

else

{

Strp=NULL; Length=0;

}

}

String::String(const String &s;)

{

Length=s.Length;

if (s.Strp)

{

Strp = new char[Length+1];

strcpy_s(Strp, strlen(s.Strp) + 1, s.Strp);

}

else Strp=NULL;

}

String & String::operator = (String &s;)

{

if (this == &s;) return *this;

if (Strp) delete[] Strp;

Length = s.Length;

if (s.Strp)

{

Strp = new char[Length + 1];

strcpy_s(Strp, s.Length+1,s.Strp);

}

else Strp=NULL;

return *this;

}

int main(void)

{

String s1("C++程序設計 "), s2;

String s3("學生學習.");

s1.Show();

s2.Show();

s3.Show();

s2 = s1;// 測試運算符"="

s1.Show();

s2.Show();

s3.Show();

String s6="C++ programming! ";

s1 = s2 = s6;

s1.Show();

s2.Show();

s3.Show();

system("pause");

return 0;

}

程序運行結果:

C++程序設計

學生學習.

C++程序設計

C++程序設計

學生學習.

C++ programming!

C++ programming!

學生學習.

例題3中,返回引用的作左值使用,返回語句一定是:return *this;實際上返回的是主動對象本身。賦值號重載,實現了符合基本類型傳統的連續完美賦值運算s1 = s2 = s6。

3 引用運算符&與取地址運算符&、指針運算符*的關系

在定義引用的語句中&是引用聲明符號。使用變量時&出現在變量左側是取地址運算符、使指針升一級。&的另一個含義是按位與運算。在指針變量的定義中*號是類型的一部分,即表明定義的是指針變量。使用指針變量時在指針變量左側的*號把指針降一級、表示指針變量所指的變量、這叫間接訪問變量。*號的另一個用法是乘法。取地址運算符&和間接訪問運算符*是互逆的運算。

4 結束語

有關引用當然還有好多問題需要討論,指針運算更是用法繁多,限于篇幅,不再展開討論。

參考文獻:

[1] https://blog.csdn.net/cnsword/article/details/7256821.

[2] 王玉山.一個難于理解的C++函數指針問題[J].山東工業技術,2014(20).

[3]http://www.360doc.com/content/15/1025/10/26795867_508195623.shtml.

[4] 王玉山.C++程序設計語言的實踐教學建設[J].中小企業管理與科技,2017(1).

[5] 王珊珊,臧冽,張志航.C++程序設計教程(第3版)[M].機械工業出版社,2016.

【通聯編輯:光文玲】

主站蜘蛛池模板: 欧美日韩国产一级| 天天色综合4| 乱人伦99久久| 色首页AV在线| 色有码无码视频| 国产自在线拍| 影音先锋丝袜制服| 免费看av在线网站网址| 亚洲国产精品无码久久一线| jizz在线观看| 日本黄网在线观看| 欧美日韩资源| 国产成人调教在线视频| 伊人中文网| 国产成人精品第一区二区| 欧美日本不卡| 久久精品娱乐亚洲领先| 精品国产电影久久九九| 97久久超碰极品视觉盛宴| 国产成人精品男人的天堂| 中文字幕有乳无码| 亚洲精品少妇熟女| 国产精品私拍在线爆乳| 国产高潮视频在线观看| 国产精品无码作爱| 久久国产精品国产自线拍| 欧美日韩中文字幕在线| 日韩在线欧美在线| 国产精品香蕉| 日本成人一区| 国产激情无码一区二区APP | 麻豆国产在线不卡一区二区| 国产精品人成在线播放| 久久精品66| 91在线播放免费不卡无毒| 伊人天堂网| 福利姬国产精品一区在线| 色窝窝免费一区二区三区| 天天综合天天综合| 色香蕉影院| 日本欧美一二三区色视频| 91av国产在线| 狼友视频国产精品首页| 久久久久久尹人网香蕉 | 国产在线精品99一区不卡| 免费一级成人毛片| 久久伊人色| 亚洲欧美一区在线| 国产成人午夜福利免费无码r| 丰满人妻一区二区三区视频| 国产成年女人特黄特色大片免费| 国产成人综合日韩精品无码首页 | 中日无码在线观看| 天天干天天色综合网| 国产嫩草在线观看| 亚洲丝袜第一页| 黄色网页在线播放| 国产一级一级毛片永久| 日韩AV手机在线观看蜜芽| 日韩毛片免费| 日韩第九页| 亚洲一区第一页| 国产大片黄在线观看| 色偷偷av男人的天堂不卡| 一级毛片不卡片免费观看| 欧美色99| 欧美日韩一区二区三区四区在线观看| 一区二区午夜| 国产欧美视频综合二区| 成人一级黄色毛片| 日韩美毛片| 青青草综合网| 国产精品偷伦视频免费观看国产| 四虎国产成人免费观看| 真实国产精品vr专区| 欧美69视频在线| 欧美亚洲激情| 在线欧美a| 欧美精品高清| 欧美综合一区二区三区| 色欲色欲久久综合网| 黄色网站不卡无码|