类成员函数定义和作用域解析符
在 C++ 中,类成员函数 是指在类的内部声明并定义的函数,用于操作类的对象或访问类的成员变量。类成员函数可以在类的内部或外部定义。
成员函数定义的两种方式:
-
在类内部定义:
- 直接在类的声明中定义成员函数,这种函数通常是内联函数,编译器会将函数体直接嵌入调用的地方,以减少函数调用开销。
-
在类外部定义:
- 在类的声明之外定义成员函数,通常通过作用域解析符(
::
)来指定该成员函数属于哪个类。
- 在类的声明之外定义成员函数,通常通过作用域解析符(
示例:
1. 在类内部定义成员函数:
class Rectangle {
public:// 成员变量int width;int height;// 在类内部定义成员函数int area() {return width * height;}
};
在这个例子中,area()
函数是在类 Rectangle
的内部定义的,它返回矩形的面积。这样的定义方式适用于简单的函数。
2. 在类外部定义成员函数:
class Rectangle {
public:// 成员变量int width;int height;// 在类内部声明成员函数int area();
};// 在类外部定义成员函数
int Rectangle::area() {return width * height;
}
在这个例子中,area()
函数是在类 Rectangle
的外部定义的。在类的声明中,函数体没有写出,只有函数原型;而函数的具体实现通过 Rectangle::area()
形式定义在类的外部。Rectangle::
指定 area()
函数属于 Rectangle
类。
作用域解析符 (::
):
当在类外部定义成员函数时,需要使用作用域解析符 ::
,其作用是表明这个函数是属于哪个类的。例如,Rectangle::area()
表明 area()
是 Rectangle
类的成员函数。
成员函数的特性:
-
访问成员变量:
- 成员函数可以直接访问类的成员变量,而不需要通过对象调用。这是因为成员函数和成员变量属于同一个类的作用域。
class Rectangle { public:int width, height;int area() {return width * height; // 可以直接访问成员变量} };
-
常量成员函数:
- 在成员函数定义的末尾加上
const
,可以声明该函数为常量成员函数,表示该函数不会修改类的任何成员变量。
class Rectangle { public:int width, height;int area() const {return width * height; // 不修改成员变量的常量函数} };
- 在成员函数定义的末尾加上
-
静态成员函数:
- 静态成员函数使用
static
关键字声明,不依赖于类的实例。静态成员函数不能访问非静态成员变量。
class Rectangle { public:static int numberOfRectangles;static int getRectangleCount() {return numberOfRectangles; // 访问静态成员变量} };
- 静态成员函数使用
示例:完整的类成员函数定义
#include <iostream>
using namespace std;class Rectangle {
public:// 构造函数Rectangle(int w, int h) : width(w), height(h) {}// 成员函数声明int area() const; // 常量成员函数void resize(int w, int h);private:int width, height; // 私有成员变量
};// 在类外部定义成员函数
int Rectangle::area() const {return width * height; // 常量函数,不修改任何成员变量
}void Rectangle::resize(int w, int h) {width = w;height = h;
}int main() {Rectangle rect(10, 20); // 创建对象cout << "Area: " << rect.area() << endl; // 调用成员函数rect.resize(15, 25); // 调用成员函数cout << "Resized Area: " << rect.area() << endl;return 0;
}
总结:
- 类成员函数是属于类的函数,可以在类的内部或外部定义。
- 类内定义的成员函数通常会成为内联函数,适合简单的实现。
- 类外定义的成员函数通过作用域解析符(
::
)来表明函数属于哪个类。 - 成员函数可以访问类的成员变量,并且可以通过
const
和static
进行特殊修饰。