在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++入门学习:引用和常引用相关推荐

  1. C++11中的右值引用(对比左值引用和常引用)、移动构造函数和引用标识符

    Hello!各位同学们大家好!逗比老师最近说起来还是挺尴尬的,为什么这么说呢?因为以前我对自己的C++水平还是相当自信的,经常以"精通"来自我评价.但是最近发现自己好像对C++11 ...

  2. C++普通引用和常引用

    普通引用和常引用 普通引用和常引用 变量名的回顾 C++引用的概念 引用意义 引用的本质 指针引用 函数返回值是引用,不能返回栈上的引用,可以返回静态变量和全局变量的引用 函数返回值是引用,如果用引用 ...

  3. C++ C++基础语法入门总结(二)引用-内联函数-C++11新特性

    C++基础语法入门总结 C++引用 再谈引用和指针 C++内联函数 附加C++11新特性 auto关键字 基于范围的for循环 指针空值nullptr C++引用 引用:就是某一变量(目标)的一个别名 ...

  4. C++中的常引用、常对象、常函数、常数据成员

    1.常引用 用const声明的引用就是常引用.常引用所引用的对象不能被更改.经常见到的是常引用作为函数的形参,这样不会发生对实参的误修改.常引用的声明形式为:const 类型说明符 &引用名. ...

  5. C++中在什么时候需要使用“常引用”?

    如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用. 常引用声明方式:const 类型标识符 &引用名=目标变量名: 例1 int a ;const in ...

  6. C++什么时候需要使用“常引用”?

    如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用.常引用声明方式:const 类型标识符 &引用名=目标变量名: 例1 int a ; const in ...

  7. 在什么时候需要使用“常引用”?

    在什么时候需要使用"常引用"? 如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用.常引用声明方式:const 类型标识符 &引用名= ...

  8. 常引用、常对象和对象的常成员

    常引用 用const声明的引用就是常引用.常引用所引用的对象不能被更改.我们经常见到的是常引用作为函数的形参,这样不会发生对实参的误修改. 常引用的声明形式为:const 类型说明符 &引用名 ...

  9. C++中的常对象与常引用

    目录 一.常对象 二.用const修饰的类对象 1.常成员函数 声明 注意 三.常引用 1.声明 2.应该在何时使用: 1.在函数中无需改变其值的参数,应该使用常引用. 2.复制构造函数的参数一般也宜 ...

最新文章

  1. Android studio第一次使用配置(三)gradle项目构建
  2. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针 排序 | 通过 交换指针方式 进行排序 )
  3. Poj 1077 eight(BFS+全序列Hash解八数码问题)
  4. linux查进程内存问题,关于linux 查看服务进程内存,cpu,内存占用的一些基础命令...
  5. C语言typedef:给类型起一个别名
  6. 【滤波器】基于matlab GUI IIR数字滤波器设计【含Matlab源码 044期】
  7. 精密电阻阻值表丝印大全
  8. 软件测试人员如何月薪过万、月薪过万的秘籍
  9. ourdev 学习arm先看看,工具和软件分析
  10. 分类排序 同辈元素只在数据上的层级关系
  11. OpenHarmony命令行工具hdc_std使用总结
  12. 焦距、光圈和景深的关系
  13. ThinkPad平板电脑在定价上还存在的一个问题是
  14. 常用的时序图软件收集
  15. IOS开发之——动画-图标抖动(97)
  16. Gnocchi 9、gnocchi聚合算法分析
  17. 团体标准申报的制定程序和标准是什么
  18. 《微信公众号-腾讯问卷》01-如何创建问卷
  19. AppleScript 脚本让 Mac 唱生日快乐歌
  20. 仿QQ侧滑删除,Listview上下滑动,Listview的iteam的点击事件等bug的解决

热门文章

  1. 付费学习,花钱比意志力靠谱
  2. 量化投资学习必读书目(八)——《短线交易大师》
  3. 德鲁克:CEO必须秉持的六项原则
  4. 联想拯救者y空间_锐龙H真给劲儿 联想拯救者R7000 2020首测
  5. 如何快速将多个文件夹下内容合并到一个文件夹下
  6. 董老师走进斯坦福讲座
  7. 南方cass字体样式设置_统一设置导航条风格和修改字体
  8. HM编码器代码阅读(31)——帧间预测之AMVP/Merge模式(六)运动补偿
  9. 网站页面制作教程[纯萌新]
  10. DSP28335 CAN模块例程