头文件和源文件分离
源文件--类内声明和类外实现 声明和实现分离
struct 结构的默认访问类型是public, 而类为private。 POD, Plain Old Data 只表示纯粹的数据对象
class public private
类作用域 class scope
成员变量
成员函数--函数-函数头和函数体-作用域解析运算符(::) 来标识函数所属的类;
成员函数可以访问成员变量
类外实现: 类外作用域解析运算符(::)
C++编译器会在调用 内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率
类内定义自动内联,类外定义可以设置未内联函数也可以不设置,设置的话需要加上inline
inline必须与函数定义放在一起
内联函数是使用inline关键字修饰的函数,
目的是让编译器在函数调用时,将函数体直接展开到调用处,而不是通过常规的函数调用机制。其设计初衷是为了减少函数调用的开销
内联仅仅是对编译器的建议,编译器可以根据实际情况决定是否展开内联函数
常规函数的调用会涉及到参数传递、栈帧的建立与销毁
分号
函数定义 使用大括号 {} 来定义函数体,不需要在函数定义的末尾添加分号
命名空间 定义是以大括号 {} 来包围命名空间的成员的,不需要分号
控制结构:在条件语句(如if、for、while、switch等)和循环语句(如for、while、do...while等)
写分号 (;)
表达式语句:包括赋值语句、函数调用、返回语句等
类定义和结构体的定义:类定义的末尾需要分号
类
设计目标:让使用类对象就像使用标准类型一样
具名和无名 隐式和显式--默认和自动
声明类变量
使用new为类对象分配存储空间
使用构造函数初始化类
类空间和对象空间--存储类变量和对象变量,共享一组成员函数
类的设计准则:数据隐藏;
数据部分的访问状态是私有的, 这意味着程序不能直接访问数据成员,
因此需要设计合适的成员函数, 才能成功地将对象初始化
为此, C++提供了一个特殊的成员函数——类构造函数, 专门用于构造新对象、 将值赋给它们的数据成员
因为在构造函数构造出对象之前, 对象是不存在的。 因此构造函数被用来创建对象
特殊的地方
构造函数的原型和函数头有一个有趣的特征——虽然没有返回值,但没有被声明为void类型
构造函数的参数表示的不是类成员, 而是赋给类成员的值。 因此, 参数名不能与类成员相同
析构函数
析构函数也可以没有返回值和声明类型。 与构造函数不同的是析构函数没有参数
显式调用构造函数 和隐式调用构造函数
隐式调用构造函数 === 显式调用构造函数:
隐式地调用默认构造函数时, 不要使用圆括号。
隐式地调用其他构造函数
ThreadPool pool(5); 等价于 ThreadPool pool = ThreadPool(5);
对象名称(具名和无名) 对象指针)
ThreadPool *datalf = new ThreadPool(5);
如果构造函数使用new来分配内存, 则析构函数将使用delete来释放这些内存
允许调用构造函数来创建一个临时对象, 然后将该临时对象复制到stock2中
stock1对象已经存在, 因此这条语句不是对stock1进行初始化, 而是将新值赋给它
this指针
调用成员函数的对象--》成员函数
多个对象的时候--类对象共享成员函数--对象进行比较-返回好的对象的成员函数
指向用来调用成员函数的对象(this被作为隐藏参数传递给方法) 调用它的对象的地址
整个调用对象 使用表达式*this。 调用对象的别名
对象的成员函数:每个成员函数(包括构造函数和析构函数) 都有一个this指针。 this指针指向调用对象
Stock::限定符转换为函数参数(指向Stock的指针) , 然后用这个指针来访问类成员。
单个对象和多个对象
独立对象变量
对象数组
初始化对象数组的方案是, 首先使用默认构造函数创建数组元素,
然后花括号中的构造函数将创建临时对象, 然后将临时对象的内容复制到相应的元素中。
因此, 要创建类对象数组, 则这个类必须有默认构造函数。