const指针的引用

sszwbuaa 2009-05-31 02:01:58
下面是关于const指针的引用测试(vs2005):

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;
}
...全文
628 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sszwbuaa 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 operatingtuzi 的回复:]
2)另外,进行强制类型转换,将非const实参转换为const实参,
这种转换(const int *)是错误的,如fun((const int *)d),
而必须这样转换fun((const int *&)e),
为什么?


同上 类型不一致 改成void fun(const int * const &) 就没错了

const类型的引用不检查类型一致性 修饰指针的时候要再声明const才是const类型引用
[/Quote]
明白了!
(const int *&) 表示的是const int *的非const引用;
而(const int * const&) 表示的才是const int *的const引用!


另外,我发现这和编译器也有关系,.net中如下调用却没有问题
int *b = new int(0);
fun(b);//
delete b;
在2005下就可以检查出错误。


十分感谢大家的帮助!!!
必成桂 2009-05-31
  • 打赏
  • 举报
回复

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的。

欢迎大家拍砖。




光宇广贞 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 operatingtuzi 的回复:]
2)另外,进行强制类型转换,将非const实参转换为const实参,
这种转换(const int *)是错误的,如fun((const int *)d),
而必须这样转换fun((const int *&)e),
为什么?


同上 类型不一致 改成void fun(const int * const &) 就没错了

const类型的引用不检查类型一致性 修饰指针的时候要再声明const才是const类型引用
[/Quote]

顶龙儿三次。
operatingtuzi 2009-05-31
  • 打赏
  • 举报
回复
2)另外,进行强制类型转换,将非const实参转换为const实参,
这种转换(const int *)是错误的,如fun((const int *)d),
而必须这样转换fun((const int *&)e),
为什么?


同上 类型不一致 改成void fun(const int * const &) 就没错了

const类型的引用不检查类型一致性 修饰指针的时候要再声明const才是const类型引用
operatingtuzi 2009-05-31
  • 打赏
  • 举报
回复
2)另外,进行强制类型转换,将非const实参转换为const实参,
这种转换(const int *)是错误的,如fun((const int *)d),
而必须这样转换fun((const int *&)e),
为什么?


同上 类型不一致 改成void fun(const int * const &) 就没错了

const类型的引用不检查类型一致性 修饰指针的时候要再声明const才是const类型引用
operatingtuzi 2009-05-31
  • 打赏
  • 举报
回复
但对于指针引用的形参,如fun,传入非const实参却有问题,如fun(b),

因为const int*& 这个引用的基本类型是const int*

非const引用只能引用相同类型的值 const int*和int*不一样 而const引用则可以接受不同类型

如果fun改成void fun(const int * const &) 这样就可以了

liliangbao 2009-05-31
  • 打赏
  • 举报
回复
[code=C/C++]void fun(const int *&) //这表示是const int *的引用,即将const int *看成一个整体了
{
}
sszwbuaa 2009-05-31
  • 打赏
  • 举报
回复
可能我没说清楚。。。
简单的说,我想问的就是参数传递时
为什么不能转换参数 from 'int *' to 'const int *&'?
而可以转换参数from 'int ' to 'const int &'?
sszwbuaa 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lianshaohua 的回复:]
看一下const的用法吧:http://topic.csdn.net/u/20090516/03/33da7287-64c6-4605-b428-a72741c1ffec.html

void fun(const int *&) //好像要理解为指向整型常量指针的引用
{
}

传入的参数必然是一个指针的引用,而这个指针要指向一个整型的常量;
[/Quote]

而这个指针要指向一个整型的常量
我想要知道的就是“为什么指针类型形参一定要指向一个常量呢?”
对于非指针类型的形参就可以不指向常量啊,如下
void fun1(const int &)
{
}

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

return 0;
}
lpf000 2009-05-31
  • 打赏
  • 举报
回复
int *d = new int(0);
fun((const int *)d);//error
delete d;
可能是强制转换后 传递d的拷贝,是一个右值吧,而(const int *)&中const修饰的是int*.
lingyin55 2009-05-31
  • 打赏
  • 举报
回复
作为函数参数的修饰,用法差不多也就这几个,对比一下你的程序就知道了。

[Quote=引用 3 楼 lingyin55 的回复:]
const修饰函数参数是它最广泛的一种用途,它表示函数体中不能修改参数的值(包括参数本身的值或者参数其中包含的值)。
void function(const int Var); //传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)
void function(const char* Var); //参数指针所指内容为常量不可变
void function(char* const Var); //参数指针本身为常量不可变(也无意义, 因为char* Var也是形参)

参数为引用,为了增加效率同时…
[/Quote]
lingyin55 2009-05-31
  • 打赏
  • 举报
回复
const修饰函数参数是它最广泛的一种用途,它表示函数体中不能修改参数的值(包括参数本身的值或者参数其中包含的值)。
void function(const int Var); //传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)
void function(const char* Var); //参数指针所指内容为常量不可变
void function(char* const Var); //参数指针本身为常量不可变(也无意义, 因为char* Var也是形参)

参数为引用,为了增加效率同时防止修改。
修饰引用参数时:
void function(const Class& Var);//引用参数在函数内不可以改变
void function(const TYPE& Var); //引用参数在函数内为常量不可变

yeliangang 2009-05-31
  • 打赏
  • 举报
回复
const形参在实际传入实参时应该是传的实参引用吧,而声明的一个非const变量在作为这种情况下的实参传递时并不是传递的引用,所以要传递其引用(地址)
个人理解,有误勿骂。。
ztenv 版主 2009-05-31
  • 打赏
  • 举报
回复
看一下const的用法吧:http://topic.csdn.net/u/20090516/03/33da7287-64c6-4605-b428-a72741c1ffec.html

void fun(const int *&) //好像要理解为指向整型常量指针的引用
{
}

传入的参数必然是一个指针的引用,而这个指针要指向一个整型的常量;

64,694

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧