首页 > 编程 > C++ > 正文

C++入门 引用详解

2019-11-11 07:16:39
字体:
来源:转载
供稿:网友

//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;

}

 

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选