在C++中初始化字符串
Initializing strings in C++
所以,这个问题可能会立即被否决,但是,我最近开始学习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++时,现在是避免养成不良编程习惯的最佳机会。
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 用字符串初始化我的类的对象
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 使用字符串初始化wchar_t[]
- 如何从常量字符串初始化 LPWSTR?
- 字符串初始化和打印
- 这是什么字符串初始化?
- 字符串初始化失败:"expression must have integral or unscoped enum type"
- 谁能告诉我如何用字符串初始化 ex 对象
- 函数原型中的字符串初始化
- 带双引号的字符串初始化
- C 字符串初始化会导致意外放置空字符
- 字符串初始化失败
- 将字符存储在用字符串初始化的字符指针中
- 为什么使用字符串初始化的C++位集是相反的
- 用c++中的字符串初始化char Buffer
- 带bool类型的字符串初始化
- c++字符串初始化
- 视觉 任何非(字符*)正确的方法,用于从 C++ 中的常量字符串初始化 void*