C++入门学习:引用和常引用
在C中有个关键字typedef 用来给类型(int, char *, double....)取别名,但不能给变量a取别名(int a;)
在C++新增了一个概念:引用——给空间取别名(变量名a就代表了一块内存空间)
引用的方式: 类型 &要取的别名 = 原来的变量名;(引用变量必须要初始化)
eg:int &b = a;//b是a的引用,也就是a所代表的4字节空间的别名,a和b代表的是同一块空间;对b的操作就是对a的操作,反之亦然。
引用在一定的场合可以代替指针:
void swap(int &a1, int &b1)//传过来的是a和b的引用,就像之前说的对a1,b1的操作就是对a, b的操作
{
int tmp = a1;//将 a和a1所代表的空间里的值 给 tmp保存
a1 = b1; //将 b和b1所代表的空间里的值 赋值 给a和a1所代表的空间
b1 = tmp; //将tmp保存的值 赋值给 b和b1所代表的空间里
}
int main()
{
int a = 10;
int b = 20;
swap(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
复杂数据类型(例如结构体)做参数进行参数传递的时候,不要直接传变量名(传参的过程是一个值传递的过程,会有一个复制的过程,将实参的值复制给形参),可以传指针或引用,以便节省内存空间的开销提高效率。
eg:
struct Student
{
int id;
char name[20];
};
void print(Student *ps)
{
printf ("id = %d, name = %s\n", ps->id, ps->name);
}
// 传引用
void print1(Student &s1)
{
printf ("id = %d, name = %s\n", s1.id, s1.name);
}
//传指针的引用
void init (Student* &t)
{
t = (Teacher *)malloc(sizeof(Teacher)/sizeof(char));
t->id = 1;
strcpy(t->name, "小明");
}
int main()
{
Student s = {1, "小明"};
print (&s);
print1 (s);
Student *p = NULL;
init (p);
printf ("id = %d, name = %s\n", p->id, p->name);
return 0;
}
引用:占4个字节的空间,必须要初始化
引用的内部实现:const 常量指针 //了解就行,还是用上面的方式使用引用
eg: int &b = a; =====>int *const b = &a;
函数的返回值 返回一个引用:不能返回一个栈上变量的引用(返回栈上变量的引用的相当于返回了栈上变量的地址,函数结束后函数内变量所用的空间释放,返回的引用不再可用),可以返回的引用:全局变量,静态变量,堆上的变量。。。
若返回栈变量
不能成为其它引用的初始值
不能作为左值使用
int & func()
{
static int a = 10;
printf ("a = %d\n", a);
return a;
}
4种处理方式
int main()
{
func(); //1 不接收
int b = func(); //2 用普通变量取收,收回来的是值,也就是10这个数,不是变量a代表的空间
b = 20; //不对静态变量a产生影响
func();
int &c = func(); //3 用引用去收,收回来的是空间,a所代表的空间
c = 25; //c和a代表同一块空间, 将他们代表的空间赋值为225
func(); //显示改动后a的值
func() = 30; //4 函数的返回值可以作为左值来使用,将返回的变量a的空间赋值为30
func(); //显示改动后a的值
return 0;
}
常引用
目的:不想通过引用来改变原来空间的值
形式: const int &c = a//相当于 const int * const c = &a
常引用的初始化的两种方法:
int main()
{
int a = 10;
int &b = a;
//1 用变量对常引用进行初始化
const int &c = a;//const int * const pc = &a;
/*
c = 100;
printf("a = %d\n", a);
编译报错error C3892: “c”: 不能给常量赋值
*/
//2 用常量对常引用进行初始化
//引用是一个空间的别名 ----缺空间
//编译器会为这个常量开辟新的空间,将这个常量的值赋值给这个空间
//同时将d作为这个空间的别名
const int &d = 20; //const int * const d = &20
printf("d = %d\n", d);
int *p = (int*)&d;
*p = 40;
printf("d = %d\n", d);
return 0;
}
常引用与引用的对比事例:
int add(const int &a, const int &b)// 常引用
{
return a + b;
}
/*
int add(int &a, int &b)// 引用, 主函数中 c = add(a, 10);在调用函数add的时候会报错, int &b 与常量10的类型不匹配,
{ //不能用常量对引用赋值(引用——给空间取别名),形参需改成常引用
return a + b;
}
*/
int main()
{
int a = 10;
int b = 20;
int c = add(a, b);
printf("c = %d\n", c);
c = add(a, 10);
printf("c = %d\n", c);
return 0;
}
C++入门学习:引用和常引用相关推荐
- C++11中的右值引用(对比左值引用和常引用)、移动构造函数和引用标识符
Hello!各位同学们大家好!逗比老师最近说起来还是挺尴尬的,为什么这么说呢?因为以前我对自己的C++水平还是相当自信的,经常以"精通"来自我评价.但是最近发现自己好像对C++11 ...
- C++普通引用和常引用
普通引用和常引用 普通引用和常引用 变量名的回顾 C++引用的概念 引用意义 引用的本质 指针引用 函数返回值是引用,不能返回栈上的引用,可以返回静态变量和全局变量的引用 函数返回值是引用,如果用引用 ...
- C++ C++基础语法入门总结(二)引用-内联函数-C++11新特性
C++基础语法入门总结 C++引用 再谈引用和指针 C++内联函数 附加C++11新特性 auto关键字 基于范围的for循环 指针空值nullptr C++引用 引用:就是某一变量(目标)的一个别名 ...
- C++中的常引用、常对象、常函数、常数据成员
1.常引用 用const声明的引用就是常引用.常引用所引用的对象不能被更改.经常见到的是常引用作为函数的形参,这样不会发生对实参的误修改.常引用的声明形式为:const 类型说明符 &引用名. ...
- C++中在什么时候需要使用“常引用”?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用. 常引用声明方式:const 类型标识符 &引用名=目标变量名: 例1 int a ;const in ...
- C++什么时候需要使用“常引用”?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用.常引用声明方式:const 类型标识符 &引用名=目标变量名: 例1 int a ; const in ...
- 在什么时候需要使用“常引用”?
在什么时候需要使用"常引用"? 如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用.常引用声明方式:const 类型标识符 &引用名= ...
- 常引用、常对象和对象的常成员
常引用 用const声明的引用就是常引用.常引用所引用的对象不能被更改.我们经常见到的是常引用作为函数的形参,这样不会发生对实参的误修改. 常引用的声明形式为:const 类型说明符 &引用名 ...
- C++中的常对象与常引用
目录 一.常对象 二.用const修饰的类对象 1.常成员函数 声明 注意 三.常引用 1.声明 2.应该在何时使用: 1.在函数中无需改变其值的参数,应该使用常引用. 2.复制构造函数的参数一般也宜 ...
最新文章
- Android studio第一次使用配置(三)gradle项目构建
- 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针 排序 | 通过 交换指针方式 进行排序 )
- Poj 1077 eight(BFS+全序列Hash解八数码问题)
- linux查进程内存问题,关于linux 查看服务进程内存,cpu,内存占用的一些基础命令...
- C语言typedef:给类型起一个别名
- 【滤波器】基于matlab GUI IIR数字滤波器设计【含Matlab源码 044期】
- 精密电阻阻值表丝印大全
- 软件测试人员如何月薪过万、月薪过万的秘籍
- ourdev 学习arm先看看,工具和软件分析
- 分类排序 同辈元素只在数据上的层级关系
- OpenHarmony命令行工具hdc_std使用总结
- 焦距、光圈和景深的关系
- ThinkPad平板电脑在定价上还存在的一个问题是
- 常用的时序图软件收集
- IOS开发之——动画-图标抖动(97)
- Gnocchi 9、gnocchi聚合算法分析
- 团体标准申报的制定程序和标准是什么
- 《微信公众号-腾讯问卷》01-如何创建问卷
- AppleScript 脚本让 Mac 唱生日快乐歌
- 仿QQ侧滑删除,Listview上下滑动,Listview的iteam的点击事件等bug的解决