C++入門 引用詳解
//1.引用作為其他變數的別名而存在,因此在一些場合可以代替指標
//2.引用相對於指標來說具有更好的可讀性和實用性
//3.引用在C++內部實現就是一個常量指標 *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;
}
//引用就不一樣了,引用時將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;
}