我前段时间开始在一本书上学习C++,现在被书上的一部分代码卡住了,在我的API上不能用,这是Visual Studio 2019。这本书是2000年的,所以这可能是问题的一部分,但如果是的话你能告诉我怎么打补丁吗?
问题出在下面的代码中。书的作者想使用一个char数组作为构造函数的参数,并且用一个指针(char* pName)来做。然而,Visual Studio却在参数上划了个底线("0.DannyBoy")。我四处寻找答案,但没有一个像我这样的。如果有人能帮助我,将非常感激!
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;
const int MAXNAMESIZE = 40;
class Student
{
public:
Student(char* pName)
{
strncpy_s(name, pName, MAXNAMESIZE);
name[MAXNAMESIZE - 1] = '\0';
semesterHours = 0;
gpa = 0;
}
//... autres membres publics...
protected:
char name[MAXNAMESIZE];
int semesterHours;
float gpa;
};
int main(int argcs, char* pArgs[])
{
Student s("0. DannyBoy");
Student* pS = new Student("E. Z. Rider");
system("pause");
return 0;
}
字符串的类型 const char []
衰变为 const char *
. 你的构造函数应该取一个 const char *
:
// VVVVV
Student(const char* pName)
{
strncpy_s(name, pName, MAXNAMESIZE);
name[MAXNAMESIZE - 1] = '\0';
semesterHours = 0;
gpa = 0;
}
在这一行
Student s("0. DannyBoy");
你要传递的是一个类型为 char[12]
的构造者。Student
.
然而,你需要使用一个 char const *
黏合 char
数组,所以你的构造函数需要像这样。
Student(char const * pName) {
在C语言中,历史上,字符串字面数的类型为非常量字符数组。而在C++ 11标准之前,C++编译器允许使用字符串字面数作为具有非常量类型的参数的参数。char *
为了向后兼容。
然而,尽管在C语言中,字符串字元具有非恒定的字符数组,但你不能改变它们。
在C++ 11中,决定不允许使用类型为 char *
因为在C++中,他们有常量字符数组的类型。
所以在构造函数中声明像
Student( const char *pName )
在任何情况下,这都是比较好的,因为这个声明告诉类的读者,即使参数不是字符串文字,也不会在构造函数中改变所传递的字符串。