正文

const修饰的谁?2007-10-30 11:28:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/aurora/30587.html

分享到:

问题源于今天我于csdn上看到的一个帖子:

const引用的疑惑

例子1:
#include   <iostream >
#include   <typeinfo >
using namespace std;

typedef char* PCHAR ;
int main(int argc, char *argv[])
{
    cout < <typeid(const PCHAR).name() < <endl;
    cout < <typeid(const char*).name() < <endl;
    return 0;

输出结果:
char *
char const *
应该两者都是char const *类型啊? 为什么不一样?

例子2:
#include  <iostream >
#include  <typeinfo >
using namespace std;

template <class T >
void TestFunc2(const T &pConstRef)
{
cout  < < pConstRef  < <endl;
pConstRef[0] =  'S '; cout  < < pConstRef  < < endl;
}

int main(int argc, char *argv[])
{

char pBuf[100] = "suntao";
char* pNonConst =  pBuf;
TestFunc2(pNonConst);

  system("PAUSE");
  return EXIT_SUCCESS;
}
问题: 虽然我传入的是一个非const引用,但TestFunc2的参数是一个const引用,为什么可以修改pConstRef指向的内存?

这使我想起《C++ Primer》上的一段话(p104   3.12):

“下面是一个几乎所有人刚开始时都会答错的问题,错误在于将typedef 当作宏扩展。已知下面的typedef:
typedef char *cstring;
在以下声明中cstr 的类型是什么?
extern const cstring cstr;
第一个回答差不多都是:
const char *cstr
即指向const 字符的指针。但是这是不正确的。const 修饰cstr 的类型。cstr 是一个指针,因此,这个定义声明了cstr 是一个指向字符的const 指针char *const cstr;”

所以基本上清楚了,发帖的人没搞明白typedef的含义。
const T &pConstRef 即 T const &pConstRef . 这里的const好像是多余的。引用本来就不必用const修饰。

阅读(2597) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册