将成员函数的定义放在类定义内的两个作用:
1. 内联函数:将成员函数的定义放在类定义内,可以将其声明为内联函数。内联函数在编译器生成代码时,会将函数体的代码直接嵌入到调用者的代码中,而不是生成真正的函数调用。对于一些工作量较小且频繁调用的函数,使用内联方式可以提升性能。
例如:
class MyClass {
public:
inline void print() {
// 函数体的代码
}
};
在上述代码中,print()函数被声明为内联函数,编译器会将print()函数的代码嵌入到调用者的代码中,而不是生成函数调用。
2. 减少重新编译的需要:如果类的成员函数定义放在类声明之外,那么只有在类接口改变时才需要重新编译使用该类的程序。而如果成员函数定义放在类定义内,那么当修改内联函数的函数体时,所有使用该类的程序都需要重新编译。
例如:
class MyClass {
public:
void print(); // 函数声明
};
void MyClass::print() {
// 函数体的代码
}
如果修改了print()函数的函数体,所有使用MyClass类的程序都需要重新编译。基于以上原则,一般而言,我们不会将成员函数体放在类声明内。较长的函数体无法获得内联带来的性能提升,并且还会降低类声明的可读性。通常只有在需要明确从内联中获得性能提升的小函数才会将其定义放在类声明内。
例如,对于一个简单的计算器类,我们可以将一些简单的操作函数定义为内联函数:
class Calculator {
public:
inline int add(int a, int b) {
return a + b;
}
inline int subtract(int a, int b) {
return a - b;
}
};
在上述代码中,add()和subtract()函数被定义为内联函数,它们的函数体代码会被嵌入到调用者的代码中。由于这两个函数的工作量很小,且可能频繁调用,使用内联方式可以提升性能。
内联函数写法的好处有:
1. 方便阅读:将成员函数的定义放在类定义内,使得读者可以更方便地理解和查看类的成员函数实现,而不需要去其他地方寻找。
2. 封装性:将成员函数定义放在类定义内,可以更好地实现类的封装性。类的数据成员可以直接在成员函数中访问和操作,不需要添加额外的访问权限修饰符。
3. 内联函数:将成员函数的定义放在类定义内,可以自动将其视为内联函数。这有助于提高程序的性能。
需要注意的是,在将成员函数的定义放在类定义内时,需要注意类定义后面要有分号`;`来结束类的定义。