C 入門 引用詳解

2021-07-26 14:31:15 字數 3168 閱讀 2084

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

//2.引用相對於指標來說具有更好的可讀性和實用性

//3.引用在c++內部實現就是乙個常量指標 *const p //int &a == int *const a  

#include

"stdafx.h"

#include

#include

"string"

using

namespace std;

class

teacher

public:

int  age;

string name;

void getagea(teacher *pt)

cout <<

pt->age <<

"  ";

pt->age = 25;

//引用就不一樣了,引用時將pt和下邊的t1繫結在了一起,pt相當於t1的別名,他們都指向同一塊記憶體

void getageb(teacher &pt)

cout <<

pt.age <<

"  ";

pt.age = 25;//所以改了pt就改了t1,這屬於c++的乙個加強

void getagec(teacher

pt)//pt是實參,和下邊的t1沒有直接的記憶體關係,只是t1 複製了乙份資料給了pt

pt.age = 25;//因為先改了pt 所以執行結果是25

cout <<

pt.age <<

"  ";

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

//這樣的函式是不能實現交換的

void myswap(int

a, int

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

int c = 0;

c = a;

a = b;

b = c;

//如果要實現交換就要用到指標

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;

//返回值為引用的函式,就是返回a的副本,有記憶體位址也有值

//因為返回的是a的副本,相當於乙個變數所以也可以當左值,但是必須是靜態變數或者是全域性變數,不會被析構,才可以。

int& geta2()

int a = 10;

a++;

return a;

//返回值當左值的測試,變數a為靜態

int& geta3()

static

int a = 10;

a++;

cout <<

"geta3中的a: "

<< a << endl;

return a;

int main()

int a = 5;

int &b = a;//這是乙個普通的引用,當使用時必須初始化,b就為a的乙個別名,很像乙個常量定義

//引用win32平台下占用4個位元組,和指標的占用空間一樣

cout << b << endl;//輸出的結果為5

cout << &b << endl;

cout << &a << endl;//位址是一樣的,這就說明a和b都是同一塊記憶體位址的別名,就是門牌號

teacher t1;

t1.age = 20;

getagec(t1);//使用三種方法呼叫,這裡先使用第三種,目的是看結果,因為第三種方法不改變t1的值,執行後的結果一目了然//25   20

cout << t1.age << endl;

getagea(&t1);//使用一種方法呼叫//20  25

cout << t1.age << endl;

getageb(t1);//使用二種方法呼叫,因為是別名,所以不需要任何符號//25   25

cout << t1.age << endl;

int x = 10;

int y = 20;

myswap(x, y);//是第乙個交換的方法,沒有效果

cout <<

"x: "

<< x <<

"   "

<<

"y: "

<< y << endl;

myswap2(&x, &y);

cout <<

"x: "

<< x <<

"   "

<<

"y: "

<< y << endl;

myswap3(x, y);//利用引用,可以使**簡單,也可以實現

cout <<

"x: "

<< x <<

"   "

<<

"y: "

<< y << endl;

int x1;

int y1;

x1 = geta1();

y1 = geta2();//如果用int值的變數來接這個函式c++會把a的值賦給y1

int &z = geta2();//定義乙個引用來接這個函式嗎,也就是來接a的本身,就是那串記憶體位址,相當於接了個指標

cout <<

"x1: "

<< x1 <<

"y1: "

<< y1 << endl;

cout <<

"&z: "

<< z << endl;//z之所以是亂碼是因為geta2返回的是引用,相當於返回的是乙個記憶體位址,列印z就是取*z,也就是取得這個記憶體位址中的值10,由於a這個變數在geta2函式結束時就被析構掉了,所以沒有值了,所以為亂碼

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

cout << geta3() << endl;//這裡又呼叫了一次所以為101

return 0;

C 引用詳解

引用的概念 引用 就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法 型別識別符號 引用名 目標變數名 如下 定義引用ra,它是變數a的引用,即別名。int a int ra a 1 在此不是求位址運算子,而是起標識作用。2 型別識別符號是指目標變數的型別。3 宣告...

C 引用詳解

引用的概念 引用 就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法 型別識別符號 引用名 目標變數名 如下 定義引用ra,它是變數a的引用,即別名。int a int ra a 1 在此不是求位址運算子,而是起標識作用。2 型別識別符號是指目標變數的型別。3 宣告...

C 「引用」詳解

引用是識別符號的 別名 或者這樣說,如果為乙個物件定義了引用,那麼這個引用就相當於這個物件的 別名 就類似於有個同學叫王明,但是他還有乙個外號,叫大毛,那麼這個大毛即是王明的別名。模擬推論,引用即是物件的別名。定義引用一般採取如下形式 型別 引用變數名 已定義的變數名 需要注意的是 定義乙個引用的時...