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");
}
函数返回值引用当左值:
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;
}
输出:11 和101,以为引用返回的是变量本身,所以fun1()=100,就相当于给静态变量va赋值100;