C++ 当类';中国的实施发生了变化?
在阅读Lippman的书中关于封装的内容时,我发现了以下参数 虽然类定义更改时用户代码不需要更改, 使用类的源文件必须在任何时候重新编译该类 变化 假设我有以下代码C++ 当类';中国的实施发生了变化?,c++,compilation,C++,Compilation,在阅读Lippman的书中关于封装的内容时,我发现了以下参数 虽然类定义更改时用户代码不需要更改, 使用类的源文件必须在任何时候重新编译该类 变化 假设我有以下代码 class A { private: int x; public: A() { x = 0; } int x_plus(); } int A::x_plus(){ return x + 1; } 如果我将x_plus()的主体更改为返回x+2,为什么要重新编译使用它的源文件 我认为这与C++的链接过程
class A {
private:
int x;
public:
A() { x = 0; }
int x_plus();
}
int A::x_plus(){ return x + 1; }
如果我将x_plus()
的主体更改为返回x+2
,为什么要重新编译使用它的源文件
我认为这与C++的链接过程有关,我是不是?
< p>当你把函数定义放在类定义中时,默认情况下它被当作内联函数。这意味着任何调用方都可以将函数体复制到其中。如果更改定义,调用方仍将包含旧定义,除非重新编译它们 看 如果更改的函数的定义不在类的头文件中,则无需重新编译调用方,只需重新链接它们。这不被认为是对类定义的更改,因此Lippman书中的引用不适用更简单的方法是类定义应该在
.h
文件中,而类的代码将在.cpp
文件中,该文件将被编译成.o
文件。如果对.h
文件进行任何更改,则需要重新编译包含
的任何内容。如果对.cpp
文件进行任何更改,您将重新编译.o
文件并重新链接使用该文件的可执行文件。应用程序构建工具(如Unix上的make
)应该自动为您处理此问题。您的问题没有什么意义。您需要重新编译类定义(以及所有更改的代码)。所有这些都是显而易见的和自动的。@xyious,我正在询问将使用我的类的用户代码。C++的构建工具使用非常简单的依赖性检查,它们只查看源文件的时间戳。因此,如果不使用内联函数定义,请将声明保留在.h文件中,将实现保留在.cpp文件中,这样的修改不会导致重建其他源文件。如果使用LTO,即使未内联定义,也可能发生这种情况;-)我自己添加了这个示例,所以我认为它改变了示例的含义。假设另一种没有内联函数的情况,(更改类外定义的函数的实现)如果在类定义外更改非内联函数的实现,则无需重新编译调用方,只需将它们重新链接到类的.o
文件。这就是我所知道的,但我对李普曼书中的陈述感到有点困惑,书中说的是“类定义”。如果函数定义不在类中,则它不是对类定义的更改。