成员函数中的问题

时间:2014-12-23 12:54:50

标签: c++ string pointers

#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. 为什么我不能在char name_in[34]方法函数中char *name_in使用setdata

3 个答案:

答案 0 :(得分:1)

  1. C字符串是char的数组。将数组作为函数参数传递时,它会转换为指向第一个元素的指针。

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

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

答案 1 :(得分:1)

  

我们如何将字符串存储到指针中,如上面的程序将字符串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几乎肯定是比其中任何一个更好的选择。

答案 2 :(得分:0)

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

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

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

&#34;拉维&#34;是一个字符串文字,存储在只读的内存中。因此,如果您尝试将此文字传递给函数接受char *,那么就会违反编译器试图建立的约束。

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

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