c++初级知识之引用和指针和const

知识点回顾

  1. 引用和指针:
    引用:为对象重新起了一个名字,一经定义必须初始化(一旦初始化后其无法再绑定到其他对象上),引用并非对象,无实际地址,无法用指针指向它;
    指针:指针本身就是一个对象,可以赋值和拷贝,无需在定义的时候赋初始值,它的指向可以改变;
    (注:如果函数返回值是一个存在的对象,则返回值可以用“引用”较为高效,其可以少调用一次拷贝构造函数)

  2. 引用的范围:

a.引用变量:
int a = 10;
int &b = a;

b.引用指针:
int* p = NULL;
int* &m = p;(用 m 引用指针 p ,只是给 p 重新起了一个名字)

c.引用数组:
int arr[10];
int (&trr)[10] = arr;

d.引用常变量:
const int d = 10.12;
const int &a = d;(常量 d 只能用常量来引用)

int d = 10.12;
const int &a = d;(常量 a 可以引用变量 d )

3.指针和引用的区别和联系:

a.引用只能在定义的时候初始化一次,之后不能改变指向其他变量(必须从一而终),而指针变量可以指向别的变量,可以更改对象;
b.引用必须指向有效的变量,(比如不能引用一个空对象),指针可以为空;
c.sizeof指针对象和引用对象的意义不同,sizeof引用所得到的值是指向变量对象的大小,而sizeof指针获得的值是对象地址的大小;
d.指针和引用自增自减意义不同;
e.相对而言,引用比指针更安全;

思考:引用可以引用指针吗?当然可以,但是还要看引用的是什么?
1.引用可以引用指针所指向的有效对象(不能是空对象),那么我们就是给指针所指向的对象起了一个别名;
2.引用也可以引用我们的指针,(指针引用指针),相当于给我们的原指针起了一个别名,但是二者所指向的地址是同一块地址;
在这里插入图片描述
但是反向则不可以,不允许使用指向引用的指针。

面向对象的优点:安全性和独立性(封装),可重用性(继承)

4.const修饰符:


 a.const修饰变量:
 int const *p = const int *p(等价)
                          (含义:*p所指向的值不能改变)
 int * const p   
                           (含义:p的值不能改变)
 const int * const p
                           (含义:*p和p的值都不能改变)
b.const修饰类成员:
  const修饰的类成员变量一经定义必须初始化,且不能改变其值,使其具有常量属性;const修饰的类成员函数不能修改类成员变量,只能使用,使用时const应该放在函数尾部;
  eg:void Display()const{}
  1>const 修饰的对象可以调用const修饰的类成员;
  2>const 修饰的类成员可以调用const修饰的类成员;
  3>非const 修饰的对象可以调用const修饰的成员;
  4>非const 修饰的类成员可以调用const修饰的类成员;
  (如果要在多个文件下共享const修饰的对象,必须在其定义之前+“extern”关键字)

但是!!如果在const修饰的类成员函数中修改成员变量时,是不允许的,但是某些情况下我们需要内部修改怎么办,我们可以使用 “mutable”(可变的) ,他可以帮助释放掉非静态成员变量的const约束。
在这里插入图片描述
在这里插入图片描述
思考:引用是否也占用空间?
引用的底层其实就是const* 类型,它也占用一定空间
对引用使用&获取的地址和对象地址相同,是因为这不是引用的真实地址,
因为引用的意义就是一个对象的别名,对她的所有操作都是对这个对象而言的,所以&获取的地址也是对象的地址;
这里有篇文章讲的比较详细:链接

备注:指针的地址不是对象的地址,是存放对象地址的地址(指针也是一个对象,指向(存放)一个对象的地址)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值