Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串vs char*作为类成员变量。为什么要使用char*?_C++ - Fatal编程技术网

C++ 字符串vs char*作为类成员变量。为什么要使用char*?

C++ 字符串vs char*作为类成员变量。为什么要使用char*?,c++,C++,vs 如果我错了,请纠正我。如果我们要使用char*而不是string,我们必须编写自己的复制构造函数,因为每次我们都需要将指针变量作为数据成员。对吧? 所以,我的问题是:为什么要使用char* 使用字符串,在构造函数中,我们可以直接执行以下操作: class Student { public: char* name; }; 与char*相比,它更简单,需要: Student(string s) { name = s; } 为什么在使用时不使用字符串,而不

vs

如果我错了,请纠正我。如果我们要使用char*而不是string,我们必须编写自己的复制构造函数,因为每次我们都需要将指针变量作为数据成员。对吧?

所以,我的问题是:为什么要使用char*

使用字符串,在构造函数中,我们可以直接执行以下操作:

class Student {
     public:
        char* name;
};
与char*相比,它更简单,需要:

Student(string s) {
    name = s;
}

<强>为什么在使用时不使用字符串,而不是作为一个类的数据成员使用?< /强>

< p>我认为C++中使用的唯一原因是代码> char */COD>作为字符串。因为C是一个新的语言,一个不与C兼容的语言,<代码> char */COD>不会被这样使用。您会注意到,处理
char*
的函数都来自C

注意,在C中没有字符串,所以

Student(string s) {
    name = new char[strlen(s)+1];  // extra 1 to store the '\n'
    strcpy(name,s);
}
是完全有效的C代码,而

struct Student { char* name; };
事实并非如此。因此,在处理以前以C为目标的代码时,看到那些
char*
类型并不罕见


通常很少有理由将
char*
用作字符串,除非您正在编写新的字符串类、连接C函数或处理遗留代码。

您使用
char*
而不是
string
,因为
字符串
是字符串,
char*
是指向字符对齐地址的指针

在此基础上,字符串是具有定义语义的字符向量的抽象。在C域和许多C++程序中,它代表一个分配的内存块,并保证它以ASCII NUL字符“代码> 0x00 < /CODE >终止。但是,字符串的C++实现可以使用,例如,具有相关长度的Pascal字符串,或者它可以将字符串池中的字符串表示为链表。
char*
根本不提供这种保证,事实上可能不是一个字符串——例如,它可能是一个包含嵌入式
0x00
值的数据集合。它所承诺的只是它是底层架构认为是字符的某个内容的地址。

如果需要字符串,请使用
std::string
,而不是
char*

一个明显的例外是与使用
char*
表示字符串的遗留代码进行接口。不过,不要在接口层之外使用
char*


如果数据不是字符串,而是原始的非结构化字节数组,则需要使用
char*
。当您从文件或网络接口读取或写入二进制数据时就是这种情况。

有时,使用
char*
而不是
string
更简单,例如,当您处理网络时,需要将一个满字节的字符串转换为整数、浮点等。。我认为使用
char*
比使用
字符串更简单:

使用
char*
使用
字符串
string
的问题在于它的设计是为了防止错误使用或奇怪的操作。正如某人所说的,这也是因为C++是从C继承的。因此,有函数(来自LBC/GLIBC)采用了<代码> char */COD>而不是<代码>字符串 编辑
即使
char*
char**
不同,使用
std::vector
std::string
构建二维数组也是相当复杂的,您应该创建适当的类,使用
char**
,或者库特定的实现(Boost、math libs等)

> P>关于C++程序员使用“代码> char */CODE >的唯一地方是在<代码>外部“C”<代码>程序中,或者在非常低的级别代码中,就像实现了MalOC/<代码>(在这里,需要添加一些字节到Value*/Cuth>)。即使在调用C ABI时,接口所需的
char*
通常来自
&s[0]
,其中
s
是一个
std::string
,或者如果接口不知道常量(而且很多C接口都不知道),则
常量转换的结果

char-const*
更为常见:字符串文字毕竟是
char-const[]
,我偶尔会定义如下内容:

 std::string buffer;
 buffer.resize(4);
 read(buffer.data(), 4); // Will not work as buffer.data() returns a const char*
 int value = *((int*)(&buffer.data()[0]));
但仅适用于静态数据,例如:

struct S
{
    int value;
    char const* name;
};
这可用于避免初始化顺序问题;在上面的例子中,初始化是静态的,并且保证在任何动态初始化之前发生


还有一些其他情况:例如,当在到C ABI之间进行编组时,我使用了
char const*
。但它们很罕见。

你可能不会。唯一的原因是,如果类型必须是POD类型,那么无论如何,您不能实现自己的赋值运算符/复制构造函数/析构函数。这是一个反问。如果你想不出一个好的理由,那就别这么做。把它放在你的后口袋里,也许有一天你不想复制一个数兆字节的字符串。通常人们使用
string
,因为它很安全。人们之所以使用char,要么是因为他们不太清楚,要么是因为他们真的需要所有不安全因素带来的额外性能。谁强迫你使用
char*
?也许你不想复制数据。(如果它是静态数据,或者生命周期包含在外部对象中,那么复制指针就足够了。您可能还处于不需要内存分配的情况下。)
char*
更简单的证据是使用它的代码严重损坏。根据情况,它更简单。当您因为遗留代码/CAPI而不能依赖
std::string
的简单性时。什么时候更简单?你在发帖中所做的只是显示不起作用的代码;如果说“更简单”,你的意思是“不工作”,那么好吧。但除此之外,请看这里:如果我们使用的是
std::string char* buffer[4];
 read(buffer, 4); // A random read operation
 int value = *((int*)(&buffer[0]); // Not sure if it was like that...
 std::string buffer;
 buffer.resize(4);
 read(buffer.data(), 4); // Will not work as buffer.data() returns a const char*
 int value = *((int*)(&buffer.data()[0]));
struct S
{
    int value;
    char const* name;
};
S const table[] =
{
    { 1, "one" },
    { 2, "two" },
    //  ...
};