博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++形参中const char * 与 char * 的区别
阅读量:6349 次
发布时间:2019-06-22

本文共 1614 字,大约阅读时间需要 5 分钟。

在函数调用时,我们经常看见一个函数的接受参数为(const char *);

  例如strlen()函数,它的定义为:

size_t strlen( const char *str);

  那么将形参设置为const的到底有什么好处呢?网络上经常的回答是:这样将把形参限定为常量,使得我们不能修改它。总感觉这种说法似乎是明白了,但再仔细的想下,总觉得少点什么。

  在我看来,这样做的好处有2点:

  第一,   保证了实参不能被修改,增加了安全性。

  第二,   扩大了该函数的参数的接收范围,使得函数更具通用性。

  而第二点,在我看来,是让我恍然大悟的,终于理解了const的作用。

从下边这个例子中,我们可以看出这两点好处;写一个函数length(),实现与strlen()相同的功能,然后进行调用,代码如下:

#include 
#include
#include
#include
using namespace std; void length(char *s) { int count = 0; for (;*s++ !='/0';count++); printf("common length: %d/n",count); } int _tmain(int argc, _TCHAR* argv[]) { char str1[] = "you are a boy 1!"; length(str1); //字符数组 length("you are a boy2 !"); //常量 char *s = "you are a boy 3!"; length(s); //字符指针 return 0; }

  上面程序可以正确的编译运行,并且输出3行“common  length:16”。

  但是,如果我想计算一下一个string类型的长度呢?因为length(char *s)的接受参数为char *,我们可以使用stirng类的c_str()方法返回string的字符指针(char *),于是,我们这样操作:

string str2 = "you are a boy 5!";length(str2.c_str());

  上边的做法看起来没什么错误,可是这样是通不过编译的,因为str2.c_str()返回的是const char *,而我们的length接受的是char *,const char * 是不能转换成 char *的。

    因为const char * s 表示其指针所指向的内容是只读的,不能被修改,而char * s指向的内容是可以修改的,把一个常量指针转换成普通的指针,这显然是不符合逻辑的。关于常量指针和指针常量以及普通的指针的区别,请查阅相关文档。

    我们再回过头来看length的需求,length的目的是计算出字符串的长度,它不对字符串本身做修改,对于类似的这种需求的函数(不修改实参),我们应该而且强烈推荐使用const来修饰形参,这也是一种良好的编码习惯。

    很明显的看出,如果这样定义:void length(char *s),它将不能接受常量字符指针与常量字符数组。这正是使用const定义形参的第2个好处:扩大了该函数的参数的接收范围;使得函数更具通用性。

    常量字符指针是指:str2.c_str()或者str2.data()的返回值,或者自己定义的

    常量字符数组是指:const char str1[] = "you are a boy 1!";

转载于:https://www.cnblogs.com/stones-dream/p/9553434.html

你可能感兴趣的文章
NFC 鏈表操作
查看>>
pymongo模块
查看>>
第0次作业
查看>>
Ubuntu里设置python默认版本为python3(转载)
查看>>
快排+折半查找
查看>>
c# GC 新典型
查看>>
ssh bash 通配符
查看>>
seajs在jquery多个版本下引用jquery的插件的方案
查看>>
关于网络上java,php和.net的“口角之争“的一点想法 !
查看>>
python 第二周(第十三天) 我的python成长记 一个月搞定python数据挖掘!(21) -正则表达式re...
查看>>
[POI2011]SEJ-Strongbox
查看>>
20文件
查看>>
Android开发Intent应用概述
查看>>
【Go】并发编程
查看>>
VMware虚拟化NSX-Manager命令行更改admin用户密码
查看>>
悦纳自己
查看>>
python字符串函数
查看>>
ORM框架Hibernate (四)MyEclipse Hibernate Tool 逆向生成实体类
查看>>
去掉iphone连接电脑时会出现的弹出窗口
查看>>
【python】-- web开发之HTML
查看>>