学习C ++并看到如下所示的课程:
class CRectangle {
int x, y;
public:
void set_values (int,int);
int area () {return (x*y);}
};
void CRectangle::set_values (int a, int b) {
x = a;
y = b;
}
我知道Java中的Java和方法(函数)是在类中编写的。该类看起来像Java接口。我知道我可以写这样的课:
class CRectangle {
int x, y;
public:
void set_values (int a, int b) {
x = a;
y = b;
};
int area () {return (x*y);}
};
但是有区别还是标准?
答案 0 :(得分:8)
有区别。在类定义中写入函数的定义时(情况2),则认为函数已声明为inline
。这是标准的C ++。
用法,是在类定义中,在头文件(.h)中声明成员函数(Java方法),并在C ++文件(.cpp,.cc或.C中)中定义这些成员函数。 ...)这减少了编译时间,当您更改函数体时,只需要编译C ++文件,而如果更改头文件中的某些内容,则将编译包含此头文件的所有C ++文件。
答案 1 :(得分:5)
如果只在类定义中定义原型(属于头文件)并在cpp文件中实现方法,那就更清晰了。
当你有非常小的类时,在类定义中做所有事情可能听起来更容易,因为一切都在同一个地方,但是一旦你的类增长,任何使用它的开发人员都会讨厌你,因为他会在方法之间有你的代码他可能会看一些原型来找出一些东西(不是每个人都使用IDE来显示所有可用的方法!)。
但是,有一个例外:模板类方法需要在标头中实现,因为它们需要针对模板的每个特化进行编译。
答案 2 :(得分:4)
通常的方法是将函数的实现放在一个单独的cpp文件中,该文件不包含在其他文件中,只是编译。这样就可以更轻松地管理依赖项。
如果在类定义中给出了函数的实现(如第二个例子中所示),这是编译器内联该函数的提示(它最终可能会或可能不会执行,具体取决于例如功能的内部)。根据经验,长于几行代码的函数体最好放入cpp文件中,因为它们可能没有内联,但是这些可能包含额外的依赖性并使类定义混乱。
例外是模板函数,其中正文也需要在标题中,因为编译器必须看到它们才能实例化模板。
答案 3 :(得分:1)
我相信如果方法体在类定义中,那么它被内联到它被调用。
答案 4 :(得分:1)
在C ++中,类中定义的成员函数是隐式inline
,在类外定义的成员函数不是。
这会影响两个示例的链接 - 如果第一个示例在多个源文件中为#included
,则链接器会抱怨多个定义,而第二个示例则不会。
就标准/正常而言:
答案 5 :(得分:1)
在类中定义的函数自动inline
略有不同。后一个定义可以放在一个单独的文件中。否则没有区别也没有偏好。
请注意,我们通常不会在函数定义之后写分号(尽管它们在类定义中是允许的)。
void set_values (int a, int b) {
x = a;
y = b;
} // no semicolon here