第七章 类

C++11

7.1 定义抽象数据类型

7.1.2 定义改进的sale_data类

  • 类内的函数是隐式的inline函数

(1)this

  • 成员函数中对类的成员的访问是通过隐式的this指针实现的,该指针指向调用函数的类对象
  • 因为this指向的对象不可改,所以this是常量指针

(2) const

  • this是常量指针,但是指向非常量,因此,如果对象是常量,则无法使用this指针来访问类内的成员,相应的函数就无法使用
  • 为此,引入const放在参数列表后面,隐式地表示将this指针定义为指向常量的常量指针;相应的成员函数是常量成员函数
  • 显然,常量成员函数不能修改成员,只能访问
  • 自然的,常量对象及其引用、指针都只能使用常量成员函数

(3) 类作用域

  • 类是一个作用域,但是编译器先编译成员变量,再编译函数,所以变量不需要在函数之前定义

(4) 返回对象

className& className::func(...)
{
  //...
  return *this;
}

7.1.3 定义类相关的非成员函数

  • 对于作为类接口的非成员函数,应当与类的声明放在同一个头文件中,这样只需要包含头文件就可以使用非常原函数。

7.1.4 构造函数

  • 构造函数不能被声明为const,常量对象只有在构造函数完成后才会变成常量。
  • 没有参数的构造函数是默认构造函数,由编译器生成的默认构造函数称为合成的默认构造函数:如果存在类内初始值,则用它来初始化,否则默认初始化
  • 尽量自己实现构造函数:
    • 如果实现了构造函数,则编译器不会再自动实现默认构造函数
    • 内置类型或复合类型,比如数组与指针,不期待未定义的值
    • 如果成员是类,且需要非默认的构造,那么就无法默认构造
  • =default可以用于说明这是一个默认构造函数,可以放在声明或者定义中
classname()=default;
  • 构造函数初始值列表:当某个成员没有被初始化,会执行默认初始化

7.1.5 拷贝 赋值 析构

  • 编译器可以自动合成
  • 当涉及到类外的资源时,也许不能使用合成的操作
  • 但是使用vector或string来管理动态空间,可以使用合成的操作

7.2 访问控制与封装

(1) 访问说明符

  • private public
  • struct与class除了访问说明符之外没有区别,struct在没有说明符时是public,而class是private

(2)友元

  • 友元声明可以让非成员函数访问类的private成员
  • 友元声明放在类的内部,对位置没有要求,不受访问说明符影响,一般放在开始或者结尾
  • 友元声明不等同于一般的声明,一次如果想要类的成员函数能够调用友元函数,应该在类外额外声明。

7.3 类的其他特性

7.4 构造函数再探

7.5 类的静态成员

posted @ 2023-05-10 23:52  ETHERovo  阅读(13)  评论(0编辑  收藏  举报