c++的引用与c语言的指针相似;
引用的特性:
1 引用在定义是必须被初始化;
2 引用在被初始化时其初始化数据的类型必须和引用定义的类型相同
3 引用是c++特有的属性;
4 引用的实质是给变量取一个别名,所以相当于操作变量本身;
5 引用类型和指针类型相似,都占四个字节;
一 简单引用
简单引用的举例:
int main()
{
int a=10;
int &b=a;
b=20;
cout<<"a="<<a<<" b="<<b<<endl;
return 0;
}
输出20 20;
二 复杂引用
复杂引用举例:
struct complex
{
int age=100;
};
void complex_t1(struct complex cp1)
{
cp1.age=10;
}
void complex_t2(struct complex &cp2)
{
cp2.age=199;
}
int main()
{
struct complex va1,va2;
complex_t1(va1);
cout<<"va1="<<va1.age<<endl;
complex_t2(va2);
cout<<"va2="<<va2.age<<endl;
int va3=19;
// double &va4=va3;
// cout<<"va4="<<va4<<endl;
return 0;
}
输出: 100 199;
引用的实质是给变量取一个别名,所以相当于操作变量本身
int main()
{
int va=10;
int &vb=va;
cout<<"address of va:"<<&va<<" "<<"address of vb:"<<&vb<<endl;
return 0;
}
变量va 和vb的地址相同
引用类型和指针类型相似,都占四个字节;
struct example
{
int age;
char name[64];
double &va;
int &vb;
};
int main()
{
cout<<"sizeof(struct example)"<<sizeof(struct example)<<endl;
return 0;
}
输出:76
引用的实质:
void modfily1(int &a) { a=105; } void modfily2(int *const a) { *a=108; } int main() { int va=12; modfily1(va); cout<<"modfily1(va)"<<va<<endl; modfily2(&va); cout<<"modfily2(va)"<<va<<endl; return 0; }
输出:105和108,所以modfily2是modfily1的实质三 引用做函数返回值
引用做函数返回值是注意事项:
* 1 不能返回局部变量的引用,主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。
* 2 不能返回函数内部new分配的内存的引用,主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。
* 3 应用不能成为其他应用的初始值
* 4 引用不能作为左值使用
* 5 返回的是函数返回值本身,不是其副本
* 6返回的是静态或者全局变量则可以是其他引用的初始值
例:
函数返回值引用当左值:#include <iostream> #include <stdlib.h> using namespace std; float temp;//定义全局变量temp float fn1(float r);//声明函数fn1 float &fn2(float r);//声明函数fn2 r float fn1(float r){//定义函数fn1,它以返回值的方法返回函数值 temp = (float)(r*r*3.14); return temp; } float &fn2(float r){//定义函数fn2,它以引用方式返回函数值 temp = (float)(r*r*3.14); return temp; } float &fn3(float r){//定义函数fn2,它以引用方式返回函数值 static float swap= (float)(r*r*3.14); return swap; } void main(){ float a = fn1(10.0);//第1种情况,系统生成要返回值的副本(即临时变量) // float &b=fn1(10.0); //第2种情况,可能会出错(不同 C++系统有不同规定) // 编译错误:cannot convert from 'float' to 'float &'//终端提示:非常量引用的初始值必须为左值,左右两边类型不相同 // A reference that is not to 'const' cannot be bound to a non-lvalue //不能从被调函数中返回一个临时变量或局部变量的引用 float c = fn2(10.0);//第3种情况,系统不生成返回值的副本 //可以从被调函数中返回一个全局变量的引用 float &d = fn2(10.0); //第4种情况,系统不生成返回值的副本 cout << "a=" << a << ",c=" << c << ",d=" << d << endl; //可以从被调函数中返回一个静态变量的引用 float &f = fn2(10.0); cout << "a=" <<f << endl; system("pause"); }
输出:11 和101,以为引用返回的是变量本身,所以fun1()=100,就相当于给静态变量va赋值100;int& fun1()//返回变量本身 { static int va = 10; va++; cout << "va= " << va << endl; return va; } int main() { fun1(); //int b = 100; //int& vb=fun1(); fun1() = 100; fun1(); system("pause"); return 0; }