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]);