类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程技术。
- 对于类中的方法,this形参是一个隐式定义的。实际上,任何自定义名为this的参数或变量的行为都是非法的。且我们说this是指象本对象。
- 引入的const 函数。其引入的意义承上,以下例来说:一般情况,成员函数绑定的this指针并不是一个顶层const的指针,所以若我们定义使用一个顶层const的对象调用成员函数,必须没有合适的函数调用。所以引入成员const函数,其内的隐藏的this指针是一个s*const 。
struct s{ void func()const; }
- 默认构造函数的概念:当类不声明任何构造函数时,编译器才会自动地生成默认构造函数,默认构造函数无需任务参数。
- 编译器创建的构造函数,又称为合成的默认构造函数。
- =default 的意义:等价于默认的构造函数。此意味着类的成员变量中凡是内置类型,均可将按照其默认值初始化。此=default既可以在类的外部,也可以在类的外部,其区别是在外部不是内联的,在内部是内联的。
- 友元声明只能出现在类的内部。
- mutable 类型成员可以const成员函数中改变。
- 我们只能在一个常量对象上调用const成员,另一方面,虽然可 以在非常量对象上调用常量版本或非常量版本,但最好匹配一个非常量版本。还有一点需要注意的是,一个const成员函数,此时this将是一个指向const的指针而*this是const对象。const成员函数和非const成员可构成重载。
- 友元在类中的声明,仅表示在友元中可以可以使用类中的成员,并不代表其已声明。在使用前,应在使用其的最前方声明且
- 如果成员是const,引用,或者属于某种未提供默认构造函数的类类型,必须通过构造函数初值列表为这些成员提供实值。
#include <iostream> using namespace std; struct si{ int i; si(int j){ i=j; } }; struct s{ const int i; int k; int& j; si e; s():i(0),j(k),e(4),k(3){k=3;} }; int main() { s a; cout<<a.j; return 0; }
- 若 一个构造函数其所有参数提供了默认实参,则它实际上是一个默认构造函数。
- 委托构造函数,意即我们可以在一个构造函数的初始化列表中直接调用前面直接定义过的构造函数。但注意不能在列表中调用多个构造函数,只能调用一个。另关于合成默认构造函数,一定要考虑其中的成员是否可以有默认构造函数,若没有,则难以生成合成的构造函数。这也是说若需要自动由编译器生成合成的默认构造函数。其内的所有成员必须是含有默认构造的或内置类的。另一方面,也就是说,我们在定义类时,请确保所有成员初始化。
- 隐式类型转换,从构造函数的形参类型(单个)转为类类型,一般情况下,编译器会尽可能自动处理,但只能处理一步,多步则不然。若要关闭此种类型转换,可通过在函数前加explicit
struct s{ s(int i){} s(string a){} }; void f(s); f(1);//会调用f(s(1)) f("233");//调用出错,转换只能一步,可改为f(string("233"));
- 聚合类,所谓聚合类,便如老式C中的结构一般,全部是public成员,没有任务构造函数,没有类内初始值,没有基类,没有virtual函数。此类聚合函数可以通过{}直接赋初值。
- 字面值常量类,数据成员都必须是字面值类型,类必须至包含一个constexpr构造函数。如果一个数据成员类内初值,则内置类型成员的初始值必须是一条常量表达式或者如果成员属于某种类类型,则初始化必须使用成员自己的constexpr构造函数。类必须使用析构函数的默认定义。
- 类的静态成员。类的静态成员可以public或private 。静态数据成员的类型可以是常量,引用,指针,类类型。访问类的静态成员可以通过类访问,也可以通过对象访问 。类的内部静态成员函数可以在外也可以在内定义,但在外定义时,static不能出现。通常情况下,类的静态类型不在类的内部初始化(除非其为cosnt 或constexpr限定的)。
class t{ static const int a =30;//对于常量静态可以类内部,当然也可以内外部。若在外部,应该在调用其前初始化。const int t::a = 30; static constexpr char c ='c';//在gcc中好像不支持其外部初始化,最新版本未验证。 static int e;//对于非const类型,不可以在类内部初始化。 } int t::e =8;//在类外部初始化时必须指明其类型。
- 非静态成员不能作为成员函数的默认实参,因为它 的值本身属于对象的一部分。
- 静态数据成员的类型可以是其所属类的类型,指针有具有同样的用法,但普通成员却不能。
class c{ static c a; c* pa; //c d;错误 }
- 静态成员函数不含有this指针。不能调用返回它。