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

(一)构造函数的用途

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

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

#include <iostream>
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<iostream>
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)
  • 析构函数可以手动调用(就像人的死亡,可以主动选择死亡,对象的析构也是如此)
  • 多个构造函数的意义:构造不同属性的对象(好比富人、穷人、普通人…)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,构造函数和析构函数是用来创建和销毁对象的特殊成员函数。构造函数在对象被创建时调用,而析构函数在对象被销毁时调用。 构造函数具有以下特点: 1. 构造函数的名称与类名称相同。 2. 构造函数没有返回类型,包括void。 3. 构造函数可以有参数,也可以没有参数。 4. 构造函数可以重载,即同一个类可以有多个不同参数的构造函数。 析构函数具有以下特点: 1. 析构函数的名称与类名称相同,在前面加上波浪号(~)。 2. 析构函数没有返回类型,包括void。 3. 析构函数不接受任何参数。 友元函数是一个在类外部定义的非成员函数,但它可以访问类的私有成员和保护成员。友元函数可以是类的成员函数,也可以是全局函数。友元函数的声明必须在类的内部,但定义可以在类的内部或外部。 友元函数可以在类中声明为友元函数,以便能够访问类的私有成员和保护成员。友元函数的声明可以放在类定义中的任何地方。例如: ```cpp class MyClass { private: int privateVar; public: MyClass(); ~MyClass(); friend void friendFunc(MyClass obj); }; void friendFunc(MyClass obj) { // 可以访问MyClass的私有成员和保护成员 cout << obj.privateVar << endl; } MyClass::MyClass() { privateVar = 10; } MyClass::~MyClass() { // 在析构函数中调用友元函数 friendFunc(*this); } ``` 在上面的示例中,`friendFunc`是`MyClass`的友元函数,并且可以访问`MyClass`的私有成员`privateVar`。在析构函数中,我们调用了友元函数`friendFunc`并将当前对象作为参数传递给它。 请注意,这只是一个简单的示例用于说明构造函数、析构函数和友元函数的概念,实际应用中可能会有更复杂的情况和用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值