我们已经知道什么是成员函数,它们能做什么,如何定义成员函数 以及如何使用类对象 调用它们,现在让我们了解一些可以在 C++ 类中定义的特殊成员函数。以下是不同类型的成员函数:
这些是基本成员函数,它们没有任何特殊关键字如 static 等作为前缀,所有具有以下形式的成员函数都称为普通成员函数。
return_type functionName(parameter_list)
{
函数体;
}
static 是一个关键字,可以与 数据成员 以及成员函数一起使用,后面章节我们会深入学习staic关键字的用法,本节中我们仅学习其与成员函数的用法。
通过使用带 static
关键字前缀将函数设为静态,这些函数对整个类起作用,而不是对类的某个实例起作用。
可以使用对象和成员访问运算符.
来调用它,但是,使用类名和作用域解析运算符::
来单独调用静态成员函数才是比较常见的用法。
例如:
class X
{
public:
static void f()
{
// 语句块
}
};
int main()
{
X::f(); // 使用类名直接调用静态成员函数f()
}
这些函数不能访问普通的数据成员和成员函数,只能访问static
类型的静态数据成员和static
成员函数,否则编译器会报错。
它没有任何“this”关键字,这就是它无法访问普通成员的原因,后面我们将研究“this”关键字。
后面我们会详细学习Const关键字(Const Keyword)的用法,顾名思义,Const关键字使变量保持不变,也就是说一旦定义,它的值便无法更改。
当与成员函数一起使用时,此类成员函数永远不能修改对象或其相关数据成员。
// 常量成员函数
void fun() const
{
// 语句块
}
类中定义的所有成员函数默认声明为内联函数,我们将在下节中详细学习[内联函数]](http://www.yetaozi.cn/cpp/inline-functions)。
友元函数实际上不是类成员函数,它只是声明在类的内部,前面加上friend前缀,通过这样,你可以通过该函数访问你类内的私有或保护成员变量和函数. 你可以将全局函数声明为友元,也可以将其他类的成员函数声明为友元。
例如:
class WithFriend
{
int i;
public:
friend void fun(); // 声明一个全局友元函数
};
// 这里不带::修饰符,它不属于WidthFriend类
void fun()
{
WithFriend wf;
wf.i=10; // 在这个全局友元函数中,你可以调用类WidthFriend中的私有数据i
cout << wf.i;
}
int main()
{
fun(); // 在main函数中直接调用该友元函数fun()
}
因此,我们可以在友元函数中实例化类的对象来访问私有数据成员,同样地,我们也可以将其他类的函数设为友元函数,或者我们也可以将整个类设为友元类。
class Other
{
void fun();
};
class WithFriend
{
private:
int i;
public:
void getdata();
// 声明一个Other类的友元函数,在Other::fun()中我们可以访问WithFriend的私有数据
friend void Other::fun();
// 也可以将整个Other类声明为友元类,这样在整个Other类中可以随时访问WithFriend的私有数据
friend class Other;
};
当我们将一个类设为友元时,它的所有成员函数都会自动成为友元函数。
因为友元函数的特性,所以 C++ 不能被称为纯 面向对象 语言,因为它违反了封装的概念。