Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++ - Fatal编程技术网

C++ 将字符*转换为字符串&;

C++ 将字符*转换为字符串&;,c++,C++,我有以下代码: #include <iostream> using namespace std; int main(int argc, char *argv[]) { string &s1 = argv[0]; // error const string &s2 = argv[0]; // ok argv[0] = "abc"; cout << argv[0] << endl;

我有以下代码:

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    string &s1 = argv[0];           // error
    const string &s2 = argv[0];     // ok

    argv[0] = "abc";
    cout << argv[0] << endl;        // prints "abc"
    cout << s2 << endl;             // prints program name
}

那么为什么编译器接受s2

有趣的是,当我给
argv[0]
赋值时,
s2
不会改变。编译器是否忽略了它是一个引用并复制了该值?为什么会这样

我在代码::Blocks 16.01(mingw)中编写此代码。使用/不使用
-std=c++11
时也会发生同样的情况


那么为什么编译器接受s2呢

因为常量引用可以绑定到一个临时变量,
std::string
有一个构造函数,可以将
char*
作为参数

该赋值构造了一个所谓的“临时”对象,并将一个常量引用绑定到该对象

有趣的是,当我给argv[0]分配一个新值时,s2就没有了 改变

为什么要改变呢<代码>s2是一个单独的对象。
std::string
对象不维护指向创建它的
char*
的指针。有许多方法可以创建
std::string
。实际字符串归对象所有。如果
std::string
是由文字字符串构造的,则会将其复制到
std::string
中。因此,如果文字字符串来自缓冲区,并且随后修改了缓冲区,则它对
std::string

此行没有影响:

const string &s2 = argv[0]; 
创建一个新的
字符串
实例,复制
argv[0]
的内容,并将引用绑定到该实例。稍后,将输出该副本,该副本现在与
argv[0]
的实际值无关


在引用行中创建的临时字符串对象生存期将扩展到块的范围,因为对它形成了常量引用。更多信息请参见:

在这两种情况下,代码都要求编译器构造一个临时的
std::string
对象,其内容是
argv[0]
的副本。虽然了解其中的细节很有趣,也可能很有用,但从实际编写代码的角度来看,与临时程序混在一起是没有必要的,这会导致混乱。只需创建一个对象:

std::string s1 = argv[0];
线路

const string &s2 = argv[0];
等于:

const string &s2 = std::string(argv[0]);

因此s2包含对临时字符串的常量引用,临时字符串从argv[0]复制了内容。

您认为
argv[0]
std::string
?“那么编译器为什么接受s2?”因为隐式转换。
std::string
的构造函数采用
const char*
作为参数。我错了吗?不,你错了。这就是为什么我写了“可以接受”,而不是“接受”。
const string &s2 = std::string(argv[0]);