c++引用

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;







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值