在此代码中,我们制作了一个const char指针ID,因为它是一个char,所以它只能存储一个元素地址。但是在默认构造函数中,我们为该ID分配了“ NULL”,那么该ID如何保留4个字符? 在参数化构造函数中,我们传递i []数组并将值分配给id,同样,char id如何保存完整的数组? 为什么我们需要const char?
class Employee
{
public:
string name;
const char *id;
int age;
long salary;
Employee ()
{
name = "NULL";
id = "NULL";
age =0;
salary = 0;
};
// Employee(string n, char id[], int a, long s): name(n), id(id), age(a), salary(s)
// {};
Employee (string n,const char i[], int a, long s) //const use krne k baighar warning a rhe
{
name = n;
id = i;
age = a;
salary = s;
};
void getData()
{
cout<< "Employee ID: "<< id <<endl;
cout<< "Employee Name: "<< name <<endl;
cout<< "Employee Age: "<< age <<endl;
cout<< "Employee Salary: "<< salary <<endl;
};
};
我很困惑,如果id是char,那么它如何保存5个字符的字符串文字。 CHAR类型只能存储单个字符,但是如果我将其作为指针,则它包含多个字符。请清除这一点,我对它的工作方式非常困惑。
答案 0 :(得分:2)
字符串文字"NULL"
是5个char
s的数组(第五个是表示字符串结尾的空字符)。 C ++中的数组在内存中顺序排列。这意味着如果您有一个指向数组的 first 元素的指针,则可以使用简单的算术找到后续的元素。
因此,可以将C ++中的数组隐式转换为指向其第一个元素的指针。当您编写id = "NULL"
时,将分配id
指向5个字符的数组的第一个字符('N'
开头的"NULL"
)。您的对象将被放置在内存中,如下所示:
Employee
+--------+
| name |
| |
+--------+
| id |
| +----------+
+--------+ |
| age | v
| | +-+-+---+---+---+----+
+--------+ | N | U | L | L | \0 |
| salary | +---+---+---+---+----+
| |
+--------+
由于其余字符按顺序排列在内存中,因此只需在存储在'U'
的地址中添加一个字节,然后通过以下方式添加第一个id
,即可找到'L'
添加两个字节,等等。您可以一直添加一个字节,直到找到'\0'
字符为止,这表明您已到达字符串的末尾。
答案 1 :(得分:0)
这是因为告诉编译器分配const char
并指向长度为5的char数组类型的对象(因为NULL
的长度为4,不包括空终止符)并使用字符串文字对其进行了初始化。
一切都很好,直到您取消引用它为止。这样做时,只会打印出N
个字符,而不是完整的字符串。但是它们会连续存储在内存中,因此它们会被打印,直到\0
中出现字符串文字std::cout
的空终止符为止,然后再终止对该字符串的读取。
此外,请注意,一旦指向它们就无法更改它们的值,它们将不再可替换。
只需使用const char *
即可在C ++中广泛使用这些字符串,则无需使用std::string
。