C++对const的用法笔记

转载 2015年07月10日 15:59:48


Linux 环境下当GCC版本比较高时,编译代码可能出现的问题

问题是这样产生的,先看这个函数原型:

void someFunc(char *someStr);

再看这个函数调用:

someFunc("I'm a string!");

把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。

为什么呢?原来char *背后的含义是:给我个字符串,我要修改它。

而理论上,我们传给函数的字面常量是没法被修改的

所以说,比较和理的办法是把参数类型修改为const char *

这个类型说背后的含义是:给我个字符串,我只要读取它。

很自然的延伸一下。

如果我既要传字面常量又要传字符串变量怎么办呢?......重载

实验:

对deprecated conversion from string constant to 'char *'此类警告的详细解释

假定你想使用一个char*类型的变量,有时指向一个字符串,有时指向另外一个字符串。开始的代码就像这样:
char *msg;
msg = "hello";
msg = "good-bye";

编译器会对这段代码给出两段警示,说”deprecated conversion from string constant to 'char *'",意思就是说你没有能力修改字符串的内容。如果将代码写成这样,如:
char *msg = "hello";
*msg = 'j';
printf( "%s/n", "hello" );

编译器会通过编译,实际上会将msg指向的内容从"hello"转变为"jello", 正确的解决方法是将msg声明为一个指向不变字符串的指针
const char  *msg;
msg = "hello";
msg = "good-bye";

这段代码可以成功编译,并且将msg指向的值如愿改变,但如果你将指针指向的指进行赋值
*msg = 'j';
将会产生一个错误,不能修改一个字符串常量

注意如下的代码,此代码编译时不会出现警告也不会出现任何错误:
const char  *msg;
char   buf[ 10 ];   //注意不能使用char *buf;
sprintf( buf, "%03d/n", 7 );
msg = buf;

改变buf的内容是可以的,因为它并没有被声明为常量。在这种情况下,msg将指向一个字符串,"007/n". 像这种语句
*buf = 'x';
将会正确编译执行,但像
*msg = 'x';
将会产生一个警告,因为msg指向的内容不允许改变


还有一种方法是使用强制转换,使用强制转换意味着你清楚会出现什么情况,不需要编译器为你做出判断,例如下面的代码将不会产生警告:
char  *msg;
msg = (char *) "hello";


但一旦你使用强制转换,编译器对如下语句进行编译时,也不会出现错误或警告
*msg = 'j';

这个错误将一直存在,但并不会被发现,直到运行时。那时再找出错点就相当麻烦了,比编译器提醒你,麻烦多了。所以,最好不要对字符串使用强制转换。

Constant 指针

根据constant的位置不同,可以有以下四种情况:
const char* const msg_0;
const char       *msg_1;
char* const msg_2;
char       *msg_3;


其中,msg_0是一个constant指针指向一个const字符串。这个声明编译器会给出一个警告,因为msg_0的指向没有被初始化,而且之后的语句也无法对mg_0进行赋值,如
const char const *msg_0 = "hello";
会编译成功,但
*msg_0 = 'j';或者
msg_0 = "good-bye"; 将会产生错误

msg_1既可以指向一个const字符串,也可以指向一个可变的字符串,但是不能修改它所指向的字符串的内容。

编译msg_2这条语句,会出现和编译msg_0一样的错误。因为指针是一个常量,所以它应该首先被赋值如果刚开始已经赋值,那么它可以对指向的字符串内容进行修改,如:
char        buf[ 10 ];
char * const msg_2 = buf;
这段代码里,msg_2指向buf[0],并且永远指向这个地址,不会改变;

对于msg_3,就没太多可以说的。你可以改变指针,也可以改变指针指向的内容

C++笔记16之const的用法总结

const主要是为了程序的健壮型,减少程序出错. 最基本的用法: const int a=100; b的内容不变,b只能是100也就是声明一个int类型的常量(#define b =100) in...

[C++ Primer Plus学习笔记Ⅱ]const的用法归纳与整理

const的用法 可以用两种不同的方式将const关键字用于指针。第一种方法是让指针指向一个常量对象, 这样可以防止使用该指针修改所指向的值,第二种方法是将指针本身声明为常量, 这样可以防止改变...
  • xy_cpp
  • xy_cpp
  • 2017年06月06日 15:58
  • 283

C++中const用法总结

  • 2014年03月25日 16:30
  • 13KB
  • 下载

C++程序设计-第6周 const用法及指针数据成员

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565第一部分 阅读程序阅读程序,可以在上机时通过单步执行进一步和你在人脑中运行程...

c++中const用法总结

  • 2015年09月26日 20:26
  • 28KB
  • 下载

C++中const用法总结

  • 2012年03月26日 11:10
  • 35KB
  • 下载

从零开始学C++之对象的使用(三):static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符

一、static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝  C++ Code  1 2 3 4 5 6 7 8...

c++里const用法归纳

  • 2014年11月11日 21:57
  • 148KB
  • 下载

c++中const的用法及常见错误

  • 2010年09月09日 20:45
  • 41KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++对const的用法笔记
举报原因:
原因补充:

(最多只允许输入30个字)