1

我是 C++ 初学者。我有一个代码如下

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;
int main()
{
   char sym[] = "Audi.Despo";
   //string sym ("Audi.Despo");
    string rs(sym);
    //cout << rs << endl;
    rs = string(sym,4);

 cout << rs;

    return 0;
}

如果变量 sym 是一个 char 数组,则字符串变量的最终输出是 Audi

但如果相同的变量 sym 是字符串,则最终输出为 .Despo (打印后缀)

什么解释。

看起来像线

rs = string(sym,4);

如果其输入是 char [] 或字符串,则更改其行为。

4

3 回答 3

4

这只是两个构造函数重载的不同实现:

string ( const string& str, size_t pos, size_t n = npos );

内容被初始化为 str 的子字符串的副本。子字符串是 str 的一部分,从字符位置 pos 开始,最多占用 n 个字符(如果之前到达 str 的结尾,则它占用少于 n 个字符)。

string ( const char * s, size_t n );

内容被初始化为由 s 指向的字符数组中的前 n 个字符形成的字符串的副本。

于 2012-10-09T15:57:22.590 回答
0
string ( const string& str, size_t pos, size_t n = npos );

std::string 构造函数中的第二个参数是用于初始化内容的子字符串的起始位置。

于 2012-10-09T15:59:25.430 回答
0

当你说:

rs=string(sym, 4);

你正在做的是说,“为我构建一个std::string对象,我(程序员)将通过给你这个字符数组和一个数字来帮助你(程序)做到这一点。” 类背后的代码std::string知道,在那个实例中,给它一个字符数组和一个整数,它应该从字符数组中获取字符数并std::string使用该内容构造一个。

当你说:

string rs2=string(rs, 4);

你现在所做的就是说,“给我一个std::string对象,我会通过给你这个已经存在的 std::string对象和一个数字来帮助你做到这一点。” 在这种情况下,std::string班级做了一些完全不同的事情。当它接收到这两个参数时,它会使用数字作为从提供的开始读取的位置std::string

这两种不同的情况是类的两种不同的构造函数——它们提供了两种不同的方法来根据您可用的信息std::string构建对象。std:string您可以通过将第二个示例更改为以下形式轻松地使第二个示例像第一个示例一样工作:

string rs2=string(rs, 0, 4);

现在您要告诉它“通过从另一个 中获取字符来初始化这个新的std::string(称为) 。我希望您从索引 0 处的字符(所以,第一个)开始,然后再获取 4 个字符——如果它们存在的话。”rs2std::string rs

在构造类的对象之前,了解构造函数的行为方式很重要。std::string您可以通过一些搜索在许多地方在线找到有关所有构造函数的文档。

作者注: 注意到这个例子中发生了许多其他事情(例如,赋值运算符)并且许多问题都被掩盖了,但考虑到这个问题的自我陈述的初学者性质,我觉得最好保持高等级。

于 2012-10-09T16:05:50.567 回答