普通成员函数调用方式
普通成员函数是类的成员函数,可以访问类的成员变量和其他成员函数。通常通过对象实例来调用。
1.定义和调用普通成员函数
普通成员函数的定义相对简单,通常在类中声明并实现。下面是一个基本示例:
class MyClass {
public:
void myFunction() {
std::cout << "普通成员函数被调用" << std::endl;
}
};
int main() {
MyClass obj;
obj.myFunction(); // 通过对象实例调用成员函数
return 0;
}
在这个例子中,我们定义了一个名为 myFunction 的普通成员函数,并通过对象 obj 调用它。
2. 通过指针调用成员函数
除了通过对象实例,我们还可以通过指针来调用成员函数。这在动态内存管理和多态性中尤为重要。
class MyClass {
public:
void myFunction() {
std::cout << "通过指针调用的成员函数" << std::endl;
}
};
int main() {
MyClass obj;
MyClass* ptr = &obj;
ptr->myFunction(); // 通过指针调用成员函数
return 0;
}
在这个例子中,我们定义了一个指向 MyClass 对象的指针 ptr,并使用箭头运算符 -> 调用成员函数。
3. 通过引用调用成员函数
通过引用调用成员函数与通过对象实例调用非常相似,但引用提供了一种更灵活的方式,尤其在传递大型对象时,可以避免不必要的复制。
class MyClass {
public:
void myFunction() {
std::cout << "通过引用调用的成员函数" << std::endl;
}
};
int main() {
MyClass obj;
MyClass& ref = obj;
ref.myFunction(); // 通过引用调用成员函数
return 0;
}
在此示例中,我们创建了一个对 obj 的引用 ref,并通过该引用调用成员函数。
4. 通过指向成员函数的指针调用
C++允许我们使用指向成员函数的指针,这在需要动态选择成员函数时非常有用。
class MyClass {
public:
void myFunction() {
std::cout << "通过指向成员函数的指针调用的成员函数" << std::endl;
}
};
int main() {
MyClass obj;
void (MyClass::*funcPtr)() = &MyClass::myFunction;
(obj.*funcPtr)(); // 通过指向成员函数的指针调用
return 0;
}
在这个例子中,我们定义了一个指向 myFunction 的指针 funcPtr,并通过 obj 调用该成员函数。
5. 调用成员函数的本质
调用成员函数最终的感觉相当于调用了一个全局函数,只不过这个全局函数隐式地接受一个指向对象实例的指针作为第一个参数。实际上,编译器内部会将对成员函数的调用转换成对全局函数的调用。
例如,成员函数在编译时会被转换为类似于以下形式的全局函数:
void myFunction(MyClass* this) {
// 函数体
}
因此,当我们调用 obj.myFunction() 时,实际上是调用了 myFunction(&obj)。这种机制使得成员函数能够访问类的私有成员和其他成员函数。
总结
- 普通成员函数可以通过对象实例、指针、引用和指向成员函数的指针调用。
- 调用成员函数的本质是将其转换为对全局函数的调用,隐式传递对象实例的指针。