1.类与对象

创建一个Account的类,有两个属性,name和balance,有两个成员函数deposit与withdraw,之后初始化两个对象job_account与alice_account。

###当我们创建好这个对象后他就相当与一个类型,就跟int,double等,所以很多时候可以拿他当类型的用法去做,我们可以创建一个存放Account类型的数组,创建一个Account类型的vector,还可以创建一个指向Account类型的指针,还可以创建一个返回Account类型的一个函数。

2.访问类的属性

接上文,创建一个对象使用.的方法去访问类的属性和成员函数,也可以创建一个Account类型的指针,使用new函数在堆区创建一块内存,使用->的方法可以指向类的各个属性和成员函数从而访问。

3.构造函数和析构函数

构造函数是一种与必须类同名的函数,构造函数是对象的 “出生初始化器”,对象一被创建,它就会自动调用,完成对象的初始化工作。

析构函数是~类名的函数,析构函数的核心作用是 在对象生命周期结束时(被销毁前),清理对象占用的资源。

需要注意的是构造函数与析构函数的调用顺序,上图种先调用没有参数的构造函数,在调用string的构造函数,之后是调用双参数的构造函数,对于析构函数调用顺序与构造函数恰恰相反,注意如果我们没有定义析构函数,编译器会自动生成一个析构函数,析构函数没有参数,没有返回值,不能重载。

4.构造函数初始化列表

为了不让类中代码过多,可以在类中声明函数,在类外创建函数使用类::的方法来确定是哪个类的函数。

5.拷贝构造函数

拷贝构造函数的核心作用是 用一个已经存在的对象,“拷贝创建” 一个新的同类对象,本质是对新对象进行 “初始化”(而非赋值),对于在创建对象时,如果一些基本值始终都是一样的,就可以是使用拷贝函数,注意赋值的是const,使用的是引用传递,他是将对象作为参数传递给函数的。

6.浅拷贝和深拷贝

拷贝其实就是将已有的对象的属性值传给另一个对象,这就会造成一个问题,当已有的对象中有指针属性时,他会把指针的值传给新对象,也就是说对于指针指向的区域,有两个对象在指向他,

这会导致在进行析构时这块内存区域被释放了两次,会发生报错,因此浅拷贝会比较片面。对于类来说,没有创建拷贝函数,编译器会自动创建拷贝函数,但属于浅拷贝,如果类中有指针等其他复杂的属性,使用深拷贝比较稳妥,就是创建一块新的区域,避免两个对象指向一块区域的情况。

7.常对象和常函数

常对象声明对象时加上 const 修饰,该对象即为常对象。常对象的核心特性:其成员变量的值不能被修改(生命周期内保持 “常量” 状态)。

成员函数声明时,在参数列表后、函数体前加上 const 修饰,即为常函数。常函数的核心特性:函数体内不能修改对象的非静态成员变量(承诺 “只读”,不改变对象状态)。

成员函数的隐藏参数是 this 指针(指向当前对象),普通成员函数的 this 类型为 类名* const this(指针本身不可改,但指向的内容可改),常函数的 this 类型为 const 类名* const this(指针本身不可改,指向的内容也不可改)—— 这是常函数不能修改成员变量的根本原因。

8.static静态

//在属性或成员函数前添加static关键字,就可以将属性或成员函数定义为静态的

//静态的属性或成员函数,不依赖于对象,直接通过类名调用

//静态的属性或成员函数,只能调用静态的属性或成员函数,不能调用非静态的属性或成员函数

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐