引用做函数參数
struct Teacher
{
char name[64];
int age ;
};
void printfT(Teacher *pT)
{
cout<<pT->age<<endl;
}
//pT是t1的别名 ,相当于改动了t1
void printfT2(Teacher &pT)
{
//cout<<pT.age<<endl;
pT.age = 33;
}
//pT和t1的是两个不同的变量
void printfT3(Teacher pT)
{
cout<<pT.age<<endl;
pT.age = 45; //仅仅会改动pT变量 ,不会改动t1变量
}
void main()
{
Teacher t1;
t1.age = 35;
printfT(&t1);
printfT2(t1); //pT是t1的别名
printf("t1.age:%d
", t1.age); //33
printfT3(t1) ;// pT是形參 ,t1 copy一份数据 给pT //---> pT = t1
printf("t1.age:%d
", t1.age); //35
cout<<"hello..."<<endl;
system("pause");
return ;
}
引用的本质
struct Teacer {
int &a; //4个字节,相似指针
int &b;
};
int main()
{
printf("sizeof(Teacher) %d
", sizeof(Teacer));
system("pause");
return 0;
}
1)引用在C++中的内部实现是一个常指针Type& name ==Type* const name
2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针同样。
3)从使用的角度。引用会让人误会其仅仅是一个别名。没有自己的存储空间。这是C++为了有用性而做出的细节隐藏。当实參传给形參引用的时候,仅仅只是是c++编译器帮手工取了一个实參地址,传给了形參引用(常量指针)
函数返回值是引用
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;
}
指针引用
#include <iostream>
using namespace std;
namespace namespaceA {
int a = 20;
}
namespace namespaceB {
int a = 10;
namespace namespaceC { //命名空间嵌套
struct Teacher {
string name;
int age;
};
}
}
struct Teacher {
string name;
int age;
};
void OperatorTeacher(Teacher * const p) { //指针不能被改动
}
void OperatorTeacher(const Teacher * p) {//指针指向的数据不能被改动
}
void swap(int &a, int &b){ //引用交换。c++编译器用常指针实现。* const
int c;
c = a;
a = b;
b = c;
}
void getTeacher(Teacher **p) { //*p=pT
Teacher *tmp = NULL;
tmp = (Teacher *)malloc(sizeof(Teacher));
tmp->age = 50;
*p = tmp;
}
void getTeacher2(Teacher* &p) { //p是pT的别名
Teacher *tmp = NULL;
tmp = (Teacher*)malloc(sizeof(Teacher));
tmp->age = 60;
p = tmp;
}
int main() {
//using namespace namespaceB::namespaceC;
cout << "hello" << endl;
//cout << namespaceB::a << endl;
int a = 0;
int &b = a; //引用,b是a别名
const int &c = a;//常引用,不能变数值
//cout << b << endl;
int x = 1, y = 2;
swap(x, y);
//cout << x << endl << y << endl;
Teacher *pT = NULL;
getTeacher(&pT); //通过指针方式获取数据,子函数内产生数据
getTeacher2(pT); //通过引用方式获取数据。子函数内产生数据
cout << pT->age << endl;
return 0;
}
常引用
void main()
{
//普通引用
int a = 10;
int &b = a;
//常量引用 :让变量引用仅仅读属性
const int &c = a;
//常量引用初始化 分为两种
//1 用变量 初始化 常量引用
{
int x = 20;
const int& y = x;
printf("y:%d
", y);
}
//2 用常量 初始化 常量引用
{
//int &m = 10; //引用是内存空间的别名 字面量10没有内存空间 没有方法做引用
const int &m = 10; //当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名
}
cout<<"hello..."<<endl;
system("pause");
return ;
}