为什么在创建新的C ++类时会创建两个文件(.h和.cpp)?

时间:2010-12-06 19:55:14

标签: visual-studio visual-c++ class header-files visual-c++-2008

我在大约14年前编写了一些C ++程序。我熟悉.NET等新技术,我主要与之合作。

现在,我正在编写一个simlpe手机列表Windows应用程序,我希望将其作为C ++,以便我可以更好地查看C#和C ++差异。

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

为什么会这样?为什么要为一个classe创建class1.h和class1.cpp文件?

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

问题

  1. 为什么在添加新的C ++类时会创建两个文件(.h和.cpp)?
  2. 我应该在头文件中定义成员并在cpp文件中定义函数核心吗?
  3. 如果不是2,那么在这个特定场景中的头文件是什么?
  4. 编辑#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 个答案:

答案 0 :(得分:3)

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

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

return type function name ( arguments ); < / p>

所以这个功能:

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使用方法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;
}

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

在C#中,二进制模块之间的链接始终是动态的。在C ++中,静态和动态链接之间存在差异。进入细节,我需要整整一个小时的写作,但让我们说它是最短的方式。

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

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