//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;
}
新闻热点
疑难解答