我是一位JAVA开发者,正在尝试学习C ++,但我不太清楚标准函数声明的最佳实践。
在类中:
class Clazz
{
public:
void Fun1()
{
//do something
}
}
或者在外面:
class Clazz
{
public:
void Fun1();
}
Clazz::Fun1(){
// Do something
}
我有一种感觉第二个可能不太易读...将函数定义放在类外会更好,这样您的代码就可以保持安全性(如果需要)。头文件应该只给出声明。
假设有人想使用您的代码,您可以只给他类的.h文件和.obj文件(编译后获得)。他不需要使用您的代码的.cpp文件。
这样,您的实现对其他人就不可见了。
“内部类”方法(I)与“外部类”方法(O)相同。
但是,当一个类只在一个文件中使用(在.cpp文件内部)时,可以使用(I)。当类在头文件中时,应使用(O)。cpp文件总是被编译的。当您使用#include“header.h”时,头文件会被编译。
如果您在头文件中使用(I),则每次包括#include“header.h”时都会声明函数(Fun1)。这可能会导致重复声明相同的函数。这更难编译,甚至可能导致错误。
正确使用示例:
文件1:“Clazz.h”
//This file sets up the class with a prototype body.
class Clazz
{
public:
void Fun1();//This is a Fun1 Prototype.
};
文件2: "Clazz.cpp"
#include "Clazz.h"
//this file gives Fun1() (prototyped in the header) a body once.
void Clazz::Fun1()
{
//Do stuff...
}
文件3:"UseClazz.cpp"
#include "Clazz.h"
//This file uses Fun1() but does not care where Fun1 was given a body.
class MyClazz;
MyClazz.Fun1();//This does Fun1, as prototyped in the header.
文件4:"AlsoUseClazz.cpp"
#include "Clazz.h"
//This file uses Fun1() but does not care where Fun1 was given a body.
class MyClazz2;
MyClazz2.Fun1();//This does Fun1, as prototyped in the header.
文件5: "DoNotUseClazzHeader.cpp"
//here we do not include Clazz.h. So this is another scope.
class Clazz
{
public:
void Fun1()
{
//Do something else...
}
};
class MyClazz; //this is a totally different thing.
MyClazz.Fun1(); //this does something else.
Clazz MyClazz
和 Clazz MyClazz2
吗? - Chupo_cro成员函数可以在类定义内部或使用作用域解析运算符 :: 单独定义。在类定义内部定义成员函数声明该函数为内联函数,即使您不使用 inline 说明符也是如此。因此,您可以按以下方式定义 Volume() 函数:
class Box
{
public:
double length;
double breadth;
double height;
double getVolume(void)
{
return length * breadth * height;
}
};
double Box::getVolume(void)
{
return length * breadth * height;
}
这里需要注意的是,在::运算符之前,您需要使用类名。成员函数将使用点运算符(.)在对象上调用,它将只操纵与该对象相关的数据,如下所示:
Box myBox;
myBox.getVolume();
第一个函数必须放在头文件中(类声明所在的位置)。第二个可以放在任何地方,无论是头文件还是通常情况下是源代码文件。在实践中,您可以将小型函数放在类声明中(这样会隐式地将它们声明为内联函数,但最终是否将其内联取决于编译器)。然而,大多数函数在头文件中声明,在cpp文件中实现,就像您第二个示例中所示。不过,我看不出为什么这样做会导致可读性降低。更不用说您实际上可以将类型的实现分散到几个cpp文件中。
在类内定义的函数默认被视为内联函数。以下是定义函数外部的一个简单原因:
类的构造函数检查虚函数并初始化虚指针以指向正确的虚函数表,调用基类构造函数并初始化当前类的变量,因此它实际上执行了一些工作。
内联函数用于函数不太复杂且避免函数调用开销。(开销包括硬件级别上的跳转和分支。)正如上面所述,构造函数不像内联函数那么简单。
.cpp
文件中定义。 - Cody Grayinline
只是放宽了一个定义规则,如果另一个翻译单元使用Clazz
,这是必要的。 - Caleth