C++中的头文件和Java中的抽象类/接口实现是否一致是正确的吗?

Jaa*_*nus 6 c++ java implementation

我有点熟悉C++,我知道对于几乎每个头文件,我都必须创建源文件.

现在我正在研究java接口和实现,它看起来是一样的.首先,您只需在一个类中命名变量和方法,然后在其他类中定义它们.

这些东西在C++和Java中是基本相同还是相似?

Sco*_*ham 20

Java接口和C++头/实现文件是不同的概念.

C++有一个文本编译模型.因此,要在代码中使用某些东西(例如函数),编译器必须首先解析该函数​​的定义.通过将内容放入要从许多源文件中使用的头文件中,它可以节省您必须重新写出函数定义的原因,因为您可以将相同的头文件包含在使用该头中的内容的许多源文件中.

只需编写函数名和参数即可声明 C++中的函数:

void PrintMessage(std::string text);
Run Code Online (Sandbox Code Playgroud)

它们也可以通过编写方法体来定义:

void PrintMessage(std::string text)
{
  cout << text;
}  
Run Code Online (Sandbox Code Playgroud)

您只能在编译单元中定义一次函数(这是编译器在#includes被替换为包含的文件的文本后看到的所有文本).但是,只要声明相同,就可以多次声明一个函数.您必须定义一次调用的每个函数.这就是为什么你有一个.cpp文件为每个.h文件..cpp定义.h文件中声明的所有函数..h文件包含在所有使用这些函数的.cpp文件中,并被包含在定义函数的.cpp文件中一次.

Java在查看项目中的所有文件时编译项目的时候会找到函数定义的位置.C++一次只编译一个.cpp文件,只查看#included头文件.

Java接口等同于C++抽象基类.它本质上是一组方法的声明,包括它们采用的参数类型和返回值的类型.Java接口或C++抽象基类可以由Java类或C++类继承,它实际上定义(实现)这些方法是什么.

在C++中,当您创建一个类时,通常(有异常)将方法声明放入头文件中,并将定义放在.cpp文件中.但是,在Java中,您只需要编写方法的定义,这些定义相当于C++定义和声明.您可以将所有java方法定义放在一个文件中.


And*_*lov 5

不,Java interface是C++的抽象类.考虑一下:

// Java
interface Entity {
  void func();
}

class EntityImpl implements Entity {
  public void func() {
    System.out.println("func()");
  }
}
Run Code Online (Sandbox Code Playgroud)

// C++
struct Entity {
  virtual void func() = 0;
  virtual ~Entity() {}

// just to emphasize it's a BASE class
protected: Entity() {} // not required
};

struct EntityImpl : Entity {
  void func() {
    std::cout << "func()" << std::endl;
  }
};
Run Code Online (Sandbox Code Playgroud)