Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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样式字符串到std::字符串转换澄清 我有几个问题,我认为对于C++经验的人来说,答案很简单,我会大胆地为TL提供答案。博士_C++_String_Copy - Fatal编程技术网

C样式字符串到std::字符串转换澄清 我有几个问题,我认为对于C++经验的人来说,答案很简单,我会大胆地为TL提供答案。博士

C样式字符串到std::字符串转换澄清 我有几个问题,我认为对于C++经验的人来说,答案很简单,我会大胆地为TL提供答案。博士,c++,string,copy,C++,String,Copy,给定以下代码: void stringTest(const std::string &s) { std::cout << s << std::endl; } int main() { stringTest("HelloWorld"); } 它只是将字符串文字识别为类似于char*的东西吗 我在研究复制构造函数时偶然发现了这些问题。另一个我自己澄清的快速问题 在以下情况下: std::string s = "HelloWorld"; 是用于实例

给定以下代码:

void stringTest(const std::string &s)
{
    std::cout << s << std::endl;
}

int main()
{
    stringTest("HelloWorld");
}
它只是将字符串文字识别为类似于char*的东西吗

我在研究复制构造函数时偶然发现了这些问题。另一个我自己澄清的快速问题

在以下情况下:

std::string s = "HelloWorld";
是用于实例化临时std::string的cstyle字符串构造函数,然后使用字符串复制构造函数将临时字符串复制到“s”中吗?

stringTest("HelloWorld");
std::string(const std::string&);

为什么在传递C样式字符串时,stringTest中的参数必须标记为const

只有当参数是引用时才需要,因为临时
std::string
是从传入的
char const*
构造的,而对临时变量的非
const
引用是非法的

它只是将字符串文字识别为类似于char*的东西吗

字符串文字是一个
char-const
数组,它衰减为
char-const*
。从这一点出发,编译器推断它应该使用非显式构造函数std::string::string(char const*)来构造临时

cstyle构造函数是否用于实例化临时std::string,然后使用字符串复制构造函数将临时字符串复制到“s”中

比那复杂一点。是,将创建一个临时文件。但是复制构造函数可以被调用,也可以不被调用;编译器可以跳过副本构造作为优化。但是,仍然必须提供复制构造函数,因此无法编译以下内容:

class String {
    String(char const *) {}
  private:
    String(String const &);
};

int main()
{
    String s = "";
}

此外,在C++11中,如果提供了move构造函数,则将使用move构造函数;在这种情况下,不需要复制构造函数。

在本例中,从参数“HelloWorld”调用构造函数需要
常量字符串&s
。使用的构造函数是类型转换构造

string&s
不行,因为s直接引用字符串对象

类型转换的定义类似于

 basic_string(const _CharT* __s);
用typedef

typedef basic_string<char>    string; 

为什么在传递C样式字符串时,stringTest中的参数必须标记为const

编辑: 临时规则必须是不变的。看拉斯曼的评论和回答,他是对的

原因很简单:

void change(std::string& c) { c = "abc"; }
change("test"); // what should the code exactly do??
此外,cstyle字符串构造函数是什么样子的,编译器如何知道在看到以下内容时调用它:

它在
std::string
中查找
string(char*)
构造函数

在以下情况下:

std::string s = "HelloWorld";
cstyle构造函数是否用于实例化临时std::string,然后使用字符串复制构造函数将临时字符串复制到“s”中 std::string(const std::string&)

不。在这种情况下(
TYPE variable=SOMETHING
),它与写入
类型变量(SOMETHING)相同。因此,不使用复制

它只是将字符串文字识别为类似于 字符*

原来问题的这一部分没有得到我想要的那么清楚的回答。不过,我完全赞同(并投了赞成票)Yossarian对其余部分的回答

基本上,当编译器在代码中看到字符串文字时,您需要了解它在做什么。该字符数组(就像任何c样式字符串一样)实际上存储在与其所属代码完全不同的位置(取决于体系结构,数字文本可以作为汇编/二进制指令的一部分存储在该位置本身)。这里的两个代码块“或多或少”等效(忽略缺少include或命名空间声明):

int main(无效)
{

听起来可能是错的。要么你搞错了,要么解释不清楚。无论如何,
const
都不是调用复制构造函数所必需的。@KonradRudolph听起来是错的,因为它是错的,我的思维上限是向后的。+1但你可能(应该)请澄清,在第三种情况下,即使需要复制构造函数,也不会实际调用它,因为它将(始终–无论优化如何?)被省略。这非常重要,即使它“只是”允许的优化。字符串文本没有
字符常量*
,它是
字符常量[N]
,它当然可以隐式转换为
char const*
@KonradRudolph:这样做了,并对复制/移动构造函数进行了一些扩展。@Riken:复制构造函数是向编译器发出的一个信号,可以复制某个类型的对象;将其设置为
私有
会使它们不可复制。它被省略为优化n、 但是,是的,这依赖于编译器。所以,千万不要在复制构造函数中做任何花哨的事情。@Riken理论上它依赖于编译器;实际上,所有现代编译器在任何地方都能可靠地实现它,因为这是一个非常重要且相当简单的优化,而且标准明确允许它(注意:除非编译器能够“证明”效果相同,否则不能轻易省略任何其他调用)。仅允许对复制构造函数执行此操作。但仍然允许复制构造函数,因为类可能会故意(!)通过使复制构造函数不可访问(=private)来禁止此行为。之所以存在
常量&
,是因为对临时变量的可变引用是非法的,而不是因为构造函数是非
显式的
@KonradRudolph,我在MSVC中没有启用任何优化的情况下尝试了它,
类型变量=SOMETHING;
运行了构造函数。我认为该行为在某个地方有描述,只是找不到它onw“为什么stringTest中的参数必须标记为const”-无论何时需要,您都希望创建所有未实际修改的引用
const
。@left
std::string s = "HelloWorld";
int main(void)
{
    cout << "Hello!" << endl;
    return 0;
}
const char HELLO_STR[] = { 'H', 'e', 'l', 'l', 'o', '!', 0 };

int main(void)
{
    cout << HELLO_STR << endl;
    return 0;
}