1、构造函数写法优化

设计一个类3步: 1、数据一定要放到private里 2、数据传递和返回值尽量使用引用,并审查是否需要加const 3、在类中的函数需要加const的需要

变量数值设定有两阶段: 1、初始化(初始列) 2、赋值(在大括号里面赋值)

C++侯捷_构造函数

在这里插入图片描述

2、new、delete的执行过程

C++侯捷_Test_02

在这里插入图片描述

C++侯捷_Test_03

在这里插入图片描述

3、内存分配和回收

红色部分用来记录,开辟内存数,因为开辟内存必须要是16的倍数,所以最后3位都是0,所以利用最后一位来做记录1是给出,0是销毁

C++侯捷_Test_04

在这里插入图片描述

创建数组和效果数组

C++侯捷_插入图片_05

在这里插入图片描述

array new一定要搭配array delete使用,如果不搭配,会造成析构函数只会被调用一次,导致类中内存泄漏

C++侯捷_插入图片_06

在这里插入图片描述

4、static使用

可以给类中函数和成员变量前面添加static关键字,让他们变成静态的,他不属于对象,而是属于类本身,静态函数只能处理静态的数据,不能处理其他数据

C++侯捷_Test_07

在这里插入图片描述

C++侯捷_插入图片_08

在这里插入图片描述

模版操作

C++侯捷_插入图片_09

在这里插入图片描述

当一个构造函数被声明为explicit时,它禁止了隐式转换的发生。这意味着在使用该构造函数进行对象的初始化时,必须显式地调用构造函数。

class MyClass{
public:
explicit MyClass(int value) {...}
};

MyClass obj1 =42;// 错误,不能使用隐式转换
MyClass obj2(42);// 正确,使用显式构造
MyClass obj3 =MyClass(42);  // 正确,显式构造并复制给 obj3

5、组合与继承

类中包含另外一个类的对象:

构造和析构的顺序,编译器调用的是默认的构造函数,如果满足不了,则需要自己在初始化列表中写需要调用的构造函数

C++侯捷_插入图片_10

在这里插入图片描述

类中包含另外一个类的对象指针: 这种写法也是非常流行,左边是对外提供的接口,右边是类的具体实现功能,左边类通过类指针去访问具体功能。

C++侯捷_插入图片_11

在这里插入图片描述

继承:

C++侯捷_构造函数_12

在这里插入图片描述

6、虚函数

在父类中写出程序大致框架,不能实现的部分设置为虚函数,子类去重写这个虚函数

C++侯捷_Test_13

在这里插入图片描述

class Test
{
public:
virtual void seri() =0;
void opentest()
    {
        cout<<"进入opentest"<<endl;
seri();
}
};

classTest_b:publicTest
{
virtual void seri()
    {
        cout<<"进入seri"<<endl;
}
};

Test_b b;
 b.opentest();

Prototype 模式也正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建

7、const

当成员函数的const和non-const版本同时存在,const object只会调用const版本,反之,non-const只会调用non-const版本

C++侯捷_Test_14

在这里插入图片描述

8、虚指针和虚表

C++侯捷_Test_15

在这里插入图片描述