引用的知识大概分四块:引用基础、引用当左值、指针的引用、const(常量)的引用
1、引用(普通引用)
⑴引用概念
⑵引用是C++的概念
⑶引用做函数参数
普通引用在声明时必须用其他的变量进行初始化
引用作为函数参数时不进行初始化
①复杂数据类型 的引用
#include <iostream>
using namespace std;
struct Teacher
{
char name[64];
int age;
}
void printfT(Teacher *pT)
{
cout << pT->age << endl; //指针应用
}
void printfT2(Teacher &pT)
{
cout << pT.age << endl; // 引用
pT.age = 33; //pT是t1的别名,相当于修改了t1;
}
void printfT3(Teacher pT)
{
cout << pT.age << endl;// pT是形参
pT.age = 45; //只会修改pT变量,不会修改t1变量
}
void main()
{
Teacher t1;
t1.age = 35;
printfT(&t1);
printfT2(t1); //pT是t1的别名
printfT3(t1); //pT是形参,t1 拷贝一份数据给pT
printf("t1.age:%d \n",t1.age); //输出依然为35
cout << "hello..." << endl;
}⑷引用的意义
⑸引用的本质思考
两点来思考:1、C++编译器背后做了什么工作?
2、普通引用有自己的空间吗?答案是 有的
引用的本质:引用是一个有地址,引用是常量。。。
char* const p;
⑹引用的本质
⑺引用结论
⑻函数返回值是引用(引用当左值)
C++引用使用时的难点:
当函数返回值为引用时,
1、 若返回栈变量
不能成为其他引用的初始值
不能作为左值使用
#include <iostream>
int getAA1()
{
int a;
a = 10;
return a;
}
//返回a的本身;要看用什么类型来 接收返回的值
int& getAA2()
{
int a; //
a = 10;
return a;
}
int* getAA3()
{
int a;
a = 10;
return &a;
}
void main()
{
int a1 = getAA1; //输出a1 = 10
int a2 = getAA2();// 输出a2 =
int &a3 = getAA2();//是错误的;若返回栈变量 不能成为其他引用的初始值
cout << "hello.." << endl;
}2、 若返回静态变量或全局变量
可以成为其他引用的初始值
即可作为右值使用,也可作为左值使用
int j1()
{
static int a = 10;
a++;
return a;
}
int& j2()
{
static int a = 10;
a++;
return a;
}
void main()
{
int a1 = 10;
int a2 = 20;
a1 = j1();
a2 = j2();
int &a3 = j2();
printf("a1:%d\n",a1);
printf("a2:%d\n",a2);
printf("a3:%d\n",a3);
}
//函数当左值
//返回变量的值
int g1()
{
static int a = 10;
a++;
return a;
}
//返回变量本身
int& g2()
{
static int a = 10;
a++;
return a; //即返回变量a
}
void main()
{
g1() = 100;//相当于 10 = 100;是错误的
g2() = 100;//相当于 a = 100;改变了a的值 ;原因:函数返回值是一个引用,可以当左值
g2(); //打印a的值,应该是101
}C++链式编程中,经常用到引用,运算符重载专题
⑼指针引用
C语言二级指针原理
#include <iostream>
using namespace std;
struct Teacher
{
char name[64];
int age;
}
//在被调用函数 获取资源
int getTeacher(Teacher **p)
{
Teacher **tmp = NULL;
tmp = (Teacher *)malloc(sizeof(Teacher));
if(tmp == NULL)
{
return -2
}
p->age = 33; //p是实参的地址 *实参的地址 去间接的修改实参的值
*p = tmp;
}
//C++中的引用 (指针引用)
int getTeacher2(Teacher * &myp)
{
//给myp赋值相当于给main函数中的pT1赋值
myp = (Teacher *)malloc(sizeof(Teacher));
if(myp == NULL)
{
return -1;
}
myp->age = 36;
}
void freeTeacher(Teacher *pT1)
{
if(pT1 == NULL)
{
return;
}
free(pT1);
}
void main()
{
Teacher *pT1 = NULL;
1、//C语言中的二级指针
getTeacher(&pT1);
cout << "age" << pT1->age << endl;
freeTeacher(pT1);
2、//C++中的引用(指针的引用)
//引用的本质 间接赋值的后两个条件 让C++编译器帮程序员做了
getTeacher2(pT1);
cout << "age" << pT1->age << endl;
freeTeacher(pT1);
cout << "hello..." << endl;
}本文出自 “11907685” 博客,请务必保留此出处http://11917685.blog.51cto.com/11907685/1893022
原文:http://11917685.blog.51cto.com/11907685/1893022