*this | const成员函数 | 构造函数 | 初始值列表 | friend | 委托构造 | 类类型转换 | 类的static

类声明定义

  1. 类声明class a; (仅声明不定义)
  2. 类定义class a{};
  3. 访问:类有自己的作用域,所以访问类的成员需要:类对象(.)运算符
  4. 定义:通过::作用域说明符指名函数属于哪个类
  5. 初始化成员数据:必须使用= 或 {}的形式
  6. 类对象:类名 + 变量名 等价为-》class / struct 类名 + 变量名

成员函数

  1. 成员函数声明必须在类的内部,定义可以在类内部或外部

非成员函数

  1. 声明和定义都在类的外部,某些和类相关的函数,尽量声明在同一个头文件

this指针 & 返回*this

  1. 成员函数可以直接使用成员数据,而不用通过类对象(.)
  2. 因为在被调用时,隐式的初始化*this形参,为调用函数的对象地址(即类对象)
  3. 当使用成员数据时隐式的通过this->……访问
  4. 虽然this指针是隐式的,但仍可以通过this显示使用
  5. this*是常量指针(顶层const),不允许改变this保存的地址
  6. return * this;对this解引用,返回成员函数调用者

const成员函数

  1. const应位于紧随参数列表后面
  2. 对于const成员函数的定义也需要指定const
  3. 隐式修改this的类型为 const * const this不允许改变this保存的地址,和this指向的值
  4. 这样做我们就可以在成员函数使用const的成员数据,this->const……,否则const无法转为非const

构造函数

  1. 类的成员函数由构造函数初始化,
  2. 没有返回类型,有可选的形参列表和函数体
  3. 支持重载,但不能声明为const
  4. 默认构造函数:不接受任何实参,仅当我们没有显示定义时,编译器才会自动创建,否则将不会创建默认构造
  5. 但我们可以通过 = default;生成默认构造函数,default在类内部,则默认构造为内联,在外部,为非内联
  6. 默认构造函数的初始化成员方式:
    1. 没有初始值,将默认初始化成员(复合类型是未定义的)
      1. 内置类型的非静态成员在没有显式初始化时,它们的值是未定义的,
      2. 对于指针或引用,其值是未定义的
      3. 对数组而言,其成员将会根据其内部类型进行初始化。
      4. 对结构体而言,结构体的每个成员会依赖于其类型的默认初始化规则
      5. 如果类类型的成员是其他类的对象,这些对象会调用它们的默认构造函数进行初始化。
      6. 静态成员数据需要在类外进行定义和初始化。
    2. 有初始值,会用初始值初始化成员
  7. 有时不能依赖默认构造函数:
    1. 当我们定义自己的默认构造,其余未被初始值列表初始化的,也都会执行默认初始化,显然更有灵活性
    2. 类中有内置类型 | 复合类型(& | *) | const ,可以类内初始化,或者定义自己的构造函数
    3. 当类中包含其他类成员,该成员没有默认构造函数,则类无法定义默认构造函数,必须自己定义构造函数

初始值列表

  1. :后{}前的初始值列表,为成员数据初始值,其中用逗号分隔:成员(初始值),成员(初始值),……
  2. 初始值和赋值:只有成员初始化列表为成员数据初始化,对于函数体内的为赋值,因为在函数体执行前,如果有未显示初始化的,会以默认构造相同的方式隐式初始化
  3. 成员初始化顺序:和类定义中的顺序一致,而非初始值列表的顺序初始化

访问说明符

  1. public:可以被类的任何外部代码访问。通常用于定义接口或需要对外部代码开放的成员。
  2. private:只能被类的成员函数和友元函数访问,不能被派生类的成员访问,也不能被类的外部代码访问。通常用于将类的内部实现细节隐藏起来,确保数据的封装性和安全性。
  3. protected受保护的成员只能被类的成员函数和友元函数访问,以及其派生类的成员访问,但不能被类的外部代码访问。

class与struct

  1. 都是声明类的关键字,对于定义在第一个访问说明符之前的成员,class默认为private,而struct默认为public

友元类 | 函数 & 内联 & 可变数据成员 & 默认实参

  1. 如果想要其他非成员的类或函数,访问private | protected成员,需要在类内声明为friend + 声明的友元类 | 函数
  2. 出现的位置不限,并且不受访问说明符的约束,因为友元仅仅指明了访问权限(非函数声明)
  3. 定义在类的内部的成员是自动inline的
  4. 有时我们希望修改const成员函数的数据成员,需要在变量声明前加上mutable关键字,可变数据成员永远不会是const,因此可以改变成员的值
  5. 成员数据不能作为默认实参

委托构造

  1. 使用其他的构造函数执行自己的初始化,
  2. 成员初始化列表只有委托本身,参数列表必须和委托的构造匹配
  3. 执行顺序:先执行被委托的初始化列表和函数体,然后是委托者的函数体

类类型转换

  1. 转换构造函数:当构造函数只有一个实参,这个实参的类型可以转换为类类型
  2. 仅允许一步隐式转换,不允许需要多次隐式转换的,所以要配合显示转换使用
  3. 本质:通过转换实际是创建了临时的类对象
  4. explicit构造函数声明:表示仅允许显示转换,不允许隐式转换

类的static成员

  1. 将成员声明为static,被访问说明符影响,可以为任何成员类型,静态成员函数不能为const
  2. 作用域:为整个程序,生命周期:整个程序,并且与类直接相关,不属于任何类对象
  3. 静态成员不包含this指针,所以不能直接使用类成员
  4. 作用:发生改变时,可以通知所有类对象,并且不受任何一个类对象影响
  5. 访问:因为不属于任何类对象,访问可以直接使用::访问,不用创建类对象
  6. 定义成员函数:可以在内部或外部,static不能重复,且只能在内部,也就是声明时
  7. 定义静态成员数据:一般情况在类的外部定义:需要加::作用域访问符,
  8. 从类名开始作用域都在类作用域内,所以,这条指令可以直接使用其他成员
  9. 类内初始化静态成员数据:可以为contexpr的静态成员提供const的类内初始值,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值