<c++> 类的构造函数与类的析构函数

简介: <c++> 类的构造函数与类的析构函数

类的构造函数


什么是构造函数


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;
}


执行效果


864302275f6b584bc069cfcb25c2d80e_befc75b676744377ab87dec68574afef.png


相关文章
|
29天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
50 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
103 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
89 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
108 4
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
29 1
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
32 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
32 4
|
2月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
2月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
2月前
|
存储 编译器 C语言
【C++类和对象(上)】—— 我与C++的不解之缘(三)
【C++类和对象(上)】—— 我与C++的不解之缘(三)