C ++ 对象模型学习记录(4) function 语义学 (未完待续)
1. C++中支持 3中成员函数: static ,非static,和 virtual 函数,两种数据成员,static和非static的
2. member的各种调用方式
非static成员函数,在C++中,所有的非 static成员函数都被转化为一个全局的成员函数,并隐式的传给了一个class 的对象的指针,而且选择成员函数的效率与全局函数的效率相同,没有任何负担
虚成员函数的调用, 将会被转化为 一个指针指向vptr,而vptr指向virtual 函数表
例如:如果是对
ptr->normalize(),normalize() 是一个 虚成员函数,将会在内部转化为 (*ptr->vptr[1])(ptr),
静态成员函数,如果normalize()是一个static member 函数,则:
obj.normalize()和 ptr->normalize()将会被转化为 一般的函数条用,因为static的存储在class object 之外, normal_Point3dsfv()
而由于static的修饰作用,使得它不能使用对象的指针:
(1) 不能够直接存取其class中的非static member ,在static的作用域范围内,要想访问非static的数据成员,就得使用this指针
#include <iostream>
using namespace std;
class A
{
public:
A(int a)
{
this->a = a;
}
static int f()
{
//error: invalid use of member 'A::a' in static member function
//return a;
}
private:
int a;
};
int main()
{
A a(4);
int i = a.f();
return 0;
}
其实使用成员函数也不行:
#include <iostream>
using namespace std;
class A
{
public:
A(int a)
{
this->a = a;
}
static int f()
{
//error: invalid use of member 'A::a' in static member function
//return a;
int i = this.g();
return i;
}
int g()
{
return a;
}
private:
int a;
};
int main()
{
A a(4);
int i = a.f();
return 0;
}
(2) 不能被声明为const,volatile,或者 virtual(需要用到this指针)
(3)不需要经过object 调用,可以使用class直接去调用
static 成员函数,可以成为 callback 回调函数
3. virtual 成员函数 ,考虑单继承,多继承和虚拟 继承的情况
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述