如何使用C++方法

How to use C++ Methods?

本文关键字:方法 C++ 何使用      更新时间:2023-10-16

我正在使用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++》。