如何使用C++方法
How to use C++ Methods?
我正在使用C++MinGW编译器,并试图弄清楚如何使用方法和创建方法。这就是我尝试的:
#include <iostream>
using namespace std;
int main()
{
test();
}
void test()
{
cout << "Hello" << endl;
}
我是c++的初学者,但我对Java了解很多。这是编译器消息:
12:09:06 **** Incremental Build of configuration Debug for project String Gen ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\main.cpp"
..main.cpp: In function 'int main()':
..main.cpp:6:14: error: 'test' was not declared in this scope
12:09:06 Build Finished (took 411ms)
test()
必须在main()
之前声明。
#include <iostream>
using namespace std;
void test()
{
cout << "Hello" << endl;
}
int main()
{
test();
}
或者您可以使用正向声明:
#include <iostream>
using namespace std;
void test();
int main()
{
test();
}
void test()
{
cout << "Hello" << endl;
}
在Java和C#等语言中,声明的顺序并不重要,但对于C和C++编译器来说,顺序很重要。基本上,在您的示例中,编译器会到达test();
并说"我不知道test
是什么。"因此,要么在main()
之前定义整个test()
函数,要么简单地提前声明以告诉编译器"嘿,在我的程序中,有一个名为test
的函数在的某个地方具有此签名。"
一个更复杂的例子:
测试.h
void test();
test.cpp
void test() {
// Whatever...
}
main.cpp
#include "test.h"
int main() {
test();
return 0;
}
C++构建模型与Java模型有很大不同。在C++中,有各种实体的"声明"answers"定义",如函数、类、方法等。C++源代码由一系列声明和定义组成。单个模块或"翻译单元"被编译成目标代码,其中包含该翻译单元中定义的任何实体。然后,组成程序的编译翻译单元被"链接"在一起,在一个翻译单元中定义的实体与它们在其他翻译单元中的使用挂钩。
在翻译单元中,实体的某些用途只需要声明,而其他用途则需要完整的定义。例如,调用一个函数只需要声明该函数。创建一个作为对象指针的变量只需要声明对象的类型。创建一个类型为类类型(而不是指针)的变量需要类的完整定义。什么需要完整的定义,什么只需要声明,取决于实现用法所需的内容。特别是,如果使用只需要知道接口细节,那么声明就足够了,但如果需要实现细节,那么就需要定义。
此外,还指定了C++,使得编译器几乎可以是单次通过的;声明和定义在使用之前必须出现在源代码中(在大多数情况下,也有一些例外),这样C++在提到实体时就已经知道使用了什么实体。
因此,代码的问题在于,当编译器到达test()
时,它不知道test
是什么。它可以是类型、函数或变量。它不知道,因为它还没有被告知。您需要提前声明test
来告诉它。
void test();
int main() {
test();
}
现在,编译器在尝试调用测试时就会知道它是一个函数。由于调用函数不需要知道除函数签名之外的任何信息,因此如果愿意,可以将test
的定义放入一个完全不同的转换单元中。您将编译这两个翻译单元,然后链接器将调用test()
的代码连接到另一个已编译翻译单元中该函数的定义。
头文件是C和C++中的一个常见技巧,它使在翻译单元之间共享声明的单个源变得容易。它们并不是绝对必要的,但如果你在不同的文件中声明了一些稍微不同的东西,导致声明混乱,那么你的程序可能会以意想不到和不可预测的方式失败。
#include
指令只需取您命名的任何文件,并将内容粘贴到源代码中。这样,无论放在头中的是什么,都有一个单独的源,例如函数声明。这样,您就可以确保在每个需要声明的文件中都包含相同的声明,而不用担心在一个文件和另一个文件中声明的内容是否略有不同。
您也可以将类定义放在头文件中,因为类定义需要在以特定方式使用该类的每个翻译单元中重复。同样,您可以在每个翻译单元中手动写出所需的信息,但将定义粘贴在标题中并让#include
指令为您进行复制和粘贴更容易。
如果你想学习C++,我建议你读一本好书。如果你还不熟悉编程,我推荐编程:使用C++的原理和实践。既然你说你已经编程了,那么我听说一本更好的书可能是《加速C++》。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法