【问题标题】:Why don't we need objects to store string data?为什么我们不需要对象来存储字符串数据?
【发布时间】:2019-09-02 19:39:18
【问题描述】:

在C++中,如果字符串是一个类,为什么我们不需要点运算符或对象来存储字符串中的数据?

经典字符串:

string str = "ABC";

为什么我们可以直接使用“”传递ABC,而不是像这样做

string str;

str.data = "ABC";

但是我们需要使用对象来访问这些功能。 示例:

str.length();

我们为什么要这样做?

字符串是某种特殊的类吗?

【问题讨论】:

  • 在这种情况下,它是一个构造函数。但是 C++ 允许您重载运算符,这会使您看起来正在操作没有方法的对象,但这只是在对象上调用方法的语法糖。
  • std::string 不是一种特殊的类,它是一种非常普通的类。我怀疑您熟悉其他语言并且会从a good book 中受益。

标签: c++ string class oop


【解决方案1】:

string str = "ABC"; 不是赋值。是建筑。具体来说,它调用带有const char * 参数的std::string 构造函数。

和做的一样

string str("ABC");

只是语法不同。

分配也有效。你这样做:

string str;
str = "ABC";

另见:

Copy initialization

std::string constructors

std::basic_string::operator=

【讨论】:

  • 请注意,分配也有效:str = "DEF";.
  • 那么,“ABC”只是 const char 参数?
  • @AtharvaPatwardhan 是的。
【解决方案2】:

std::basic_string 有一个这样的构造函数:

basic_string( const CharT* s, const Allocator& alloc = Allocator() );

用 s 指向的以空字符结尾的字符串的副本初始化内容构造字符串。

但需要注意的重要一点是这个构造函数不是explicit,因此编译器可以在构造函数调用期间对空终止字符串进行隐式转换。

例如,以下代码编译没有任何问题:

class Foo {
public:
    Foo(int) {}
};

int main() {
    Foo f = 10;
}

如果构造函数写成这样就不会编译:

explicit Foo(int) {}

【讨论】:

  • 所以如果字符串值是 const char 参数并且第二个参数大部分是 NULL,我需要分配什么来初始化第二个参数?我的意思是问什么(如果需要)作为 const Allocator 传递?
  • Seconds 参数不为空,它是默认值。所有标准容器都是分配器感知容器,也就是说,如果默认分配器不适合我们,它们会给我们传递自定义分配器的选项。除非您正在做真正高级的工作,否则您不必考虑分配器参数。
【解决方案3】:

C++中,字符串文字不是std::string,而是C风格的字符数组(char[N])。是的,std::string 或您可能看到的任何其他第 3 方字符串类型是具有转换构造函数的类,它接受字符数组作为输入。更准确地说,std::string类型别名,用于实例化 模板 std::basic_string。简而言之,在对字符串字面量进行任何操作之前,最好将其转换为字符串:

std::string{"ABC"}.size()

否则您将不得不切换到不建议初学者使用的 C API:

strlen( "ABC")

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多