为什么构造函数在对象调用时使用不同的运算符 - String& vs Char*?

Why different operators are used by constructor while object invocation - String& vs Char*?

以字符串作为参数调用对象,

eg: Check c1("Random");

对构造函数检查,存在基于类型的差异,字符串与字符。 字符串需要地址运算符 &,而字符需要引用运算符 *。为什么不同?

将不胜感激,谢谢。

Check(const string &str = NULL)
{
    cout << str << endl;
}

Check(const char *str = NULL)
{
    cout << str << endl;
}

我建议你研究一下 string 和 char* 之间的区别。

本质上,任何连续的字符流都是字符串。 C 使用 char* 实现它们——指向字符的指针,又名 C 字符串。这些都是空终止的,这样系统就知道何时到达了字符串的末尾。 C++ 也可以做到这一点,但它有自己的字符串库,与 cstrings 相比简化了使用

查看 link 以获得深入的解释: https://www.prismnet.com/~mcmahon/Notes/strings.html

更新: string 本身是一个 c++ 对象数据类型,而 char* 只是一个指向字符(或连续字符)的指针,它可以是可变长度,由空字符终止 [=17=]

如此实施:

void printString(string& temp){
    cout << temp << endl;
}

你的函数调用应该是这样的:

string text = "lorem ipsum";
printString(text);

此函数实现希望获得对字符串类型的引用作为其输入参数。因此,当我声明一个字符串变量 text 时,我通过简单地调用 printString(text) 将它传递给 printString 函数。函数调用将通过引用获取我的输入。它不会在函数调用

中创建 temp 字符串的副本

如果您的实施是:

void printString(char* temp){
    cout << temp << endl;
}

那么您的函数调用将是:

char* text = "lorem ipsum";
printString(text);

此实现将指针作为其输入参数,因此您必须将 char* 传递给该函数。与以前的方法不同,您可以简单地按原样传递字符串类型,它会通过引用传递。

这两个函数调用都打印出来"lorem ipsum"

string 是 class 而 char 是数据类型。当 class 对象 ex: string 按值传递给任何函数(包括构造函数)时,将在堆栈上创建该对象的副本。现在我们有 2 个包含相同数据的对象。如果这个 class 的构造函数做了相当繁重的工作,那么它会给程序带来负担。此外,复制构造函数不会连续用于新的未命名对象的创建。通过引用传递不会创建对象。它只是调用 class 中定义的 default/custom 复制构造函数。 char 不调用任何构造函数,因此没有额外的工作 + 相同的数据是参考。