C++中char* 和const char*的区别

最近学习C++时看到如下范例代码

#include
using namespace std;
class Name {
	char name[20];
public:
	Name() {
		strcpy_s(name, ""); cout << '?';
	}
	Name(char *fname) {
		strcpy_s(name, fname); cout << '?';
	}
};
int main() {
	Name names[3] = { Name("张三"),Name("李四") };
	return 0;
}

程序结构很简单,可是却跑不起来,错误提示为

没有与参数列表匹配的构造函数 “Name::Name” 实例

查询资料得知,应把重载构造函数

Name(char *fname) {
		strcpy_s(name, fname); cout << '?';
	}

的参数类型改为

Name(const char *fname) {
		strcpy_s(name, fname); cout << '?';
	}

上网查阅const char *和char *的区别

const char *p = “123”;
p[1] = ‘3’; // 会报错
p = “456”; // 不会报错
const char * 只是说指针指向的内容不可变,但指针本身可以再赋值
假设你的程序是
char * findArg(char *s) {
return s;
}
这个时候,你如果传const char *进去,那么好一些的编译器,会知道,你传回的函数返回值,也是const char *,也就是指针指向的内容不可写。
所以如果你传进去的是const char *,最好还是把 char *name写成const char *name,因为char *name可以对指针指向的内容进行修改。
用强制转换当然也可以,但是
const char *name2 = “123”;
char *name = (char )name2;
如果你对name指向的内容进行改变,如 name[2] = ‘4’;
"123"是常量,对常量进行修改,你的程序就会发生不可预知的错误
char
findArg(char *){…}
如果你这个函数,对传入的参数,不会对指针指向的内容进行修改,最好写成 char * findArg(const char *) {…}
或 const char * findArg(const char *) {…}

得知VS2017的编译器中,为了保证字符串指针的安全性,要求使用常量指针const char *来确保该指针指向的内容不会被修改,从而避免修改常量导致的未知错误。

你可能感兴趣的:(C++)