【C++】C++类和对象—(中)
注意:对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错!这就要使用初始化列表了,初始化列表后面介绍。代码语言:javascriptAI代码解释。
六个默认成员函数如下:

在这里插入图片描述
六个默认成员函数有三种,分别是执行初始化,拷贝,以及重载功能的函数。
- 执行初始化:构造函数,析构函数
- 执行拷贝:拷贝构造,赋值重载
- 取地址重载:两个重载函数 注意:这六个成员函数中比较重要的是前4个,后两个可以作为了解!
下面我们依次介绍这几个函数。
三,六个成员函数
3.1构造函数
构造函数的概念:构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的状态。通常与类名相同,无返回类型,支持重载。
3.2构造函数的种类和使用
在上面的构造函数中我们看到了几种构造函数的类型分别是:
- 默认构造函数:无参数,如果我们没有显式的写出来,编译器就会自动生成并进行默认初始化。
- 带参的构造函数:带参的构造函数又分为有缺省值和没有缺省值。注意全缺省的构造函数不能与无参的构造函数同时存在!因为这两个函数在调用时会引发冲突!
- 拷贝构造函数,参数是类名这个我们后面介绍。
代码语言:javascript
AI代码解释
class Date
{
public:
//默认构造函数与类名相同,无返回值,支持重载
//不带参数
Date()
{
_year = 1;
_month = 1;
_day = 1;
}
//Date(int year=1, int month=1, int day=1) 全缺省的构造函数
//一般的构造函数
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << this->_year << "/" << this->_month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};

在这里插入图片描述
什么都不写自动调用编译生成的默认构造,对成员变量进行默认初始化(值是随机值).
通过上面的代码我们能了解到构造函数的主要特点:
自动调用:不显式写构造函数的情况下,对象创建时由编译器隐式调用,无需手动触发。 无返回值:即使语法上不写 void,也不实际返回任何值。 支持重载:一个类可以定义多个参数列表不同的构造函数。
注意:对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错!这就要使用初始化列表了,初始化列表后面介绍。
代码语言:javascript
AI代码解释
class A
{
};
class Date
{
private:
int _year;
int _month;
int _day;
A a; //自定义类a 对于a的初始化就要去调用A这个类的默认构造!
}
四,析构函数
4.1析构函数的作用
析构函数与构造函数相反,构造函数是执行初始化功能的那么析构函数就是释放资源的。析构函数发挥作用的场景是在有资源需要释放的时候使用,如果像日期类没有资源就没有必要使用析构。当然编译器也会自动调用但不影响使用。
4.2析构函数的用法
析构函数相较于构造函数不同的是构造函数名与类名相同,而析构函数是
~类名()。 注意:若未显式定义析构函数,编译器会生成默认析构函数。 默认析构函数: 1. 对基本类型(如 int、float)无操作。 2. 对类成员调用其析构函数(按成员声明顺序逆序调用)。
代码语言:javascript
AI代码解释
class Date
{
public:
//构造函数
Date(int year = 1, int month = 1, int day = 1)
{
//在初始化之前先打印一下这个函数 这样便于我们直观的看到它在被调用
cout << "Date(int year = 1, int month = 1, int day = 1)" << endl;
_year = year;
_month = month;
_day = day;
}
//析构函数
~Date()
{
//在释放资源之前打印一下 方便直观看到被调用
cout << "~Date()" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
return 0;
}

在这里插入图片描述
通过上面的代码我们可以认识到析构函数:
- 析构函数跟构造函数类似,无参数,无返回值。
- 自动调用析构函数,一个类只有一个析构若为显式定义则调用编译器生成的析构。
- 在同一个局部域中含有多个对象那么后定义的对象会先析构!
在上面的代码中我们看到析构函数并没有做什么事只是单纯的在函数内部打印方便我们直观看到调用,那这不就跟默认生成的析构一样吗?
更多推荐



所有评论(0)