构造函数中的char指针参数问题(C++)

问题描述 投票:0回答:2

我前段时间开始在一本书上学习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;
}
c++ pointers char visual-studio-2019
2个回答
1
投票

字符串的类型 const char [] 衰变为 const char *. 你的构造函数应该取一个 const char *:

//      VVVVV
Student(const char* pName)
{
    strncpy_s(name, pName, MAXNAMESIZE);
    name[MAXNAMESIZE - 1] = '\0';
    semesterHours = 0;
    gpa = 0;
}

0
投票

在这一行

Student s("0. DannyBoy");

你要传递的是一个类型为 char[12] 的构造者。Student.

然而,你需要使用一个 char const * 黏合 char 数组,所以你的构造函数需要像这样。

Student(char const * pName) {

0
投票

在C语言中,历史上,字符串字面数的类型为非常量字符数组。而在C++ 11标准之前,C++编译器允许使用字符串字面数作为具有非常量类型的参数的参数。char * 为了向后兼容。

然而,尽管在C语言中,字符串字元具有非恒定的字符数组,但你不能改变它们。

在C++ 11中,决定不允许使用类型为 char * 因为在C++中,他们有常量字符数组的类型。

所以在构造函数中声明像

Student( const char *pName )

在任何情况下,这都是比较好的,因为这个声明告诉类的读者,即使参数不是字符串文字,也不会在构造函数中改变所传递的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.