在C ++中初始化字符串

时间:2016-07-11 03:05:49

标签: c++ string initialization

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

#include <string>

这是否意味着如果我有一个声明的程序:

#include <iostream>

using namespace std;

int main() {
    string foo = "test";
    cout << foo;
}

会不能正确编译?如果是这样的话,那就意味着Strings必须以更简洁的方式表达,并且#34;导入&#34;?如果以下代码有任何问题,请告诉我。对不起,如果这是一个糟糕的问题。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

一般约定是在头文件中包含所有声明,对于标准库附带的所有类型都是如此。如果您打算使用标准库类型,模板,常量或值之一,您应该知道该声明的存在位置,并将其包含在您的翻译单元中,否则将导致未定义的行为。

答案 2 :(得分:1)

#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 << "hello\n";
}

“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文件/目标文件/库。

答案 3 :(得分:0)

首先,无论#include d是什么,最初显示的代码都无法编译。这是因为班级名称是std::string,而不是string。正如您最终想出来的那样,并用。更新了您的问题。

每个类,模板或C ++库定义的任何其他资源都需要适当的标准头文件#include d。虽然包含一个特定的头文件也可以间接地包含一些其他的头文件,所以你最终得到这些头文件&#39;内容&#34;对于免费&#34;,这将依赖于编译器特定的功能。当我定期更新我的代码并针对较新版本的gcc进行rebase时,我经常会发现一些内容,现在缺少正确头文件的显式#include,因为在不知情的情况下,我错过了它,但之前的编译器版本的头文件最终还是把它拉了进去。

因此,在将类名修改为std::string之后,您可能会发现生成的代码执行或不编译。如果它是编译的,那只是由于你的特定编译器头的好处,并且它可能无法被其他编译器或你正在使用的相同编译器的较新版本编译。

P.S。你应该avoid using namespace std;, this is bad practice。当你开始学习C ++时,现在是避免获得不良编程习惯的最佳机会。