C++知识点总结--引用

引用
引用变量 : 主要用途是用作变量的别名。通过将引用变量用作参数,函数使用原始数据,而不是副本。c++使用&来声明引用。引用是已定义变量的别名

//example:
int rats;
int & rodents = rats;//rats和rodents指向相同的值和相同的内存单元。
//注意--此时&不是地址运算符(等号左边时)。
int *prats = &rats;
//rats,rodents,*prats 三个等价。
//&rodents ,prats,&rats 三个等价

引用的注意事项:引用必须初始化。 如 int & b;错误
引用初始化后就不能修改指向。 如,

//example
int a=10;
int &b = a;
int c=100;
b=c;//就会使得a=b=100;a,b地址不变,相当于将c的值赋值给a,b ;引用初始化后,指向的地址就不会改变了

引用作函数返回值:
1.函数返回值也可以是引用。效率更高。 但要避免返回函数的局部变量–因为函数终止时已经被销毁。但可以返回new出来的变量。
如: int& test(){static int a = 10; return a;}//错误
2.函数的调用可以作为左值

int& text(int& ref){
	return ref;
};
int a = 10;
text() = 1000;//此时ref的值也是1000;因为函数的返回值是引用。
//此时a = ? 1000  返回引用的函数实际上是被引用变量的别名。

左值:可以被引用的数据对象
按引用传递函数参数时: 函数原型和函数定义时 参数前加&;调用时不用加。----可以修改原始数据
不能传递非变量的参数给以引用传参的函数
如果函数调用的参数不是左值或与const引用参数类型不相符时,c++将创建类型正确的匿名变量,将函数的调用值传递给该匿名变量,并且让参数来引用它、

int func(int& x){
	return x+1;
}
int main(){
	int a =10;
	int b = func(a);
	int c = func(a+2);//报错,因为不能执行int&x = a+2;
	return 0;
}
int func(const int& x){
	return x+1;
}
int main(){
	int a =10;
	int b = func(a);
	int c = func(a+2);//为什么可以呢?是因为通过在函数定义时加上const修饰,告诉编译器,函数中不会修改该值,故可以生成临时变量来存储该值,类似于按值传递。
	return 0;
}

按指针传递函数参数时:函数原型和的函数定义时 参数前加*;调用时传递地址。

按值传递函数参数时:–不可以修改原始数据。

将结构的引用作为参数传递给函数时,函数原型和定义时:example: void set(const structname& ft); 如果修改传入的结构 可以去掉前面const。

常量引用: 修饰形参,防止误操作
void showvalue(const int & a){} 只有这样才能防止在函数中修改传入的值
将const也可以应用于引用返回类型—防止被修改

int& accumlate(int a,int b){
	static int c = a/b;
	return c;
}
/*
const int& accumlate(int a,int b){
	static int c = a/b;
	return c;
}*/
accumlate(2,1) = 3 ;//----如果accumlate的返回值只是指向int的引用,则赋值可以通过。

总结:const的位置不同,作用不同:
当const用在函数形参前,用来确保函数不修改传入对应的实参;如果该函数体调用了另一个函数,则另一个函数可以接受该参数作为实参的前提也是被声明为const;
当const用在函数名(functionname())后,用来确保调用该函数(方法)的对象不被修改——用于类方法上;
当const用于返回引用前,用来确保引用或者指针返回的值不能被修改,相比较,如果不加const,则可以把该函数放在赋值语句左侧,即可以赋值给引用返回的对象,加const 就可以避免。见上面的2.函数的调用可以用作左值。
引用的本质是一个指针常量;

引用和指针的区别和使用:
1,指针使用 *->操作符,引用使用.操作符;
2,对于引用来说,没有null reference一说;但是指针可以指向null;故若你需要的一个变量必须代表一个对象,就使用引用,反之,这个对象可以不一直代表某个对象,就使用指针。
3,引用必须初始化一个确定对象,但指针不需要;
4,相比之下,指针可以改变,但是引用不可以,当引用初始化后,就一直指向那个对象。故若你需要一个变量在程序中一直保持指向确定对象,就使用引用。
5,对于重载某些操作符时,会使用引用,比如 重载[] ;

vector<int> arr(3,0);
arr[1] = 10;//这里[]重载就要使用引用,若使用指针,则要使用 *arr[1] = 10;

总结:当我们知道需要指向某个东西,而且绝对不会改变指向其他东西,或者实现某个操作符而其语法无法由指针达成,就选择使用引用,其他时间,就使用指针。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值