在C++中初始化字符串

Initializing strings in C++

本文关键字:字符串 初始化 C++      更新时间:2023-10-16

所以,这个问题可能会立即被否决,但是,我最近开始学习C++,我注意到有一行代码是:

#include <string>

这是否意味着如果我有一个程序说:

#include <iostream>
using namespace std;
int main() {
    string foo = "test";
    cout << foo;
}

会不会编译不正确?如果是这样,这是否意味着字符串必须以一种更java的方式"导入"?如果下面的代码有任何问题,请告诉我。对不起,如果这是一个糟糕的问题。

您必须首先初始化字符串 #include<string> 然后std::string nameofstring 。编辑:对于cout,如果您不想使用命名空间,您还必须使用std::cout

不会正确编译吗?可能会也可能不会。这是一种未定义的行为。

在C++中,声明应该先于定义和用法。因此,如果您正在使用定义,编译器希望您在使用它之前声明某个地方。

一般约定是将所有声明包含在头文件中,对于标准库附带的所有类型都是如此。如果您计划使用标准库类型、模板、常量或值之一,您应该知道该声明将来自何处,并将其包含在翻译单元中,否则它将是一个未定义的行为。

#include等同于 java 的导入是错误的:如果你导入一个模块,你就拥有它的所有定义和代码。 #include某些东西并不能保证你拥有一切。在C++标头通常用于在模块之间共享定义,以便b.cpp知道class A的大小来自a.cpp,等等。实现存储在单独的编译二进制文件或库中,#include不会自动将这些文件或库与项目关联。

请考虑以下事项:

// foo.h
class Foo {
public:
    Foo();
};
// foo.cpp
#include <iostream>
#include "foo.h"
Foo::Foo() {
    std::cout << "hellon";
}

"foo.h"包含Foo的声明,但它缺乏功能。如果我现在写另一个文件:

// bar.cpp
#include "foo.h"
int main() {
    Foo f;
}

这编译得很好。但是当它进入链接阶段时,它会抱怨我没有Foo::Foo()的定义(实现)。必须将两个二进制文件显式链接在一起才能生成可执行文件。有了GCC/Clang,那将是

g++ -Wall foo.cpp bar.cpp

或者,如果您已将"foo"转换为库:

g++ -Wall bar.cpp -lfoo

使用像Visual Studio的Eclipse这样的IDE,您必须手动通知项目需要包含额外的cpp文件/对象文件/库。

首先,无论#include什么,最初显示的代码都不会编译。那是因为类名是 std::string ,而不是 string 。正如您最终发现的那样,并更新了您的问题。

每个类、模板或C++库定义的任何其他资源都需要#include适当的标准头文件。尽管包含特定的头文件也可以间接包含其他一些头文件,因此您最终会"免费"获得这些头文件的内容,但这将依赖于特定于编译器的功能。当我定期更新我的代码并针对较新版本的gcc变基时,我经常在这里和那里发现一些位现在缺少正确头文件的显式#include,因为,在不知不觉中,我错过了它,但以前的编译器版本的头文件最终还是把它拉了进来。

因此,将类名固定为 std::string 后,您可能会发现生成的代码可以编译或不编译。如果它确实编译了,那只是由于特定编译器标头的良好风度,并且可能无法由其他编译器或您正在使用的同一编译器的较新版本编译。

附言你应该避免using namespace std;,这是不好的做法。当你开始学习C++时,现在是避免养成不良编程习惯的最佳机会。