const指针的引用

http://bbs.csdn.net/topics/310047017



const用法详解

http://bbs.csdn.net/topics/310007610

1)对于非指针引用的形参,如fun1,传入非const实参没问题,如fun1(a)
但对于指针引用的形参,如fun,传入非const实参却有问题,如fun(b),
而传入const实参就没有问题,如fun(c),
为什么?

2)另外,进行强制类型转换,将非const实参转换为const实参,
这种转换(const int *)是错误的,如fun((const int *)d),
而必须这样转换fun((const int *&)e),
为什么?

#include "stdafx.h"

void fun(const int *&)
{
}

void fun1(const int &)
{
}

int _tmain(int argc, _TCHAR* argv[])
{
int a = 0;
fun1(a);//ok

int *b = new int(0);
fun(b);//error
delete b;

const int *c = new int(0);
fun(c);//ok
delete c;

int *d = new int(0);
fun((const int *)d);//error
delete d;

int *e = new int(0);
fun((const int *&)e);//ok
delete e;

return 0;
}

1)对于指针引用的形参,如fun,传入非const实参有问题,如fun(b), 
因为const int*& 这个引用的基本类型是const int*
非const引用只能引用相同类型的值 const int*和int*不一样 而const引用则可以接受不同类型
如果fun改成void fun(const int * const &) 这样就可以了

2)另外,进行强制类型转换,将非const实参转换为const实参, 
这种转换(const int *)是错误的,如fun((const int *)d), 
而必须这样转换fun((const int *&)e), 
同上  类型不一致 改成void fun(const int * const &) 就没错了
const类型的引用不检查类型一致性 修饰指针的时候要再声明const才是const类型引用

const引用可以初始化为不同类型的对象或者右值(如字面值常量),但非const引用不可以。 

 代码如下:

// legal for const references only 
int i = 10; 
const int & ref = 42; 
const int & ref1 = r + i; 
double d = 3.14; 
const int &ref2 = d; 

以绑定到不同类型的ref2为例解释原因,编译器会把ref2相关的代码转换如下: 
代码如下:

int temp = d; 
const int &ref2 = temp; // bind ref2 to temporary 

ref2实际上是绑定到一个临时变量上,如果ref2不为const,那么按道理就可以通过修改ref2而修改d的值,但实际上d并不会改变。所以为了避免这个问题,ref2只能是const。
非const引用只能绑定到与该引用同类型的对象,const引用则可以绑定到不同但相关的类型的对象或绑定到右值。 

http://blog.csdn.net/kelvin_yan/article/details/49508485

int * 是一种指向int类型的指针。
const int* 是指向const int类型的指针。
int *const 指向int类型的常量指针。
const int× &又是不同的type。(指向常量指针的引用)
int* const& 指向指针的常量引用。
const int* const& 指向常量指针的常量引用

当你调用
void fun(const int *&) ->要求参数的类型 : 指向const int类型的指针 的引用




int *b = new int(0); 
fun(b);//error


传入的参数为int*, 如果要将int×转成const int*& ,需要先将int*转换为const int* 再将const int*转换为const int* &,这需要两个步骤的转换。
实际上编译器的 默认转换最多只能支持一个步骤的转换!! 超过两步以上的转换,是不支持的。
当编译器无法找到一步就能成功转换的方法时,自然就会报错了。


当你写出一下的代码时,
int *d = new int(0); 
fun((const int *)d);//error 
delete d; 

当你使用fun((const int *)d)时,毫无疑问的是你引入了一个临时变量,当你想引用一个临时变量的时候,这个引用必须是const的,临时变量必须被const引用。
而你函数的声明,要求的是指向常量指针的引用,不是const引用,所以引用会失败。


当然,如果你这样调用:
int *e = new int(0); 
fun((const int *&)e);//ok 
delete e; 
这时候你创造了一个临时的引用,但是变量类型和fun的声明的参数类型是一致的,所以是ok的。

猜你喜欢

转载自blog.csdn.net/a694262054/article/details/70184574