4

大约 14 年前,我已经编写了一些 C++。我熟悉了我主要使用的新技术,例如 .NET。

现在,我正在编写一个 simlpe 电话列表 Windows 应用程序,我想将其设为 C++,以便更好地查看 C# 和 C++ 的差异。

让我说我已经注意到了不同之处!呵呵……因此,其中一个区别是,当从 Visual Studio 模板创建一个新的 C++ 类时,它不仅会创建 .cpp 类文件,还会创建一个头文件。

为什么呢?为什么要为一个类创建一个 class1.h 和一个 class1.cpp 文件?

我记得头文件可能是函数和对象的库,如果我们可以这样说,以供将来重用,我记错了吗?

问题

  1. 为什么在添加新的 C++ 类时会创建两个文件(.h 和 .cpp)?
  2. 我应该在头文件中定义成员并在cpp文件中定义功能核心吗?
  3. 如果不是 2,那么在这个特定场景中的头文件是什么?

编辑#1

那么我的代码应该是这样的吗?

// Customer.h header file
ref class Customer {
    private:
        char* _number, _name;
        long _phoneNumber;

    public:
        char[] get_number();
        void set_number(char* number);
        char[] get_name();
        void set_name(char* name);
        long get_phoneNumber();
        void set_phoneNumber(long phoneNumber);
        void set_name(char* name);
}

然后:

// Customer.cpp
#include <Customer.h>

char[] Customer::get_number() {
    return _number;
}

void Customer::set_number(char* number) {
    if (number != null && sizeof(number) < 1) return;
    _number = number;
}

// And the other members here...

现在我知道,我的代码中有很多错误。如果你能帮我纠正它们,我会很高兴,这样我就可以提高我的 C++ 技能。

谢谢你帮我弄清楚。

4

4 回答 4

4

C++ 中的函数和类必须在使用前声明,这只是一个声明,说明这些函数可以从此文件中使用。这些声明是使用头文件(.hpp/.h文件)导入的。

要声明一个函数,你可以这样写:

return type function name ( arguments );

所以这个函数:

int factorial (int x)
{
  if (x == 0)
    return 1;
  return x * factorial (x - 1);
}

会像这样预先声明:

int factorial (int x);

声明类是这样的:

class class name { function and variable declarations };

因此class Foo,使用 method bar,公共成员变量baz将如下所示:


foo.hpp:

#ifndef FOO_HPP_
#define FOO_HPP_

class Foo
{
public:
  int baz;

  void bar ();
};

#endif

foo.cpp:

#include "foo.hpp"
#include <iostream>

void Foo::bar ()
{
  std::cout << baz << std::endl;
}
于 2010-12-06T20:10:32.523 回答
2

类在标头中声明,大多数功能在 .cpp 文件中定义。该工具正在帮助您实现接口与实现的分离。

考虑头文件和 .cpp 文件之间分离的方法是:

  • 标头包含要由其他文件使用的声明。
  • .cpp 文件包含实现。

原因是您希望大量文件能够使用功能,但您只想在一个地方实际定义该功能。

于 2010-12-06T19:57:52.167 回答
1

头文件声明/定义一个类。它包含成员函数、成员数据、朋友等。通常,它不包含太多(如果有的话)实现(模板除外)。

实现文件 (*.cpp) 就是这样:它们实现了类。

您不必使用实现文件(如果您告诉 VS 向导您要创建内联类,它只会创建头文件),但通常只对模板类(例如 STL 类和许多boost 库中的类)或非常简单的类。

于 2010-12-06T20:00:33.380 回答
1

C++ 编译需要头文件,因为它的工作方式与 C# 几乎没有区别。

在 C# 中,二进制模块之间的链接始终是动态的。在 C++ 中,静态链接和动态链接是有区别的。要详细说明,我需要写一个完整小时,但让我们说它是最短的方法。

在 C++ 中,每个 .cpp 文件都被单独编译成一个目标文件。该文件需要链接到其他文件才能形成二进制文件。头文件声明了包含它的 .cpp 文件所需的所有方法签名,该文件是调用为类定义的方法的文件。

在 C# 中,所有文件都被编译成一个二进制文件,即。编译器始终知道您正在编译的成员可以看到哪些类和方法。

于 2010-12-06T20:00:45.970 回答