为什么构造函数在对象调用时使用不同的运算符 - 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 不调用任何构造函数,因此没有额外的工作 + 相同的数据是参考。
以字符串作为参数调用对象,
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 不调用任何构造函数,因此没有额外的工作 + 相同的数据是参考。