C++中函数的const参数一定要传入const实参吗?

在VS2008下写C/C++程序,代码示意如下:
int main()
{
unsinged char *ch1 = null;
ch1 = (unsinged char *)malloc(100 * sizeof(unsinged char));

func1(ch1);
return 0;
}
func1定义为void func1(const char *c1);
在编译工程选项里选择作为C++程序编译,就会出错,cannot convert parameter 1 from 'unsigned char *' to 'const char *'
选择作为C语言程序编译就没错,这能表示C++中形参为const实参必须也得是const吗?有这个要求吗?
改为func1((const char *)ch1)就可以了
那么如果在C++下使用C语言的库,比如strcmp,这个函数的定义中字符串都是const char *,作为C++程序编译时还会对这个const进行限制吗?好像不会吧

第1个回答  2015-06-11
要注意unsinged char、signed char、char在C++中是不同的三种类型,char的算术运算结果类似unsigned还是signed,由实现(编译器)决定。

ISO C允许不同类型指针的隐式转换,包括参数传递时实参向形参类型的转换。但是ISO C++对于类型检查更严格,必须使用显式的类型转换。所以在此表达式func1((const char *)ch1)可以通过编译,而func1(ch1)会导致编译错误,并不是const的原因。

对于修饰指针指向类型的const来说,一般不允许随意转换const char*为char*(如果要转换必须用const_cast<char*>或C风格显示类型转换(char*);反过来可以,strcmp接受const char*参数,因此这里可以隐式转换)。不过对char而言有个deprecated(以后可能不被标准支持)的用法,可以用字面量const char*指针隐式转换为char*指针,用于兼容char *p = "abc";之类的旧代码。
第2个回答  推荐于2016-02-13
在VS2008C/C++程序,代码示意如下:
int main()
{
unsinged char *ch1 = null;
ch1 = (unsinged char *)malloc(100 * sizeof(unsinged char));

func1(ch1);
return 0;
}
func1定义为void func1(const char *c1);
在编译工程选项里选择作为C++程序编译,就会出错,cannot convert parameter 1 from 'unsigned char *' to 'const char *'

C++中函数的const参数不一定要传入const实参。

要注意unsinged char、signed char、char在C++中是不同的三种类型,char的算术运算结果类似unsigned还是signed,由实现(编译器)决定。
ISO C允许不同类型指针的隐式转换,包括参数传递时实参向形参类型的转换。但是ISO C++对于类型检查更严格,必须使用显式的类型转换。所以在此表达式func1((const char *)ch1)可以通过编译,而func1(ch1)会导致编译错误,并不是const的原因。
对于修饰指针指向类型的const来说,一般不允许随意转换const char*为char*(如果要转换必须用const_cast<char*>或C风格显示类型转换(char*);反过来可以,strcmp接受const char*参数,因此这里可以隐式转换)。不过对char而言有个deprecated(以后可能不被标准支持)的用法,可以用字面量const char*指针隐式转换为char*指针,用于兼容char *p = "abc";之类的旧代码。
第3个回答  2010-07-22
当然不可以,因为你声明的变量ch1 为unsinged char 型,是可以更改内存数据的,而func1声明的是const型,不可以改变数据的,所以必须类型转换
第4个回答  2010-07-22
不能运行:const char *c1:指向常量的指针,而ch是变量,
能运行:(const char*)c1就变成了常指针,即c1只能指向一个变量ch,而不管ch是什么,
你改成引用也能运行func1(&ch1); void func1( char *c1);
第5个回答  2010-07-22
对于ANSI C/C++来说,如果形参类型不一致,必须采用强制转换
具体就看编译器实现的时候是否严格遵照ANSI的要求了

至少VC60对上面的要求很宽松,VS2008可能反而严格一些。

C++中函数的const参数一定要传入const实参吗?
C允许不同类型指针的隐式转换,包括参数传递时实参向形参类型的转换。但是ISO C++对于类型检查更严格,必须使用显式的类型转换。

C++返回值为Const &的看法大虾给解释下
关于引用形参和const引用形参的问题我想楼下解释的和楼主理解的已经差不多了。引用形参不会复制传入的实参,而可以在函数内部修改实参。至于const引用,是告诉程序,我们不应该在函数内部修改传入的实参。那么为什么有的时候用引用形参有的时候用const引用形参呢?我会和第二个问题一起回答。关于返回值是引用...

在c++函数的形参前加const关键字,是为了提高函数的
在 C++ 函数的形参前加上 const 关键字,通常是为了表明该函数不会修改形参所指向的对象。这有助于提高函数的可靠性、可维护性和安全性。具体来说,将形参声明为 const 类型,可以避免在函数内部无意中修改参数的值,从而防止不必要的副作用。这对于函数的调用者来说也是一种保障,可以放心地传递参数...

C++ const 用法
const 可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。1) 修饰参数的const,如 void fun0(const A* a ); void fun1(const A& a);

参数转发与折叠引用
在需要保持实参类型和引用性质的场景,函数设计需谨慎。例如,函数f可能改变传入的引用,而flip1调用时,实参b不是引用,可能需要重写函数,用右值引用参数来保存类型信息。flip2则能接受左值引用,但不能直接接受右值引用。这时,可以借助std::forward来转发参数。它允许在显式指定模板参数类型时,保持原始...

梳理c++ const 修饰函数
const修饰函数在C++中扮演着重要角色,它为代码安全性与程序逻辑提供强大支撑。本文将深入探讨三种const修饰形式及其应用场景。首先,const返回值用于保护引用类型的函数返回值不被意外修改。当函数返回引用时,如成员变量或参数引用,避免其作为左值被修改,添加const关键字至关重要。例如,对于返回引用的成员...

C++中,数组问题.
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:const class...

C++字符串小问题,请大家帮个忙,很简单
这个是要把数组传递给子函数操作,实际上只能传递的是该数组的指针,也就是子函数的数组指针指向的内容和主函数的是同一个,在子函数里修改其内容就是更改主函数里数组的内容。把形参设置成const,子函数就无权中修改其内容,保护了数据的安全性。所以在写传给子函数指针型数据时,如果不想(或不能)...

const 引用介绍
其次,const作为函数参数时,使得函数中变量名成为调用程序中的变量的别名。这种传递方式称为按引用传递,使得函数可直接修改原始数据。如果返回const类型引用,即返回左值,可对其进行赋值操作。为避免此类情况,可在函数前添加const,确保不可变。当实参与引用参数不匹配时,C++会生成临时变量。仅当参数为...

C++,错误:"const char *"类型的实参与"char *类型的形参不兼容"
这是说明类型不兼容,强制转类型。在声明变量 char* 时改成 const char *即可。当用户想在.h声明中定义成员变量,有时会报类型重定义错误,如果不是工程中真的重复定义了多个同名类,那么多半是没有给该类的头文件加条件指示符#ifndef。条件指示符#ifndef 最主要的目的就是防止头文件的重复包含和...

相似回答