引用的知识大概分四块:引用基础、引用当左值、指针的引用、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