Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当类';中国的实施发生了变化?_C++_Compilation - Fatal编程技术网

C++ 当类';中国的实施发生了变化?

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++的链接过程

在阅读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++的链接过程有关,我是不是?

< p>当你把函数定义放在类定义中时,默认情况下它被当作内联函数。这意味着任何调用方都可以将函数体复制到其中。如果更改定义,调用方仍将包含旧定义,除非重新编译它们

如果更改的函数的定义不在类的头文件中,则无需重新编译调用方,只需重新链接它们。这不被认为是对类定义的更改,因此Lippman书中的引用不适用


更简单的方法是类定义应该在
.h
文件中,而类的代码将在
.cpp
文件中,该文件将被编译成
.o
文件。如果对
.h
文件进行任何更改,则需要重新编译包含
的任何内容。如果对
.cpp
文件进行任何更改,您将重新编译
.o
文件并重新链接使用该文件的可执行文件。应用程序构建工具(如Unix上的
make
)应该自动为您处理此问题。

您的问题没有什么意义。您需要重新编译类定义(以及所有更改的代码)。所有这些都是显而易见的和自动的。@xyious,我正在询问将使用我的类的用户代码。C++的构建工具使用非常简单的依赖性检查,它们只查看源文件的时间戳。因此,如果不使用内联函数定义,请将声明保留在.h文件中,将实现保留在.cpp文件中,这样的修改不会导致重建其他源文件。如果使用LTO,即使未内联定义,也可能发生这种情况;-)我自己添加了这个示例,所以我认为它改变了示例的含义。假设另一种没有内联函数的情况,(更改类外定义的函数的实现)如果在类定义外更改非内联函数的实现,则无需重新编译调用方,只需将它们重新链接到类的
.o
文件。这就是我所知道的,但我对李普曼书中的陈述感到有点困惑,书中说的是“类定义”。如果函数定义不在类中,则它不是对类定义的更改。