构造函数
是什么
主要用来在创建对象时初始化对象即为对象成员变量赋初始值。(为方便后来继承、封装等操作)
语法
- 函数名和类名相同
- 没有返回值类型,和返回值
- 满足重载条件可以重载
#include<iostream>
using namespace std;
class Mark
{
public:
//调用了一个无参的构造函数
Mark()
{
name = 0;
cout << "调用了一个无参的构造函数" << endl;
}
//调用了一个含参的构造函数
Mark(int n)
{
num = n;
cout << "调用了一个含参的构造函数" << endl;
}
int num, name;
};
int main()
{
Mark obj_1;
Mark obj_2(1);
return 0;
}
调用的时机
- 创建对象是系统自动调用,不需要也不能自己调用
- 通过控制实参,可以控制调用的构造函数的重载
构造函数的特点
- 如果一个类中没有显示的给出构造函数,系统会自动地给出一个隐式的构造函数。(创建对象,必须调用构造函数)
- 如果类中有多个构造函数,那么通常会有不同的函数体。
- 如果用户提供了构造函数,那么系统就不再提供默认构造。
- 类中如果只有有参构造,没有无参构造, 那么就不能调用默认构造的方式初始化对象, 想用这种方式初始化对象那么就提供无参构造。
成员初始化列表
- 初始化列表也是给类中数据成员初值的一种方式。
- 某些情况下,数据成员必须初始化而不能在构造函数中直接赋值。(比如:const int)
- 初始化必须使用成员初始化列表(特殊要求)
语法要求
- 不能用于除构造函数之外的其他成员函数。
- 位于形参表的右括号之后、函数体左括号之前。
- 成员初始经列表由逗号分隔的初始化列表组成(前面带冒号)。
- 必须用这种格式来初始化非静态const数据成员。
- 必须用这种格式来初始化引用数据成员。
代码格式
Mark::Mark(int n)
:num(n)
{
//...
}
(特别注意:初始化工作是在对象创建是完成的,未执行任何代码。)
析构函数
什么是析构函数
- 特殊的成员函数
- 对象生命周期结束时系统自动调用(不需要自己主动释放了)
析构函数的定义
语法要求
- 函数名:~类名
- 没有返回值类型和返回值
- 不允许重载
代码格式
class Mark
{
public:
~Mark()//析构函数无形参表
{
//...
}
}
调用时机
- 析构函数可以通过对象调用(必须是公有属性)
- 在对象生命结束时,系统会主动调用析构函数
1. 对于全局对象,程序一开始,其构造函数就先被执行(比程序进入点更早);程序即将结束前其析构函数将被执行。
2. 对于局部对象,当对象诞生时,其构造函数被执行;当程序流程将离开该对象的声明周期时,其析构函数被执行。
3. 对于静态(static)对象,当对象诞生时其构造函数被执行;当程序将结束时其析构函数才被执行,但比全局对象的析构函数早一步执行。
4. 对于以new方式产生出来的局部对象,当对象诞生时其构造函数被执行,析构函数则在对象被delete时执行。时执行
析构函数的特点
- 对对象做一些清理工作(对象生命结束,触发析构函数的执行)
- 一个类只有一个析构函数
- 如果没有析构函数,系统给出默认析构函数(类似于构造函数)
this 指针
什么是this指针
- 系统自动生成且隐藏,看不到定义,但是可以使用
- this指针不是对象本身的一部分,它的作用域在类的内部
- 当类的普通函数在访问类的普通成员的时候,this指针总是指向调用者对象
使用this指针
- 必须在类中使用,在类外不能使用
- this->成员名;或(*this).成员名
- return this或return *this
注意事项
- 一般情况下,可以省略this指针
- 在类中,函数的形参,与类中成员同名,不能省略``
class Mark
{
public:
void fun(int val);
int val;
}
void Mark::fun(int val)
{
this->val=val;//类中成员与形参名相同
}
作业
用类写一个顺序表,即顺序表类,将之前的结构和函数封装到一个类中。
- 初级:初始化函数,输出函数,插入函数。
- 中级:增删改查
- 高级:排序