C++形参中const char * 与 char * 的区别
在函数调用时,我们经常看见一个函数的接受参数为(const char *);
例如strlen()函数,它的定义为:
size_t strlen( const char *str);
那么将形参设置为const的到底有什么好处呢?网络上经常的回答是:这样将把形参限定为常量,使得我们不能修改它。总感觉这种说法似乎是明白了,但再仔细的想下,总觉得少点什么。
在我看来,这样做的好处有2点:
第一, 保证了实参不能被修改,增加了安全性。
第二, 扩大了该函数的参数的接收范围,使得函数更具通用性。
而第二点,在我看来,是让我恍然大悟的,终于理解了const的作用。
从下边这个例子中,我们可以看出这两点好处;写一个函数length(),实现与strlen()相同的功能,然后进行调用,代码如下:
#include <string>
#include <stdio.h>
#include <tchar.h>
#include <iostream>
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!";
C++形参中const char * 与 char * 的区别的更多相关文章
- JavaScript中const、var和let区别浅析
在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...
- 实例讲述PHP面向对象的特性;;;php中const与define的使用区别
php中const与define的使用区别 1.const:类成员变量定义,一旦定义且不能改变其值. define:定义全局常量,在任何地方都可以访问.2.define:不能在类中定义,而const可 ...
- php中const与define的使用区别 详解
1.const用于类成员变量定义,一旦定义且不能改变其值.define定义全局常量,在任何地方都可以访问. 2.define不能在类中定义而const可以. 3.const不能在条件语句中定义常量 i ...
- js中const,var,let区别
1.const定义的变量不可以修改,而且必须初始化(常量) const b = 5 // 正确 // const b // 错误,必须初始化 // b = 4 // 错误,不可被修改 console. ...
- C语言中为什么不能把char**赋给const char**
这是我在知乎回答的一个问题. 这个问题是C中的一个深坑,首先说结论: char ** 和 const char ** 是两个不相容(incompatible)的类型,能够理解为不能直接赋值 在C11的 ...
- c/c++ 中的char* ,const char* 和 char* const 总结[转]
文章转自:c/c++ 中的char* ,const char* 和 char* const 总结 例1: char* str="abc";//错误写法 (在.c文件中是正确的) c ...
- 理解C/C++中const char*、char* const、const char* const、char* const*等等
先说些题外话,今天学习execve(2)的使用,由于书上代码使用的是C89标准,所以下面这种代码都被我修改了 char* s[] = { "aaa", "bbb" ...
- 字符串复制char *strcpy(char* dest, const char *src);
⒈strcpy的实现代码 char * strcpy(char * strDest,const char * strSrc) { if ((NULL==strDest) || (NULL==strSr ...
- 阅读ANSI C,寻找乐趣和裨益——const char **与char **为何不兼容
#include<stdio.h> void foo1(const char**p) { } void foo2(const char*p) { } int main(int argc,c ...
随机推荐
- python的__new__方法
https://www.cnblogs.com/kex1n/p/5991249.html https://blog.csdn.net/wwx890208/article/details/8053445 ...
- Build a Basic CRUD App with Vue.js and nodejs
https://developer.okta.com/blog/2018/02/15/build-crud-app-vuejs-node#add-authentication-with-okta I’ ...
- IOP知识点(4)
1.选择多个“li”后,如何再次筛选. 2 按钮屏蔽功能 1.选择多个“li”后,如何再次筛选. 2 按钮屏蔽功能 http://gitserver/iop/cloud-iopm-web/issues ...
- spring boot+logback+JdbcTemplate打印sql日志
项目中使用的JdbcTemplate直接在service中执行sql语句,配置如下: 使用IDEA创建的项目自带 main/resource 中自带logback.xml 配置文件,添加以下日志配置, ...
- Linux df命令详解
1.命令:df 2.命令功能:显示指定磁盘文件的可用空间. 3.命令参数: -a #全部文件系统列表 -h #方便阅读方式显示 -H #等于“-h”,但是计算式,1K=1000,而不是1K=1024 ...
- Linux-nmon系统性能监控工具的使用及报表产出
在进行性能测试的时候,需要获取服务器的各项指标,例如 CPU.MEM.I/O.DISK 等.网上有很多的监控工具,nmon 就是其中的一个,其可与 JMeter结合使用,测试系统的性能.其概要的介绍, ...
- cocos2d-x getParent() 获得一个父类的一个node型指针,转换为父类类型
void CenterLayer::zhanzheng(CCObject* pSender){ ((GameScene*)this->getParent())->showLayer(Gam ...
- jQuery-使用hover(fn,fn)函数监听mouseover和mouseout两个事件
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Python之描述器
1.描述器的表现 用到三个魔术方法,__get__(), __set__(), __delete__() 方法签名如下 object.__get__(self,instance,owner) obje ...
- os.system
python os.system os.system()函数在不同的系统下可以实现不同的作用 一.window下: os.system("ping www.baidu.com" ...