#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;
}
我对这个程序有些怀疑
const
然后它显示我的错误。这是可选的吗?char name_in[34]
方法函数中char *name_in
使用setdata
?答案 0 :(得分:1)
C字符串是char
的数组。将数组作为函数参数传递时,它会转换为指向第一个元素的指针。
const
修饰符表示该函数不会修改name_in
的内容。由于字符串文字是常量,因此需要允许使用文字参数调用函数。
你可以。但由于该函数实际上对它将接受的字符串的大小没有限制,这将是误导性的。将参数声明为具有长度的数组,就像将其声明为指针一样;您指定的长度将被忽略。 注意:这仅适用于第一维;传递多维数组时,可以省略第一个维度的长度,但需要指定所有其他维度。
答案 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的指针来接受它。但是,当传递给函数作为参数时,数组会衰减为指针。