您的位置:首页 > 编程语言 > C语言/C++

C++ 引用、指针、const

2016-08-12 16:21 399 查看

C++ 引用、指针、const

引用

引用就是对象的一个别名,常用作函数的形式参数。通过在变量名前加“&”来定义。不能定义引用类型的引用,什么是引用类型的引用?

int a = 10;
int& b = a;
int& c = b;
//上面代码可以编译通过,且可运行,c的值也为10
int&& d = c;   //编译不通过,这是引用类型的引用,就如int** p是指针的指针同理


引用是别名

因为引用只是所绑定对象的一个别名,所以对引用所作的操作都会作用到它所绑定的对象上。
引用必须用于该引用同类型的对象初始化

int i = 1024;
int& ref1;   //error:未初始化
int& ref2 = 100; //error:初始化必须为一个同类型的对象
int& ref3 = i;      //ok


引用与指针区别

相同点

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

区别

引用是个别名,指针是个实体

指针可以为空,引用不能为空

引用使用时不需要解引号(*),而指针需要

引用只能在定义时初始化一次,之后不能改变,指针可以改变指向的对象

“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;  //既不能修改所指对象的值,也不允许修改指针指向
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: