二-从C到C++
2023-12-29 09:37:32
本章会介绍一些C++拓展的非面向对象的功能
- 引用
1?概念
引用从一定程度上讲是指针的平替,几乎被所有的面向对象语言所使用。引用相当于对某一目标变量起“别名”。
操作这个别名,与操作原变量一样。(操作同一块地址)不能有相同别名
#include?<iostream>
using namespace?std;
int main()
{
int?a?= 1;
//?b是a的引用
int &b?=?a;
????cout?<<?a?<< "?" << &a?<<?endl; //?1?0x61fe88
????cout?<<?b?<< "?" << &b?<<?endl; //?1?0x61fe88
return 0;
}
2?引用的性质
1)可以改变引用的值,但是不能再次成为其他变量的引用
#include?<iostream>
using namespace?std;
int main()
{
int?a?= 1;
//?b是a的引用
int &b?=?a;
int?c?= 3;
????b?=?c; //?只是单纯的赋值,不是引用,b还是a的引用
????cout?<<?a?<< "?" << &a?<<?endl; //?1?0x61fe88
????cout?<<?b?<< "?" << &b?<<?endl; //?1?0x61fe88
????cout?<<?c?<< "?" << &c?<<?endl; //?1?0x61fe88
return 0;
}
2)声明引用时,必须要初始化
#include?<iostream>
using namespace?std;
int main()
{
int?a?= 1;
//????int?&b;?//?错误?引用必须要初始化
????cout?<<?a?<< "?" << &a?<<?endl; //?1?0x61fe88
//?cout?<<?b?<<?"?"?<<?&b?<<?endl;?//?1?0x61fe88
return 0;
}
3)声明引用的时候,不能初始化为null
#include?<iostream>
using namespace?std;
int main()
{
int?a?= 1;
//????int?&b?=?NULL;?//?错误,引用不能初始化为NULL
????cout?<<?a?<< "?" << &a?<<?endl; //?1?0x61fe88
//?cout?<<?b?<<?"?"?<<?&b?<<?endl;?//?1?0x61fe88
return 0;
}
4)声明引用的时候,初始化的值可以是纯数值,但是此时需要使用const关键字修饰引用,表示该引用为常量引用,这样的引用的值不能改变。
#include?<iostream>
using namespace?std;
int main()
{
int?a?= 1;
const int &b?= 444;
//?b?=?2;?//?错误?常量引用的数值不能被改变
????cout?<<?a?<< "?" << &a?<<?endl; //?1?0x61fe88
????cout?<<?b?<< "?" << &b?<<?endl; //?1?0x61fe88
return 0;
}
5)可以将变量引用的地址赋值给一个指针,此时指针指向的还是原来的变量。
#include?<iostream>
using namespace?std;
int main()
{
int?a?= 1;
int &b?=?a;
int *c?= &b;//指针c
????cout?<<?a?<< "?" << &a?<<?endl; //?1?0x61fe88
????cout?<<?b?<< "?" << &b?<<?endl; //?1?0x61fe88
????cout?<< *c?<< "?" <<?c?<<?endl; //?1?0x61fe84
return 0;
}
6)可以使用const修饰引用,此时如果原变量的值改变,引用的值也改变
#include?<iostream>
using namespace?std;
int main()
{
int?a?= 1;
const int &b?=?a;
//????b++;?//?错误,b是只读的
????a++;
????cout?<<?a?<< "?" << &a?<<?endl; //?2?0x61fe88
????cout?<<?b?<< "?" << &b?<<?endl; //?2?0x61fe88
return 0;
}
【思考】
写一个函数,函数有两个参数a和b,函数的功能是交换两个传入的参数【原来变量】的值。
#include?<iostream>
using namespace?std;
//c语言普通模式
void type1(int *a,int *b)
{
int?c;
????c=*a;
*a=*b;
*b=c;
}
//c语言异或
void type2(int *a,int *b)
{
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
//不会产生副本
void type3(int &x,int &y)
{
????x=x^y;
????y=x^y;
????x=x^y;
}
int main()
{
int?a?= 1;
int?b?= 5;
????cout?<<"a=" <<?a??<< "?" << &a?<<?endl;
????cout?<<"b=" <<?b?<< "?" << &b?<<?endl;
//????type1(&a,&b);//c语言普通模式
//????type2(&a,&b);//c语言异或
type3(a,b);//不会产生副本
????cout<<"----------------------"<<endl;
????cout?<<"a=" <<?a??<< "?" << &a?<<?endl;
????cout?<<"b=" <<?b?<< "?" << &b?<<?endl;
return 0;
}
引用作为参数进行定义的时候,在参数传递时,是不会产生副本的,这样会提高运行效率,我们在正常编程当中,建议使用引用进行传递参数。
引用形参,在不参与计算的情况下,我们建议使用const进行修饰。以达到引用的安全性。
文章来源:https://blog.csdn.net/m0_74937538/article/details/135282557
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!