Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++ 为什么在C+;中不允许两个常量字符*的串联+;?_C++_String - Fatal编程技术网

C++ 为什么在C+;中不允许两个常量字符*的串联+;?

C++ 为什么在C+;中不允许两个常量字符*的串联+;?,c++,string,C++,String,我尝试了以下方法,但不起作用。为什么? std::string s = "hello" + "world"; 为什么C++标准库开发人员决定不超载运算符+来实现 char */COD>级联?它不会使人们的生活更简单吗?“你好”和“世界”是两个const char指针。没有可用于连接两个const char指针的函数 您可以尝试以下操作: std::string("hello") + "world"; std::string("hello") + std::string("world");

我尝试了以下方法,但不起作用。为什么?

std::string s = "hello" + "world"; 
为什么C++标准库开发人员决定不超载<代码>运算符+<代码>来实现<代码> char */COD>级联?它不会使人们的生活更简单吗?

“你好”和“世界”是两个
const char
指针。没有可用于连接两个
const char
指针的函数

您可以尝试以下操作:

std::string("hello") + "world";
std::string("hello") + std::string("world");

使用两个文本字符串,可以将它们连接起来,但不需要任何运算符,只需要(可选)空格。所以

 std::string s="hello" "world"; 
是允许的,与

 std::string s="helloworld"; 
实际上,在解析时,两个文本字符串粘合在一起成为一个字符串。这也适用于C语言,并且发生在预处理扩展之后

这是编译过程的一部分。相邻的节点被连接起来

顺便说一句,这只适用于字符串文本。例如

std::string s1= ((1<2)?"hello":"goodbye") "world"; // wrong
std::string s2= ("ab")"cd"; // wrong
但是
“abcd”s
“ef”s
都表示某个常量
std::string
-s,并且
+
适用于这些常量

为什么C++标准库开发者决定不重载“+”来实现char *级联? 然后你会想要编码

 char* foo = (rand()%4)?"lucky":"unlucky";
 char* bar = foo + "xy";  // wrong
如果实现了这样一个
+
,它将需要(在运行时)分配堆内存,即
strdup
,并且您需要决定谁和什么时候是
delete[]
free
-d。顺便说一句,因为您不能在指针类型上定义
运算符+
。因此,标准委员会决定不允许这样做是明智的


但是,如果您用
std::string
替换上面的
char*
两次,它就会工作。

首先,让我们看看
std::string(“hello”)+“world”的工作原理。
在std::string类中,它有一个重载“+”运算符的成员函数

std::string(“hello”)+“world”

等同于从std::string调用成员函数:
operator+(std::string(“hello”),“world”)

char是c/c++中的一个基本类型,这意味着char类型中没有成员函数。因此char本身没有成员函数来重载+运算符

如果要重载操作,则必须遵循以下规则:
“当运算符出现在表达式中,且其至少一个操作数具有类类型或枚举类型时”。该字符既不是“类”也不是“枚举类型”

因此,人们无法创建如下运算符:
const char*运算符+(const char*lhs,const char*rhs)


这就是为什么你不能拥有“hello”+“Word”的原因。

为什么C++标准库开发者决定不重载“+”来实现char *级联?这会让人们的生活更简单,不是吗?事实上,没有。。不会的。。正如其他答案所指出的,您可以删除<代码> +/COD>并具有字符串文字,但C++语言覆盖<<代码> +>代码>操作符,仅用于<代码> const char */COD>类型会使事情复杂化。代码>常量字符*串联(常量字符*str1,常量字符*str2){return str1+str2;}
。。在这个函数中,如果
++
被重载,它们的内存会被分配来连接吗?使ppl的生活更简单不是c/c++的目的<代码>C使你很容易射中自己的脚;C++使它变得更难,但是当你这样做时,它会把你的整个腿都吹走。< /Cord>猜谁说的?但是这怎么回答“C++标准库开发者为什么决定不超载”?
 char* foo = (rand()%4)?"lucky":"unlucky";
 char* bar = foo + "xy";  // wrong
string operator + (const string& lhs, const char* rhs);