【C++】构造-析构详解

文章目录

      • (一)构造函数的用途
      • (二)构造函数的特点
      • (三)构造函数的调用情况
        • (1)花括号式的初始化
        • (2)圆括号的初始化
      • (四)析构函数
      • (四)理解构造、析构思想

(一)构造函数的用途

  • 创建对象
  • 初始化对象的属性
  • 类型转换(只允许单个参数的构造函数)

explicit加在构造函数前表示明确不允许隐式类型转换。

#include 
using namespace std;
class Object
{
public:
	//explicit禁止隐式类型转换
	explicit Object(int x = 0):val(x){}
private:
	int val;
};
int main()
{
	Object obja;
	obja = 10;	//err
	obja = (Object)10;
	return 0;
}

(二)构造函数的特点

  • 构造函数是特有公有成员函数;(1%特殊情况:可以私有、保护
  • 构造函数无返回值类型(实际上返回创建的对象
  • 程序运行,构造对象时,该对象所属类的构造函数自动被调用
  • 构造函数可以重载
  • 构造函数可以在类中定义,类中声明,在类外定义
  • 若没有给定构造函数,C++编译器添加缺省的构造函数 类名(void){}
  • 只要定义一个构造函数,系统就不会生成缺省的构造函数。
  • 缺省构造函数只能有一个

(三)构造函数的调用情况

(1)花括号式的初始化
#include
using namespace std;
class Person
{
public:
	int age;
	char* name;
};

int main()
{
	Person p1 = {18, "jiege"};
	return 0;
}

这种初始化的方式,就是将类当作结构体使用。编译器会生成缺省的构造函数Person(void);

(2)圆括号的初始化
class Person
{
public:
	Person();
	Person(int _age, const char* _name);
	~Person();
private:
	int age;
	char* name;
};

//无参构造
Person::Person()
	:age(0), name(new char[20])
{}

//有参构造
Person::Person(int _age, const char* _name)
	: age(0), name(new char[20])
{
	strcpy(name, _name);
	age = _age;
}

int main()
{
	Person p;					//会调用无参构造/缺省构造函数
	Person p1(18, "jiege");		//会调用有参构造
	Person p2();				//编译:函数声明
	return 0;
}


注意:

  • 初始化列表只能在构造函数上使用。
  • Person p2(); 被编译器编译成返回值为Person类型 函数名p2的函数声明;
  • 构造函数不能手动调用

(四)析构函数

由于析构函数比较简单,这里就简单介绍下:
用途:注销对象、系统自动回收对象占用的资源

基本语法:

~类名(){};

注意:

  • 析构函数可手动调用
  • 析构函数不能重载
  • 析构函数没有参数

(四)理解构造、析构思想

生可带来,死不带去。这句话很有深意,并且构造创建对象,对象的析构的过程 和 人的出生和死亡的过程是如此相似。

举个例子:

  • 生可带来:有人生下来就是富二代(生可带来),就像有参构造(通过实参,给构造的对象的属性进行改造),普通人生下来(调用无参构造,不会对对象的属性进行额外的修改);
  • 死不带去:死亡的过程(对象的析构过程),不管是富人、穷人都会面临死亡(所有的对象最后都会使用同一个析构函数去析构自己)

注意:

  • 构造函数不能手动调用(系统自动调用,就像人无法就决定自己的出生条件,not remake)
  • 析构函数可以手动调用(就像人的死亡,可以主动选择死亡,对象的析构也是如此)
  • 多个构造函数的意义:构造不同属性的对象(好比富人、穷人、普通人…)

你可能感兴趣的:(C++,c++,构造,析构)