C++ 构造函数和析构函数笔记

1、构造函数

构造函数是一种特殊的类成员函数,才创建类对象时被调用,构造函数的名称和类名相同,但通过函数重载,可以创建多个同名的构造函数,条件是每个函数的特征标(参数列表)都不同。

注:接受一个参数的构造函数允许使用赋值语法将对象初始化为一个值:

Classname object = value;

构造函数的的参数表示的不是类成员,而是赋给类成员的值,因此,参数名不能与类成员相同。

有两种使用构造函数初始化对象的方式:                                                                                 

显示地调用构造函数:

Student s1 = Student("张三",20,2024);

隐式地调用构造函数: 

Student("李四", 21, 2023)

注意:无法使用对象来调用构造函数,因为在构造函数构造出来之前,对象是不存在的。构造函数被用来创建对象,而不能被对象调用。         

2、默认构造函数

默认构造函数是在未提供显示初始值时,用来创建对象的函数。

注意:当且仅当未定义任何构造函数时,编译器才会提供默认构造函数。若程序员为类定义了构造函数,就必须为它提供默认构造函数。因为若为类定义了构造函数,编译器就不会提供默认构造函数了。如果仅提供了非默认构造函数,则下面的声明会报错:

Student stu1;

定义默认构造函数的方法也有两种:

1、给已有构造函数的所有参数提供默认值

2、通过函数重载来定义另一个构造函数--没有参数的构造函数。

注意:因为只能有一个默认构造函数,因此不要同时使用这两种方式。

在设计类时,通常应提供对所有类成员做隐式初始化的默认构造函数。

Student stu1();
Student stu2;

上面程序第一个声明是返回一个Sudent对象的函数,第二个是隐式地调用默认构造函数。

隐式地调用默认构造函数时,不要加()!

3、析构函数

和构造函数一样,析构函数的名称也很特殊,在类名前加上~。且析构函数也没有返回值和声明类型。与构造函数不同的是,析构函数没有参数。

同样,若程序员没有提供析构函数,编译器将隐式地声明一个默认析构函数,并且发现导致对象被删除的代码后,提供默认析构函数的定义。

什么时候应调用析构函数呢?

这由编译器决定,一般不在代码中显示地调用析构函数。

如果创建的是静态存储类对象,则其析构函数在程序结束时自动调用;

如果创建的是自动存储类对象,则其析构函数在程序执行完代码块(该对象在其中定义)时自动被调用;

如果对象是通过new创建的,则它将驻留在栈内存或自由存储区,当使用delete来释放内存时,其析构函数自动被调用;

程序在创建临时对象完成特定操作时,当程序结束对该对象的使用时自动调用其析构函数。

注:

Student stu1 = Student("张三", 19, 001);
stu2 = Student("王五",20,003);

以上两条语句有根本性的差别:

第一条语句是初始化,它创建有指定值的对象,可能创建临时对象(也可能不会);第二条语句是赋值,在赋值语句中使用构造函数总会导致在赋值前创建一个临时对象。

因此,如果既可以通过初始化,也可以通过赋值来设置对象的值,则应采用初始化的方式。通常这种方式更高效。

                                                                                                -----------参考C++ Primer Plus 第六版

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值