-
定义类:
- 首先你需要定义一个类,并在这个类中声明一些成员函数。
class MyClass { private: int value; // 私有成员变量 public: // 构造函数 MyClass(int v) : value(v) {} // 成员函数 void displayValue() const { std::cout << "The value is: " << value << std::endl; } }; -
创建对象:
- 使用类名加上括号来创建类的一个实例。如果构造函数需要参数,则需提供相应的参数。
MyClass myObject(10); // 创建MyClass的一个实例 -
通过点操作符调用成员函数:
- 使用
.操作符来访问对象的公共成员函数。如果成员函数是const的,则可以在常量对象上调用它。
myObject.displayValue(); // 调用myObject实例的displayValue方法 - 使用
-
内部机制:
- 当你通过对象调用成员函数时,C++编译器会生成一段代码,这段代码将对象的地址作为隐含的第一个参数传递给成员函数。这就是为什么成员函数通常会有一个隐式的
this指针。 this是一个指向当前对象的指针,允许成员函数访问该对象的数据成员和其他成员函数。- 在上面的例子中,虽然你在
displayValue函数定义中没有看到this指针,但实际上编译器会处理这个隐式参数。你可以显式地使用this指针,例如:std::cout << "The value is: " << this->value << std::endl;。
- 当你通过对象调用成员函数时,C++编译器会生成一段代码,这段代码将对象的地址作为隐含的第一个参数传递给成员函数。这就是为什么成员函数通常会有一个隐式的
-
虚函数和动态绑定:
- 如果类中有虚函数(virtual functions),那么当通过基类指针或引用调用这些函数时,将会发生动态绑定。这意味着实际调用哪个版本的函数是在运行时决定的。
class Base { public: virtual void foo() { std::cout << "Base::foo" << std::endl; } }; class Derived : public Base { public: void foo() override { std::cout << "Derived::foo" << std::endl; } }; Base* basePtr = new Derived(); basePtr->foo(); // 输出 "Derived::foo" delete basePtr;- 在这个例子中,尽管
basePtr是指向Base类型的指针,但由于foo被声明为虚函数,所以实际上调用了Derived类中的foo函数。
-
内存布局:
- 对象的内存布局通常包含其数据成员。如果有虚函数的话,对象还会包含一个指向虚函数表(vtable)的指针。vtable中存放了指向各个虚函数的指针,这使得多态成为可能。
c++中类的对象通过将this指针传递给类的成员函数来调用方法
于 2024-10-28 18:09:42 首次发布

715

被折叠的 条评论
为什么被折叠?



