学习笔记 C++ 关于 引用 & 的一些学习总结(包含一部分 const 的说明)

引用的本质:( <数据类型> * const <引用名> 常指针)
1.为已有变量取别名,对指针的包装,避免使用裸露的指针;
2.取代指针传参,可以用引用解决的问题,避免用指针来解决;
3.传引用等价于扩展变量的作用域,避免传n级指针;

1.引用的规则
1.是一种关系型的声明,必须进行初始化,且与引用的原类型相一致,且不分配内存;
2.一经声明,不可变更;
3.多次引用,使同体变量具有多个别名,是平行关系;
4. &符号前是数据类型才叫做引用,其他的皆为按位与或者取地址;

int a = 100;
int & ra = a;// ra = 100;a 和 ra 的地址相同
//int &ra;
//double &ra = a;    均为错误使用
int &xra = a; //同ra 的本质一样
// = & a; 取地址 
// a&b;  按位与
void swap(int a, int b);// 1不可以进行交换
void swap(int *a, int *b);
// 2这样才可以进行交换,使用swap(&a,&b),
void swap(int &a, int &b);
// 3这样也进行交换,使用swap(a,b),

2.引用和指针
1.指针的引用 - 有
2.引用的指针 - 无
3.指针的指针 - 有
4.引用的引用 - 无
5.指针 数组 - 有 引用 数组 - 无

char *p = "china";
char *q = "canada";
char *&rp = p;
char *&rq = q;
void swap(char *p, char *q); 
// 1.swap(q,p)无法交换内容
void swap(char **p, char **q); 
// 2.swap(&q,&p)可以交换内容
void swap(char *&rp, char *&rq); 
// 3.swap(q,p)也可以交换内容

// int & *rpa = &a; 不能声明为引用的指针,编译报错; 引用的指针无
/*
int a;
int &a = a;
int &&b = a;//不能使用此法,无法使用引用的引用
*/
int a,b,c;
int *p[] = {&a, &b, &c};//可以使用 int **
int &q[] = {a, b, c};//不可以使用  int &*
int arr[10];
int * const & parr = arr;  //数组引用

3.常引用
const 定义的常量 称为常变量 常用于取代#define 宏常量
const 与引用的定义 常见的问题如下:
1.const的本意是不可修改;
2.const 对象,只能声明为const的引用
3.non-const的对象,既可以声明为non-const引用,也可以声明为const引用,一经声明为const引用,则不能修改数据,内容。

const int a = 10;
const int & ra = a ; //ra = 10;
 int a = 10;
const int & ra = a ; //ra = 10;
const int a = 10;
int & ra = a ; //ra = 10;//不能这么使用 ,必须加const

4.临时对象
定义:通常不可取地址的对象,即CPU计算产生的中间变量,常用的临时变量有:常量,表达式,函数返回值。

int &a = 55;//不可以用
const int &a = 55;//可以用,常量可以定义为const 的 引用

int a = 3;
int b = 5;
int &ret = a + b;//不可以用
const int &ret = a + b;//可以用,表达式可以定义为const 的 引用
int foo();
int &ret = foo();//不可以用
const int &ret = foo();//可以用,函数返回值可以定义为const 的 引用
//类型不同的变量
double d = 1000.2;
const int &ret = d;//同上,ret = 1000 ,ret不可以改变

const的作用:
1.可以避免无意修改数据的编程错误;
2.使用const可以处理const和非const的实参,否则只能接受非const数据;
3.使用const的引用,可以使函数能够正确的生成并使用临时变量(实参和引用参数不匹配,就会生成临时变量)。

5.const 在类中的拓展

const修饰类数据成员:
1.可以被普通成员函数和常成员函数使用,但是该数据成员不可更改;
2.必须进行初始化,必须在类内进行初始化,最好在初始化列表中进行初始化。

const修饰类函数成员:
<返回类型> <类名>::<函数名><参数列表> const
1.const 类成员函数,不可以修饰全局函数;
2.可以构成重载,修饰参数,函数类型;
*非const对象 优先调用非const 版本;
*const对象只能调用const函数;
*针对const 有可能修饰对象,往往提供两个版本
3.const修饰类成员函数 ,在本函数内不会发生改变数据成员的行为;
4.只能调用 const 函数;

const 修饰对象
1.该对象可以 包含非数据成员,但不可以修改;
2.只能调用const成员函数;
3.拥有const修饰对象的类必须提供自实现的构造函数,并在初始化列表中进行数据成员的初始化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值