为什么char *引用字符串?

时间:2016-03-03 07:12:53

标签: c++ string

我正在读错误,它说使用字符串串联来描述一个过程很常见,例如:

void error(string s1, string s2)
{
throw runtime_error(s1+s2);
}

这导致我只是在一起添加字符串,在我的代码中发现错误并发现了指针:

int main()
{
    string func = "function";
    string mesg = "Testing" + " new" + func;
    cout << mesg;
}

我查了一下错误,一些消息来源称“测试”+“新”被视为char * + char *,不能只是加在一起。我的主要问题是,为什么它不作为字符串* +字符串*?我也有一个小问题,关于error()函数。当你可以制作一个单一的字符串时,为什么还要麻烦地连接字符串呢?

3 个答案:

答案 0 :(得分:4)

C ++中的行为是从C根继承而来的,在C和C ++中,文字字符串实际上是char数组,并且所有数组都会衰减为指针到第一个元素,在一个(只读)字符数组的情况下将是char const*

const部分在处理字符串文字时很重要,因为所有字符串文字都是只读的。

如果你定义一个显式数组,比如

char my_string[] = "foobar";

然后它不是只读的,因此衰减到指向char的指针,即char*

如DevSolar所述,在C字符串中,文字实际上是char的普通数组,因此它们会衰减到char*。但是,它们仍然是只读,因此使用例如处理字符串文字时,const char *仍然是一个好主意。

C行为的参考:C11标准§6.4.5/ 6说

  

对于字符串文字,数组元素的类型为char

并在/ 7中说:

  

如果程序试图修改这样的数组,则行为是未定义的。

对于C ++(更具体地说是C ++ 11,因为这是我唯一拥有的),相关部分是§2.14.5[lex.string],其中/ 8表示

  

一个窄字符串文字的类型为“ n <{1}}

的数组

答案 1 :(得分:3)

  

为什么char *引用字符串?

嗯,它没有。这只是一个惯例;在C语言中,考虑一个以NUL字符('\0')结尾的字符串(如一段麻线)作为字符串是惯用的。你也可以让它指向一个角色。

char c = 'a';
char *p = &c;

std::string的一个构造函数将char*作为参数,因此隐式转换使您认为它们是可互换的,但它们不是。

  

为什么它不会以字符串* + string *?

的形式出现

在子表达式"Testing" + " new"中,它需要隐式地将两个字符数组转换为std::string以执行您想要的操作,而" new" + func可以按预期工作,因为其中一个已经是一个std::string另一个被转换,因为we have an operator+ function需要char*(字符array decay进入)和std::string。虽然没有运算符函数或用于讨论两个char数组的语言规则。

  

当你只能创建一个单数字符串时,为什么还要连接字符串呢?

如果error功能正是您所展示的功能,那么是的,只需要一个std::string就更有意义了。

答案 2 :(得分:0)

char*数据类型是来自普通C的结转,其中“字符串”通常表示为字符数组,其中结尾是nul字符(ASCII中的值为零) 。

您所写的内容是添加两个char*变量,而是调用operator+来连接两个string个对象的实例。

C ++有一种方法可以重新定义内置运算符以使用类实例。这称为运算符重载。一个常见的用途是字符串类(复数,因为在C ++中有一些已知的 string 的常见实现)来定义operator+以将字符串连接在一起。