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.

【通聯編輯:光文玲】

主站蜘蛛池模板: 久久国产精品电影| 中文字幕自拍偷拍| 美女一级免费毛片| 日韩欧美中文字幕一本| 国产成人免费| 亚洲二三区| 国产主播一区二区三区| 亚洲人成在线精品| 在线一级毛片| 久久综合干| 在线观看亚洲国产| 国产精品美女网站| 老熟妇喷水一区二区三区| 精品久久高清| 欧美啪啪一区| 日韩第九页| 99在线免费播放| 久久久久无码精品| 成人免费一区二区三区| 人妻丰满熟妇αv无码| 久久久久亚洲av成人网人人软件| 午夜精品一区二区蜜桃| 午夜人性色福利无码视频在线观看| 日韩欧美国产综合| 伊人激情久久综合中文字幕| 国内精品久久人妻无码大片高| 国模极品一区二区三区| 亚洲第一成年人网站| 亚洲人成电影在线播放| 国产无码制服丝袜| 国产 在线视频无码| 日韩精品资源| 四虎永久免费在线| 久久激情影院| 亚洲国产成人久久77| 欧美.成人.综合在线| 国产欧美日韩另类精彩视频| 三上悠亚精品二区在线观看| 高清视频一区| 免费一级全黄少妇性色生活片| 中文字幕无码制服中字| 免费人成视频在线观看网站| 91精品啪在线观看国产| 欧美精品成人| 欧美另类一区| 欧美日本视频在线观看| 国产精品美女在线| 免费毛片在线| 国产在线精品美女观看| 在线免费观看AV| 国产精品网曝门免费视频| 日韩国产 在线| 呦女亚洲一区精品| 国产小视频a在线观看| 日韩精品毛片| 亚洲视频色图| AV在线天堂进入| 日韩在线视频网站| 日本欧美中文字幕精品亚洲| 99精品久久精品| 欧美区一区| 华人在线亚洲欧美精品| 国产呦精品一区二区三区下载| 精品无码专区亚洲| 综合网天天| 热久久综合这里只有精品电影| 亚洲欧洲自拍拍偷午夜色| 亚洲V日韩V无码一区二区| 伊人激情综合| 狼友av永久网站免费观看| 黄色网在线| 国产 在线视频无码| 波多野结衣AV无码久久一区| 精品欧美一区二区三区在线| www精品久久| 亚洲国产精品无码久久一线| 91精品国产综合久久香蕉922| 欧美一区二区精品久久久| 亚洲福利视频一区二区| 日韩欧美中文| 免费视频在线2021入口| 青青草原国产一区二区|