C++回顾之类

  1. 定义在类内部的函数是隐式的inline函数。

  2. 常量成员函数:默认情况下隐式的this的类型是指向类类型非常量版本的常量指针,即自身是常量,但是指向的对象不是常量,为了使得this能绑定到一个常量对象(如const),则在函数后面加上const。但是这样子就不可以改变调用它的对象的数据成员。

    
    #include <iostream>
    
    using namespace std;
    class Text {
    public:
        int score = 10;//类内初始值。
        Text() {
            score = 100;
        }
        //必须声明为const,否则main函数没办法调用这个成员函数。
        int getScore() const {
            return score;
        }
    };
    int main() {
        const Text text;
        cout << text.getScore() << endl;
    }
  3. 编译器首先编译成员的声明,再编译成员函数体。所以无须在意顺序。

  4. 构造函数:用于初始化类对象的数据成员。构造函数不可以声明为const。

  5. 不显示提供构造函数,则按默认构造函数来初始化

    1. 如果有类内初始值,用它来初始化成员。
    2. 否则,默认初始化该成员。
  6. 只有类没有声明任何构造函数时,编译器才会自动生成默认构造函数。所以,如果一个类在某种情况下需要控制对象初始化,则需要控制所有情况。一般来说,对于一个类一定要定义自己的默认构造函数。

  7. 构造函数:

        Sales_data() = default; // C++11,编译器生成默认构造函数。
    
        //构造函数初始值列表,当某个成员不在初始化列表时,会执行默认构造函数(先看类内初始值,没有再默认初始化)
        Sales_data(const std:string & s):bookNo(s) { }
  8. C++的构造函数中是能够调用其他成员函数的。

    1. 构造函数也是成员函数;
    2. 当执行构造函数的时候,对象的数据成员的内存已经分配完成;
    3. 因此构造函数是能够调用其他函数的。
  9. 在在成员函数内调用构造函数, 都只能是产生一个无名对象,并不会对原有对象的成员值造成影响。若在构造函数内调用构造函数,除了是在初始化列表中,或是编译器自动合成的(父类的或类成员的)构造函数,也不会改变该对象的成员变量的值。因此在成员函数中不要调用构造函数。

  10. 友元:目的是让该类可以访问当前类的非公有成员。最好在类开始或结束前集中声明友元。

  11. 可以在类中自定义某种类型在类中的别名,这也存在访问限制,该成员必须先定义后使用。

  12. 内联函数inline可以在声明或定义处使用, 也可以同时使用,不过最好在定义处用。inline成员函数应该放在头文件中。

  13. 可变数据成员:mutable size_t access_ctr 加上了mutable之后,这个变量永远不会是const, 即使是const对象的成员也可改变,一个const成员函数也可以改变这个对象的值。

  14. 当我们提供一个类内初始值时,必须以符号=或花括号表示。

  15. 一个const成员函数如果以引用的方式返回*this,那么这个返回类型就是一个常量引用,则可能无法用来调用其他非const成员函数。

  16. 可以同时声明常量版本和非常量版本的成员函数,这时候会选择最佳匹配的。

  17. 类也可以先进行声明而不定义,这种声明叫做前向声明。声明之后定义之前是一个不完全类型。

  18. 类中的数据成员不能是这种类本身,但可以是指向这个类的指针或引用。

  19. 友元关系不具有传递性。可以让某个类或某个类的成员函数成为我这个类的友元。这个时候要注意类的声明和定义顺序。

  20. 要声明重载的多个函数为友元,则要分别独自声明。

  21. 友元声明和作用域:252页。友元函数可以在类里面定义,但在外面也同时还要声明。类里面定义的友元函数隐式内联。

  22. 不使用构造函数初始值列表,而是在构造函数体内赋值,则执行的是赋值操作而不是初始值操作。

  23. 如果成员是const,引用,或者某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表为这些成员提供初值。

  24. 成员的初始化顺序与类中定义顺序一一致,与构造函数初始值列表顺序无关。尽量避免用某些成员初始化其他成员。

  25. 构造函数也可以用默认参数的方法。

  26. 委托构造函数:当一个构造函数委托给另一个构造函数时,受委托的构造函数的初始值列表和函数体被依次执行。假如受委托的函数体包含有代码的话,将执行这些代码,然后控制权才会交还给委托者的函数体。

  27. 类类型转换和聚合类

  28. 静态成员函数不能使用const,函数体内也不能使用this指针。

  29. 静态成员是整个类共享的,可以通过作用域运算符::直接使用,也可以通过对象或指针来访问。成员函数可以直接使用静态成员。

  30. 在类的外部定义静态成员时,不可以重复static关键字。静态数据成员不是由构造函数初始化的。静态数据成员要在类外定义,并且通过::运算符即可直接访问到私有静态数据成员,同时也可以调用私有静态函数来定义私有静态数据成员(270页)。

  31. 静态数据成员的类内初始化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值