在函数调用时,我们经常看见一个函数的接受参数为(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 * 的区别的更多相关文章

  1. JavaScript中const、var和let区别浅析

    在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...

  2. 实例讲述PHP面向对象的特性;;;php中const与define的使用区别

    php中const与define的使用区别 1.const:类成员变量定义,一旦定义且不能改变其值. define:定义全局常量,在任何地方都可以访问.2.define:不能在类中定义,而const可 ...

  3. php中const与define的使用区别 详解

    1.const用于类成员变量定义,一旦定义且不能改变其值.define定义全局常量,在任何地方都可以访问. 2.define不能在类中定义而const可以. 3.const不能在条件语句中定义常量 i ...

  4. js中const,var,let区别

    1.const定义的变量不可以修改,而且必须初始化(常量) const b = 5 // 正确 // const b // 错误,必须初始化 // b = 4 // 错误,不可被修改 console. ...

  5. C语言中为什么不能把char**赋给const char**

    这是我在知乎回答的一个问题. 这个问题是C中的一个深坑,首先说结论: char ** 和 const char ** 是两个不相容(incompatible)的类型,能够理解为不能直接赋值 在C11的 ...

  6. c/c++ 中的char* ,const char* 和 char* const 总结[转]

    文章转自:c/c++ 中的char* ,const char* 和 char* const 总结 例1: char* str="abc";//错误写法 (在.c文件中是正确的) c ...

  7. 理解C/C++中const char*、char* const、const char* const、char* const*等等

    先说些题外话,今天学习execve(2)的使用,由于书上代码使用的是C89标准,所以下面这种代码都被我修改了 char* s[] = { "aaa", "bbb" ...

  8. 字符串复制char *strcpy(char* dest, const char *src);

    ⒈strcpy的实现代码 char * strcpy(char * strDest,const char * strSrc) { if ((NULL==strDest) || (NULL==strSr ...

  9. 阅读ANSI C,寻找乐趣和裨益——const char **与char **为何不兼容

    #include<stdio.h> void foo1(const char**p) { } void foo2(const char*p) { } int main(int argc,c ...

随机推荐

  1. java native方法及JNI实例 (转)

    转自:http://blog.csdn.net/xw13106209/article/details/6989415 1.参考文献: http://blog.csdn.net/youjianbo_ha ...

  2. PBFT(拜占庭容错)简述

    共识算法 区块链中最重要的便是共识算法,比特币使用的是POW(Proof of Work,工作量证明),以太币使用的是POS(Proof of Stake,股权证明)使得算力变的不怎么重要了,而今PO ...

  3. HTTPS安全不?

    首先,它是什么?我的理解是一开始进行SSL握手,商量好将要使用哪些加密算法来通讯,或者加密方法后使用非对称的加密方法,交互一下随机数,加上一个pre-master-secrect的,然后服务端利用私钥 ...

  4. vim 常用

    Format JSON :%!python -m json.tool 1. define custom function and use it define function in .vimrc fu ...

  5. C++编译变更stlport到使用g++的stl经验总结

    . 花了几天时间,需要把经验给记下来. 1. 需要支持C++11的编译器,最方便的方式就是 yum -y install devtoolset-6 在/usr/local/bin中增加gcc6.sh ...

  6. Roslyn编译器

    概要 微软官方开源的C#/VB编译器.作为.net 2015的重要名角,负责将代码编译成IL,另外提供丰富的API用于代码分析,vs2015的实时代码分析就是使用的Roslyn提供的API. C#6. ...

  7. echarts实现全国地图

    1.首先我没有按需引入echarts,我是全局引入的,所以说在node_modules中有 这个china,你只需要在你的页面引入即可 但是按需引入echarts 的 项目中node_modules中 ...

  8. Pycharm进行版本管理

    即然pycharm为python提供了这么强大的IDE,那么,我们代码管理,没理由不用版本管理工具Git,SVN等等 在pychram中使用GitHub进行代码管理;需要准备: 1)GitHub帐号: ...

  9. 49.CSS--- 特殊css3效果展示

    1.设置多行文本超出显示省略号<div class="caption"> <p>显示超过两行就显示省略号,其余隐藏,隐藏不了的情况下给这个模块添加一个高度和 ...

  10. windows 服务器硬盘的分区

    进入Server 2012的操作系统,打开CMD框,输入:diskmgmt.msc,回车. 操作完第一步后会弹出“磁盘管理”的框.鼠标右键点击红框所在位置,选中“压缩卷”. 在“输入压缩空间量(MB) ...