国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C++入門 引用詳解

2019-11-14 09:36:42
字體:
供稿:網(wǎng)友

//1.引用作為其他變量的別名而存在,因此在一些場合可以代替指針

//2.引用相對于指針來說具有更好的可讀性和實(shí)用性

//3.引用在C++內(nèi)部實(shí)現(xiàn)就是一個(gè)常量指針 *const p //int &a == int *const a  

 

#include "stdafx.h"

#include<iostream>

#include"string"

using namespace std;

 

class Teacher

{

public:

int  age;

string name;

};

 

void GetAgeA(Teacher *PT)

{

cout << PT->age<< "  ";

PT->age = 25;

}

//引用就不一樣了,引用時(shí)將PT和下邊的t1綁定在了一起,PT相當(dāng)于t1的別名,他們都指向同一塊內(nèi)存

void GetAgeB(Teacher &PT)

{

cout << PT.age<< "  ";

PT.age = 25;//所以改了PT就改了t1,這屬于C++的一個(gè)加強(qiáng)

}

void GetAgeC(Teacher PT)//PT是實(shí)參,和下邊的t1沒有直接的內(nèi)存關(guān)系,只是t1 復(fù)制了一份數(shù)據(jù)給了PT

{

PT.age = 25;//因?yàn)橄雀牧薖T 所以運(yùn)行結(jié)果是25

cout << PT.age<< "  ";

//如果在這里改了PT的age 就只改變了PT的age對t1沒有任何影響

}

 

//這樣的函數(shù)是不能實(shí)現(xiàn)交換的

void MySwap(int a,int b)

{//這樣只是進(jìn)行了a和b的值的交換而對下邊的x和y的值卻沒有影響

int c = 0;

c = a;

a = b;

b = c;

}

//如果要實(shí)現(xiàn)交換就要用到指針

void MySwap2(int *a,int *b)

{

int c = 0;

c = *a;

*a = *b;

*b = c;

}

//使用引用

void MySwap3(int &a,int &b)

{

int c = 0;

c = a;

a = b;

b = c;

}

 

int GetA1()

{

int a = 10;

a++;

return a;

}

//返回值為引用的函數(shù),就是返回a的副本,有內(nèi)存地址也有值

//因?yàn)榉祷氐氖莂的副本,相當(dāng)于一個(gè)變量所以也可以當(dāng)左值,但是必須是靜態(tài)變量或者是全局變量,不會被析構(gòu),才可以。

int& GetA2()

{

int a = 10;

a++;

return a;

}

//返回值當(dāng)左值的測試,變量a為靜態(tài)

int& GetA3()

{

static int a = 10;

a++;

cout << "GetA3中的a: " << a<< endl;

return a;

}

 

int main()

{

int a = 5;

int &b = a;//這是一個(gè)普通的引用,當(dāng)使用時(shí)必須初始化,b就為a的一個(gè)別名,很像一個(gè)常量定義

//引用Win32平臺下占用4個(gè)字節(jié),和指針的占用空間一樣

cout << b << endl;//輸出的結(jié)果為5

cout << &b << endl;

cout << &a << endl;//地址是一樣的,這就說明a和b都是同一塊內(nèi)存地址的別名,就是門牌號

 

Teacher t1;

t1.age = 20;

GetAgeC(t1);//使用三種方法調(diào)用,這里先使用第三種,目的是看結(jié)果,因?yàn)榈谌N方法不改變t1的值,運(yùn)行后的結(jié)果一目了然//25   20

cout << t1.age << endl;

GetAgeA(&t1);//使用一種方法調(diào)用//20  25

cout << t1.age << endl;

GetAgeB(t1);//使用二種方法調(diào)用,因?yàn)槭莿e名,所以不需要任何符號//25   25

cout << t1.age << endl;

int x = 10;

int y = 20;

MySwap(x, y);//是第一個(gè)交換的方法,沒有效果

cout << "x: " << x<< "   " << "y: " << y<< endl;

MySwap2(&x, &y);

cout << "x: " << x<< "   " << "y: " << y<< endl;

MySwap3(x, y);//利用引用,可以使代碼簡單,也可以實(shí)現(xiàn)

cout << "x: " << x<< "   " << "y: " << y<< endl;

 

int x1;

int y1;

x1 = GetA1();

y1 = GetA2();//如果用int值的變量來接這個(gè)函數(shù)C++會把a(bǔ)的值賦給y1

int &z = GetA2();//定義一個(gè)引用來接這個(gè)函數(shù)嗎,也就是來接a的本身,就是那串內(nèi)存地址,相當(dāng)于接了個(gè)指針

cout << "x1: " << x1<< "y1: " << y1<< endl;

cout << "&z: " << z<< endl;//z之所以是亂碼是因?yàn)镚etA2返回的是引用,相當(dāng)于返回的是一個(gè)內(nèi)存地址,打印z就是取*z,也就是取得這個(gè)內(nèi)存地址中的值10,由于a這個(gè)變量在GetA2函數(shù)結(jié)束時(shí)就被析構(gòu)掉了,所以沒有值了,所以為亂碼

 

GetA3() = 100;//可以編譯成功說明沒有問題,將100賦值給GetA3,也就是將變量a變成了100

cout << GetA3() << endl;//這里又調(diào)用了一次所以為101

 

return 0;

}

 

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 大同市| 定南县| 永城市| 隆德县| 甘泉县| 都安| 西昌市| 谷城县| 西峡县| 赤水市| 布拖县| 紫阳县| 七台河市| 西畴县| 河东区| 太仆寺旗| 博兴县| 进贤县| 新邵县| 平原县| 连云港市| 郯城县| 仪征市| 辽阳市| 玛多县| 增城市| 永康市| 玉林市| 桃江县| 通城县| 略阳县| 正蓝旗| 鹿邑县| 三原县| 海淀区| 西安市| 泸州市| 新乡市| 綦江县| 竹北市| 林口县|