在函数调用时,我们经常看见一个函数的接受参数为(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. javascript篇-slice(),splice(),split(),substring(),substr()的用法以及区别

    1.slice(),从已经有的数组中返回选定的元素, 使用范围是:Array,string 语法:obj.slice(start,end) 参数: start: 必需.规定从数组(字符串)的哪个ind ...

  2. Learn golang: Top 30 Go Tutorials for Programmers Of All Levels

    https://stackify.com/learn-go-tutorials/ What is Go Programming Language? Go, developed by Google in ...

  3. Java 基础 变量和运算符

    Java基础语法   第1章 变量 1.1 变量概述 1.2 计算机存储单元 1.3 基本类型之4类8种 1.4 常量与类型 1.5 定义变量(创建变量) 1.6 变量使用的注意事项 1.7 数据类型 ...

  4. JS快速入门

    字符串 模板字符串 需要特别注意的是,字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果: var s = 'Test'; s[0] = 'X'; alert(s); ...

  5. JDBC 接口学习

    说明:文章所有内容皆选自实验楼教程[JDBC 入门教程],想要学习更多JDBC,可以点击教程进行学习~ JDBC 简介 JDBC 的全称是 Java Database Connectivity,叫做 ...

  6. 背景图宽高100%无法无法显示的问题【body设置relative,当前元素absolute】

    以下1,2两个关键元素 body{   width:100%;   height:100%;   position:relative; //1 } .login-form { width: 100%; ...

  7. 《全栈性能Jmeter》-7JMeter常用脚本开发

  8. [LeetCode] 661. Image Smoother_Easy

    Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother t ...

  9. shell实现SSH自动登陆【转】

    前言 公司开发使用docker,每次登陆自己开发机总要输入 ssh user_name@ip_string,然后再确认输入password,手快了还经常会输错.作为一个懒人,肯定要找一个取巧的方式,查 ...

  10. Appium基础(三)对象抓取

    一.启动Android模拟器 二.打开App应用,这里以计算器为例子 三.打开uiautomatorviewer.bat 这个文件在Android SDK-->Tool目录下 双击uiautom ...