成员函数中的问题

problems in member function

本文关键字:问题 函数 成员      更新时间:2023-10-16
#include <iostream>
#include <cstring>
using namespace std;
class student {
    int roll_no;
    char name[56];
public:
    void setdata(int roll_no_in, const char* name_in) {
        roll_no = roll_no_in;
        strcpy(name, name_in);
    }
    void outdata() {
        cout << "rollno is " << roll_no << endl << "name is " << name << endl;
    }
};
int main() {
    student s1;
    s1.setdata(12, "robin");
    s1.outdata();
    return 0;
}

我对这个程序有一些疑问

    我们如何将字符串
  1. 存储到指针中,就像上面的程序一样将字符串 robin 存储到 char *name_in 中,因为指针仅用于存储地址。我们可以存储甚至字符串吗?
  2. 如果我不使用,为什么要在方法函数集数据中添加const然后它向我显示错误。这是可选的,对吧?
  3. 为什么我不能在setdata方法函数中使用char name_in[34]代替char *name_in
  1. C 字符串是 char 的数组。将数组作为函数参数传递时,它会转换为指向第一个元素的指针。

  2. const修饰符表示函数不会修改 name_in 的内容。由于字符串文本是常量,因此需要它来允许使用文本参数调用函数。

  3. 您可以。但是由于该函数实际上对它将接受的字符串的大小没有限制,因此这将具有误导性。将参数声明为具有长度的数组就像将其声明为指针一样;指定的长度将被忽略。注意:这仅适用于第一个维度;传递多维数组时,可以省略第一维的长度,但需要指定所有其他维度。

我们如何将字符串

存储到指针中,就像上面的程序一样将字符串 johnson 存储到char *name_in中,因为指针仅用于存储地址。

你不是把它存储在name_in中,而是把它存储到name,这是一个数组。 name_in 是指向传递给函数的数组的指针;数组在传递给函数时会自动转换为指针。(更一般地说,指针可以指向数组的开头,并用于访问数组;像strcpy这样的 C 样式函数正是这样做的。

在惯用C++中,您将使用一个类,而不是使用指针和数组的危险混乱:

std::string name;
name = name_in;

如果我不使用它,为什么我要在方法函数集数据中添加 const,那么它就会向我显示错误。

我假设你的意思是const char * name_in.您正在传递指向字符串文本的指针,该文本是常量;并且该语言不允许您将非常量指针指向常量对象。

这是可选的,对吧?

在C++11之前,它是可选的;把它排除在外只是一个非常糟糕的主意。现在这是强制性的。

为什么我不能在 setdata 方法函数中使用 char name_in[34] 代替char *name_in

你可以;作为一个函数参数,两者都是等价的。同样,您需要const才能传递字符串文本或其他常量字符串。不过,这有点误导,暗示name_in是一个特定大小的数组,而两者都不能保证。

同样,这是C++,因此几乎可以肯定std::string比任何一个都更好的选择。

*我们如何像上面的程序一样将字符串 johnson 存储到字符name_in中,因为指针仅用于存储地址。我们可以存储甚至字符串吗?

您实际上是在存储指向字符串基址的指针。可以使用此指针遍历整个字符串。

如果我不使用它,为什么我应该在方法函数集数据中添加常量,那么它就会向我显示错误

"Ravi"是一个字符串文字,存储在只读内存中。因此,如果您尝试将此文本传递给接受char *的函数,那将是违反编译器试图建立的约束。

*为什么我不能在 setdata 方法函数中使用 char name_in[34] 代替 char name_in?

您正在将指向 char 的指针

传递给此函数,因此您必须使用指向 char 的指针来接受它。然而,数组 ,当作为参数传递给函数时,会衰减到指针。