即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

编程深度总结(六)C++类机制的实现

编程语言 any0ne 11℃ 0评论
本文目录
[隐藏]

1.前言

本文主要是我关于学习C++类机制实现的笔记,所以写的可能没有条理,还可能会有错误的结论,希望大佬能指出...

一、空类的大小为1

class A {};//sizeof(A)=1

解释:

编译器在A中插进去的一个char ,使得class A的不同实体(object)在内存中配置独一无二的地址。这个char是用来标识类的不同对象。


也就是说,当类的原本大小为0时,实例化时,无法分配大小为0的内存,同时也要使不同的实例地址不同,所以编译器给类A加了一个成员,这样就能正常分配空间了。当类原本大小不为0,就不会加入这个char。

二、类的一般布局

class A
{
public:
    int a = 1;//成员
    A() {};//构造函数
    ~A() {};//析构函数
    void F0() {};//普通成员函数
    virtual void F1() {};//虚函数
    virtual void F2()=0;//纯虚函数
    static void F4(){};//静态函数
private:
    int b = 0;
};

1.声明了一个数据结构,类中的非静态数据成员、代码中看不到但如果有虚函数就会生成的虚表入口地址指针等。

2.声明并定义了一堆函数,它们第一个参数都是一个指向这个数据结构的指针。这些实际上就是类中那些非静态成员函数(包括虚函数),它们虽然在类声明中是写在类的一对大括号内部,但实际上没有任何东西被加到前面第1条中所说的内部数据结构中。实际上,这样的声明只是为这些函数增加了两个属性:函数名标识符的作用域被限制在类中;函数第一个参数是this,被省略不写了。

3.声明并定义了另一堆函数,它们看上去就是一些普通函数,与这个类几乎没有关系。这些实际上就是类中那些静态函数,它们也是一样,不会在第1条中所说的内部数据结构中增加什么东西,只是函数名标识符的作用域被限制在类中。

4.声明并定义了一堆全局变量。这些实际上就是类中那些静态数据成员。

5.声明并定义了一个全局变量,此全局变量是一个函数指针数组,用来保存此类中所有的虚函数的入口地址。当然,这个全局变量生成的前提是这个类有虚函数。

总结:

  • 类成员,有2部分,一部分是程序员定义的成员,一部分是一个指针,指向虚函数表首地址(假如类中有虚函数),虚函数表指针是对象的第一个成员。
  • 类函数,无论什么函数,实际上是在参数列表中,默认第一个隐含参数为指向该类的实例对象的的指针。
  • 访问控制,实际上类成员变量与类成员函数与普通的变量函数,拥有不同的访问控制域,即类的访问控制域。
  • 虚函数表,实际上就是一个函数指针数组,每个虚函数指针指向的函数,即为该函数的实现,纯虚函数指向的是NULL;

转载请注明:CodingBlog » 编程深度总结(六)C++类机制的实现

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情