c++ 入门——浅析构造函数和析构函数

关于“c++ 入门——浅析构造函数和析构函数”的攻略,我们可以分为以下三个部分来进行讲解:

一、构造函数

1.1 什么是构造函数

构造函数是一类特殊的成员函数,当我们创建类的新对象时,就会自动被调用。它的作用是初始化对象的成员变量。

class Test{
public:
  Test(int a, int b){
    x = a;
    y = b;
  }
private:
  int x, y;
};

在上述的代码中,Test 类中的构造函数被定义了,当我们创建一个新对象的时候可以使用这个构造函数来初始化 xy 的值。

1.2 默认构造函数

如果我们没有定义任何构造函数,编译器就会自动为我们生成一个默认的构造函数,该函数不接受任何参数,也不执行任何操作。

class Test{
public:
  int x;
  int y;
};

在上述代码中,由于没有定义任何构造函数,编译器会自动生成一个默认的构造函数,该函数并没有做任何操作。

1.3 构造函数的重载

我们可以根据需要定义多个构造函数,这就是构造函数的重载。

class Test{
public:
  Test(){}
  Test(int a, int b){
    x = a;
    y = b;
  }
private:
  int x, y;
};

在上述代码中,我们定义了两个构造函数。第一个是空的构造函数,它接受一个没有参数的调用。第二个构造函数需要传入两个整型参数。

二、析构函数

2.1 什么是析构函数

析构函数是在对象被删除之前自动调用的函数,它的作用是释放对象使用的资源。

class Test{
public:
  Test(){}
  ~Test(){
    cout << "Object is destroyed" << endl;
  }
};

在上述代码中,我们定义了一个析构函数,当对象被删除时,析构函数会自动被调用。

2.2 虚析构函数

在使用继承实现多态时,当我们使用父类指针指向子类对象,并使用 delete 关键字释放指针所指向的对象时,如果子类未定义析构函数,就会调用父类的析构函数,这样子类对象中的资源可能无法被正常释放。因此,在父类中定义一个虚析构函数,可以保证子类对象中的资源也能得到正确地释放。

class Parent{
public:
  virtual ~Parent(){
    cout << "Parent object is destroyed" << endl;
  }
};

class Child : public Parent{
public:
  ~Child(){
    cout << "Child object is destroyed" << endl;
  }
};

在上述代码中,我们在父类 Parent 中定义了一个虚析构函数,子类 Child 继承了父类。当我们执行以下代码时:

Parent* p = new Child();
delete p;

此时会先执行子类的析构函数,再执行父类的析构函数。

三、示例

这里我们来看一个示例,假设我们要设计一个简单的人类。一个人需要有名字、性别和年龄这三个属性。我们可以设计一个 Person 类如下:

class Person{
public:
  Person(string name, string gender, int age){
    m_name = name;
    m_gender = gender;
    m_age = age;
  }

  ~Person(){
    cout << "Person object is destroyed" << endl;
  }

private:
  string m_name;
  string m_gender;
  int m_age;
};

在上述代码中,我们定义了 Person 类,它有名字、性别和年龄这三个属性。构造函数需要传入这三个参数,并将它们分别赋值给类中的成员变量。析构函数用来释放对象中的资源。

现在我们要创建一个名字叫 Tom 的男孩(年龄为 10 岁),我们可以这样写:

Person* p = new Person("Tom", "male", 10);
delete p;

这里我们用了 new 运算符创建了一个名为 pPerson 类对象,并从堆区分配内存。delete 关键字用于释放 p 所指向的对象。

再来看一个例子,我们现在要设计一个图形类(抽象类),包括一个虚函数 get_area() 用来计算图形的面积。我们还要设计两个具体的图形类 CircleRectangle,它们都是从图形类派生而来。Circle 类包括一个成员变量 r 代表圆的半径;Rectangle 类包括两个成员变量 wh 分别代表矩形的宽和高。我们可以这样写:

#include <iostream>
using namespace std;

class Shape{
public:
  virtual float get_area() = 0;
};

class Circle : public Shape{
public:
  Circle(float r){
    m_r = r;
  }

  float get_area(){
    return 3.14 * m_r * m_r;
  }

private:
  float m_r;
};

class Rectangle : public Shape{
public:
  Rectangle(float w, float h){
    m_w = w;
    m_h = h;
  }

  float get_area(){
    return m_w * m_h;
  }

private:
  float m_w, m_h;
};

int main(){
  Shape* s1 = new Circle(5);
  cout << "Circle: " << s1->get_area() << endl;
  delete s1;

  Shape* s2 = new Rectangle(3, 4);
  cout << "Rectangle: " << s2->get_area() << endl;
  delete s2;

  return 0;
}

在上述代码中,我们定义了一个抽象类 Shape,其中有一个纯虚函数 get_area()。接着我们派生出两个具体的类 CircleRectangle,它们都实现了 get_area() 函数。在 main 函数中,我们分别用 CircleRectangle 类型的指针来创建对象,并调用它们的 get_area() 函数来计算面积。

以上就是关于“c++ 入门——浅析构造函数和析构函数”的完整攻略,希望能对初学者有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++ 入门——浅析构造函数和析构函数 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • web.config使用方法指南

    Web.config使用方法指南 什么是Web.config文件 Web.config文件是ASP.NET应用程序中的主配置文件,它包含了应用程序所需的所有配置信息,常见的配置如连接字符串、Session配置、认证和授权配置等。 在ASP.NET应用程序中,Web.config文件通常存放在应用程序根目录下,当应用程序启动时,ASP.NET会自动将Web.c…

    other 2023年6月25日
    00
  • Linux常用配置文件保存位置大全

    Linux系统是一种常用的操作系统,无论是服务器还是个人电脑,都需要进行各种配置。在配置过程中,常会涉及到各种配置文件的修改。本文将详细介绍Linux常用配置文件保存位置大全及其作用,帮助用户快速找到需要修改的配置文件。 一、系统默认配置文件目录 Linux系统默认的配置文件存放目录为/etc。在这个目录下,包含了很多的系统配置文件,大多数文件都是以纯文本格…

    other 2023年6月25日
    00
  • sqlserver2005 xml字段的读写操作

    SQL Server 2005 提供了对 XML 数据的直接支持,其中包括了 XML 数据类型。XML 数据类型表示一个 XML 文档,允许您在 SQL Server 操作 XML 数据、读取 XML 文档、查询 XML 数据和生成 XML 数据。本文将详细讲解 SQL Server 2005 中 XML 字段的读写操作。 XML 字段的创建和修改 创建一个…

    other 2023年6月25日
    00
  • python,pycharm的环境变量设置方式

    当在系统中安装Python和PyCharm时,需要设置环境变量才能在终端或命令提示符中运行Python和PyCharm命令。以下是设置Python和PyCharm环境变量的步骤: 在系统中安装Python和PyCharm 在安装Python和PyCharm之前,请确保已经安装了适合您的操作系统,建议使用Python3版本。安装过程中,请选择适合您操作系统的版…

    other 2023年6月27日
    00
  • 更新完Win11系统后C盘变小了怎么办? win11一更新c盘就变小解决办法

    更新完Win11系统后C盘变小了怎么办? 当你更新完Win11系统后,发现C盘的可用空间变小了,可能是由于系统更新过程中产生了一些临时文件或者备份文件,导致C盘空间被占用。下面是解决这个问题的一些方法: 方法一:清理临时文件和备份文件 打开“设置”菜单,点击“系统”选项。 在左侧导航栏中选择“存储”。 在“存储”页面中,点击“临时文件”。 在“临时文件”页面…

    other 2023年8月2日
    00
  • JS获取客户端IP地址、MAC和主机名的7个方法汇总

    JS获取客户端IP地址、MAC和主机名的7个方法汇总 在JavaScript中,获取客户端IP地址、MAC和主机名是一项常见的任务。下面是7种常用的方法,可以帮助你完成这个任务。 方法一:使用window.location const ipAddress = window.location.hostname; console.log(\"IP地址:…

    other 2023年7月30日
    00
  • redis击穿 雪崩 穿透超详细解决方案梳理

    关于 Redis 的击穿、雪崩、穿透问题,我给出如下完整攻略: Redis 击穿、雪崩、穿透问题解决方案梳理 Redis 基础 为了更好理解 Redis 击穿、雪崩、穿透,我们先来了解一下 Redis 的基础知识。 Redis 是一个开源的内存数据库,它支持多种数据结构,并提供对这些数据结构的读写操作。Redis 能够存储的数据类型有字符串、列表、集合、散列…

    other 2023年6月26日
    00
  • C语言的isatty函数和ttyname函数以及sendmsg函数用法

    C语言是一种广泛使用的编程语言,涉及到很多系统底层的 API,而 isatty 函数、ttyname 函数以及 sendmsg 函数也是这其中的一部分。 isatty 函数 isatty 函数用于判断一个文件描述符是否是终端设备。其原型如下: int isatty(int fd); 其中,fd 为文件描述符,返回值表示是否是终端设备,是返回 1,否则返回 0…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部