为什么我们不需要对象来存储字符串数据?

时间:2019-04-12 05:09:52

标签: c++ string class oop

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

经典字符串:

string str = "ABC";

为什么我们可以直接使用“”代替ABC

string str;

str.data = "ABC";

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

str.length();

我们为什么要这样做?

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

3 个答案:

答案 0 :(得分:2)

string str = "ABC";未分配。它是建筑。具体来说,它使用std::string参数调用const char *构造函数。

一样
string str("ABC");

只是语法不同。

分配也可以。您可以这样做:

string str;
str = "ABC";

另请参阅:

Copy initialization

std::string constructors

std::basic_string::operator=

答案 1 :(得分:2)

std::basic_string具有这样的构造函数:

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

使用内容为s指向以空终止的字符串的副本初始化的内容来构造字符串。

但是要注意的重要一点是,此构造函数不是explicit,因此编译器可以在构造函数调用期间隐式转换以null结尾的字符串。

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

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

int main() {
    Foo f = 10;
}

如果构造函数写为:

explicit Foo(int) {}

答案 2 :(得分:0)

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

std::basic_string

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

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