gpt4 book ai didi

c++ - 定义内联函数的正确方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:42 26 4
gpt4 key购买 nike

假设我有一个类 X (X.h):

class X {
private:
unsigned unitsSold = 0;
double revenue = 0.0;

public:
double avgPrice();
}

avgPrice()应该怎么定义?

Option 1 (类里面):

X.h

class X {
private:
unsigned unitsSold = 0;
double revenue = 0.0;

public:
double avgPrice() {
return unitsSold ? revenue / unitsSold : 0;
}
}

Option 2 (在与类相同的文件中,但在类定义之外):

X.h

class X {
private:
unsigned unitsSold = 0;
double revenue = 0.0;

public:
double avgPrice();
}

inline double X::avgPrice() {
return unitsSold ? revenue / unitsSold : 0;
}

Option 3 (在单独的头文件中):

X.h:

class X {
private:
unsigned unitsSold = 0;
double revenue = 0.0;

public:
double avgPrice();
}

X-inl.h:

#include "X.h"

inline double X::avgPrice() {
return unitsSold ? revenue / unitsSold : 0;
}

最佳答案

对于inline 说明符的含义可能存在一些误解。是的,它确实向编译器提示内联代码而不是调用,但编译器不会被迫服从此提示。 inline 说明符的主要用途是避免违反 One Definition Rule .

一旦你声明了一个函数inline,它需要在它使用的每个翻译单元中定义,并且每次定义都必须完全相同。这与您的标题所暗示的相反 - 选择定义函数的位置决定是否需要将其标记为 inline

1) 和 2) 没问题。在第一种情况下,它是隐式的 inline ,而在第二种情况下,您明确声明了它。无论您在何处包含 header ,定义都是相同的。

情况 3) 仅当您将 X_impl.h 编译并链接为源文件时才有效。在那种情况下,将只有一个定义,inline 将是多余的。不过,这样编译器就看不到其他翻译单元中的定义,这使得它无法内联函数,无论它是否是 inline

如果 X_impl.h 的目的是减少标题的视觉尺寸,那么你应该反过来做,将它包含在 X.h 的末尾>。 inline 必须留在那种情况下。

关于c++ - 定义内联函数的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18202324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com