【发布时间】:2020-07-14 14:10:13
【问题描述】:
在这段代码中,我们创建了一个 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 类型只能存储单个字符,但如果我将其设为指针,则它包含多个字符。请清除这一点,我很困惑它是如何工作的。
【问题讨论】:
-
id是一个指针,它唯一“持有”的是一个对象的地址——它并不“持有”整个数组 -
你怎么知道它有多少个字符?
-
如果您将
std::string用于name,为什么id是char *? -
是的,它是有趣的。在 C 和 C++ 中,指向单个字符的指针也用于指向整个数组中的第一个(或任何一个!)字符。从语言上无法断定是哪一个,你得看代码和文档。如果使用指针指向数组中的第一个元素,通常会有一个长度,因为没有其他通用方法可以知道在第一个元素后面存储了多少元素。 (对于可打印字符,我们可以(标准库函数也可以)查找终止的零字节,但对于二进制数据则失败。)
-
@drescherjm 请注意,
id本身不是 const,它指向 const。您可以更改它在程序中指向的内容。事实上,如果它是 const ,即使在构造函数中也不能赋值;你必须初始化它。顺便说一句,它指向 const 并不妨碍您分配非常量字符(数组)的地址!它只是表明它所指向的内容的内容不会被类更改。