C++ 引用、指针、const

C++ 引用、指针、const


引用

  • 引用就是对象的一个别名,常用作函数的形式参数。通过在变量名前加“&”来定义。不能定义引用类型的引用,什么是引用类型的引用?
int a = 10;
int& b = a;
int& c = b;
//上面代码可以编译通过,且可运行,c的值也为10
int&& d = c;   //编译不通过,这是引用类型的引用,就如int** p是指针的指针同理


  1. 引用是别名

因为引用只是所绑定对象的一个别名,所以对引用所作的操作都会作用到它所绑定的对象上。
  • 引用必须用于该引用同类型的对象初始化
int i = 1024;
int& ref1;   //error:未初始化
int& ref2 = 100; //error:初始化必须为一个同类型的对象
int& ref3 = i;      //ok

引用与指针区别


  1. 相同点

指针和引用都是地址的概念,指针指向一块内存,它的值是这块内存的地址;引用是某块内存的别名。

  • 区别
    • 引用是个别名,指针是个实体
      • 指针可以为空,引用不能为空
      • 引用使用时不需要解引号(*),而指针需要
      • 引用只能在定义时初始化一次,之后不能改变,指针可以改变指向的对象
      • “sizeof引用”得到的是所绑定对象的大小,而“sizeof指针”得到的是指针本身的大小
      • 引用和指针的自增运算符(++)意义不一样
        引用与指针不难区别,当引用和指针加上const就懵了,看看它们之间的用法吧。

const与引用,指针

const用法

  • const用法主要是防止定义的对象再次被修改,把修饰的对象转变为了一个常量,定义const类型的变量时要初始化。
const int size = 1024; //定义size为常量并初始化为1024,变量size仍然是一个左值,但是是一个不可修改的左值
size = 10;      //error:不可修改const修饰的对象


  • const对象默认为文件的局部变量

在全局作用域声明的const变量是定义在该对象的文件的局部变量,此变量只存在于那个文件中,不能被其它文件访问。通过制定const变量为extern,就可在整个程序中访问const对象。
//file1.cpp
extern const int buf = 512;
//file2.cpp
extern const int buf;       //file1.cpp中buf必须显式地加上extern才能编译通过并使用

const与引用


  • const引用

const引用是指向const对象的引用
const int val = 1024;
int& ref1 = val;    //error:非const引用绑定一个const对象是非法的
const int& ref2 = val;  //ok

//上面代码中ref2不能修改了,任何对ref2的赋值操作都是非法的

const引用可以初始化为不同类型的对象或者初始化为右值

int i = 10;
const int& ref = 20;
const int& ref2 = ref+i;
//编译通过

const与指针


  • 指向const对象的指针

我们可以使用指针来修改所指对象的值,但是如果指针指向的是const对象,我们就不能让指针来修改所指对象的值,c++强制要求指向const对象的指针必须具有const特性。
const int* cptr;
//cptr是一个指向int类型const对象的指针,const限定了cptr指针所指向的对象的类型,而非cptr指针本身。即cptr并不是const。在定义时也就不需要对cptr进行初始化,如果需要,cptr可以改变指向其它 const int型的变量。但不能通过cptr改变所指对象的值
*cptr = 20;     //error:不能修改cptr所指对象的值

允许把非const对象的地址赋给指向const对象的指针

int val = 2;
const int* ref = &val;  //ok,尽管val不是const对象,但是任何想通过ref修改其值的香味都会编译错误
//但是val不是const对象,所有有可能被其它方式修改值,只是ref不能修改val的值


  • const指针

指针本身的值不能修改,即不能改变指针指向其它对象,任何给指针赋值的行为都会编译错误,const指针也必须在定义时初始化。
  • 指向const对象的const指针
const int* const ptr = &a;  //既不能修改所指对象的值,也不允许修改指针指向
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值