类的构造函数
什么是构造函数
Q:什么是类的构造函数
A:构造函数是类的一种特殊成员函数,不需要人为调用,而是在建立对象时自动被执行。简单来说就是在建立对象时构造函数就会自动进行执行。
声明和定义构造函数
class Dog {
private:
//成员变量
string name;
int age;
};
构造函数的名称要和类名称相同。现在创建一个Dog
的构造函数,由于需要为Dog
对象提供 2 个值,因此构造函数应该有 2 个参数。具体如下:
Dog(const string & na, int ag);
//ps:成员函数设计时加 cons t的好处:1.安全2.通用性好,既适用于普通对象也适用于常对象。
Dog::Dog(const string & na, int ag) {
name = na;
age = ag;
}
注意:通常情况下,创建对象有两种情况,一种是直接创建类的对象,另一种是通过new
来创建一个动态对象,这两种情况都会自动调用构造函数。
如何使用构造函数
c++
有两种使用构造函数来初始化对象的方法,第一种方法就是显式地调用构造函数。这里将 dog
对象的name
成员设置成字符串旺财
,将age
成员设置成 10。
Dog dog = Dog ("旺财",10); //显式地调用构造函数
另一种方法就是隐式地调用构造函数。
Dog dog("旺财",10); //隐式地调用构造函数
注意:因为在构造函数构造出对象之前,对象是不存在的,所以无法使用对象来调用构造函数。也就是说,构造函数被用来创建对象,而不能通过对象来调用。
默认构造函数
Q:什么是类的默认构造函数
A:默认构造函数是在未提供显式初始值时,用来创造对象的构造函数。
当使用下面这种声明时,就是默认构造函数。执行命令后,会创建dog
对象,但是不会初始化它的成员。
Dog dog;
注意:当没有定义任何构造函数时,编译器才会提供默认构造函数。如果自己定义了构造函数,就必须自己定义默认构造函数,否则上面的声明会报错。
定义默认构造函数很简单,一般有两种方法,第一种方法就是给已有构造函数的所有参数提供默认值。
Dog(const string & na = "no name", int ag = 0);
第二种方法就是通过函数重载来定义一个没有参数的构造函数
Dog::Dog() {
name = "no name";
age = 0;
}
类的析构函数
什么是析构函数
Q:什么是类的析构函数
A:析构函数是特殊的类成员函数,简单来说,析构函数与构造函数的作用正好相反,它用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。简单来说就是在类对象被回收,销毁时自动调用。
声明和定义析构函数
和构造函数一样,析构函数的名称也很特殊,需要在类名前加上~
,Dog
类的析构函数就是~Dog()
。通常情况下,类对象被回收,销毁有两种情况,一种是超过生命周期之后被自动回收,另一种是动态对象通过delete
回收,这两种情况都会自动调用析构函数。
因为在类对象被回收,销毁时析构函数会自动调用,所以必须要有一个析构函数。如果没有提供析构函数,编辑器会隐形声明一个默认析构函数。
小练习
银行账户
我们定义一个类来表示银行账户。数据成员包括储户姓名,账号和存款。成员函数执行以下操作。
- 创建一个对象并将它初始化。
- 显示储户的姓名,账号和存款。
- 存入参数指定的存款。
- 取出参数指定的存款。
#include<iostream>
using namespace std;
class BankAccount {
private :
string fullname;
string account;
double deposit;
public :
BankAccount();
BankAccount(const string, const string, float);
~BankAccount();
void init_account(const string, const string, float);
void print_info() const;
void save(float);
void withdraw(float);
};
int main() {
BankAccount ba("锡兰","0001",1000);
ba.print_info();
ba.init_account("锡兰_CC","",1500);
ba.print_info();
ba.save(233.3);
ba.print_info();
return 0;
}
//默认构造函数
BankAccount::BankAccount() {
deposit = 0;
}
//带参数构造函数的定义
BankAccount::BankAccount(string name, string id, float f) {
fullname = name;
account = id;
deposit = f;
}
//析构函数
BankAccount::~BankAccount() {
cout << "结束!!!" << endl;
}
//初始化对象
void BankAccount::init_account(string name, string id, float f) {
cout<<"初始化账户信息";
if(name != "") fullname = name;
if(id != "") account = id;
deposit = f;
}
//输出账号信息
void BankAccount::print_info() const {
cout << "账号信息:" << endl;
cout << "姓名:" << fullname << endl;
cout << "ID:" << account << endl;
cout << "存款:" << deposit <<endl;
}
//存款函数
void BankAccount::save(float f) {
deposit += f;
}
//取款函数
void BankAccount::withdraw(float f) {
deposit -= f;
}