• C++中自己理解的一些细节哈


    对于大牛来说,我写的可能很低级哈,留给自己看,以后遇到的都慢慢补充哈!^^

    1.每一个类定义结束后,不要忘了在类的结束符"}"后面加上一个";"哦!

    2.构造函数和析构函数肯定是不能只申明而不定义的,因为这个两个函数无论如何都会被调用。其他成员函数倒是可以只申明而不定义---只要你不调用它!

    3.一个类会隐含的提供构造函数、构造函数、复制构造函数、赋值函数、析构函数!

    4.一个空类或结构体,但用sizeof去测它的大小时并不为空,而是为1!这是编辑器给它加的,试想如果不加一个字节那么A a[3];(A是一个空类),那a[0],a[1],a[2]岂不是都是同一个地址?可见0不仅在数学上要特殊考虑,在计算机中也要特殊考虑哦!

    5.如果你不在一个类成员前面加上public、private、protected的访问控制的描述,class里面默认是private,而struct里面是public哦!

    6.有non-virtual member function(无论是non-static还是static)的class不会改变class的大小哦,但是有virtual member function的class会增加一个指针字节的大小,这是因为有virtual member function的class要维持一个指向vtbl(virual table)表的指针,这与C++对象模型有关!

    7.类的non-static会使类增加相应的大小,而static则不。理由同6哦!

    8.6,7也许让你困惑,现在就来说说需要多少内存才能表现一个class object呢?一般而言有:

      a.其中nonstatic data members的总和大小。

      b.加上任何由于alignment的需求而填补上去的空间(可能存在于members之间,也可能存在于集合体边界---可以理解为边界补齐吧)。

      c.加上为了支持virtual而由内部产生的额外负担。

    9.无论是public还是private的静态成员变量只能在class里面定义,然后在类外面完成初始化(以上已在VC环境中,有的编译器可以在类中声明的时候就可以初始化了)。

    10.C++以下列方式支持多态

      a.经由一组隐含的转化操作,例如把一个derived class指针转化为一个指向其public base type的指针:shape *ps = new circle().

      b.经由 virtual function 机制:ps->rotate();

      c.经由dynamic_cast和typeid运算符:if( circle *pc = dynamic_cast< circle *>( ps )) ...

    11. 析构函数最好不要声明为纯虚函数。

    12. 静态成员函数不能被const virtual volatile关键字描述。静态成员函数不能对直接存取其 class 中的 非静态成员变量!

    13.一个指针,无论它指向什么类型,指针本身的大小都是固定的,一般是一个机器字!“指向不同类型之间的各个指针”间的差异,既不表现在其指针表示方法不同,也不在其内容(都是代表一个地址)不同,而是其所在寻址出来的 object 类型不同。也就是"指针类型"会教导编译器如何解释某个特定地址中的内存内容及其大小!

  • 相关阅读:
    好用的绘图工具推荐-processon
    前台获取到的后台json对象取值时undefined的解决方法
    axios怎么引用?
    postman发送post请求,后端无法接收到参数
    bcrypt加密算法
    mongoose创建model名字时,为什么集合名会自动加s?
    《遇见未知的自己》 张德芬
    《把时间当做朋友》笔记摘要
    精英与普通人的区别
    金刚经全文
  • 原文地址:https://www.cnblogs.com/zhuwbox/p/3415450.html
Copyright © 2020-2023  润新知