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

yizhihongxing

关于“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日

相关文章

  • 解决Win8 metro应用出现挂起状态无法再次安装问题

    问题描述: 当安装Windows 8 Metro应用程序时,有时程序可能会卡在挂起状态,在此期间,程序不能启动,也不能重新安装。这种情况可能会导致用户无法使用他们想要的软件,这是安装或应用程序的各种问题之一。解决这个问题需要删除这些挂起的应用程序,以便重新安装。 解决方法: 以下是完整的解决Win8 metro应用出现挂起状态无法再次安装问题的攻略: 结束挂…

    other 2023年6月27日
    00
  • python的pytest框架之命令行参数详解(下)

    下面是关于“python的pytest框架之命令行参数详解(下)”的完整攻略。 标题 python的pytest框架之命令行参数详解(下) 概述 前面讲解了pytest框架中一些常用的命令行参数,本篇文章将继续讲解一些更为高级的参数,包括fixture的范围以及参数化运行测试用例。 fixture范围 fixture是pytest框架中常用的一种功能,可以用…

    other 2023年6月26日
    00
  • asp下检查表中是否存在某个字段(列)函数

    要判断某个表中是否存在某个字段(列),可以使用系统视图syscolumns,其中包含了数据库中所有表的列信息。可以通过以下步骤实现: 执行如下SQL语句,查询指定表的所有列名 SELECT name FROM syscolumns WHERE id=OBJECT_ID(‘表名’) 其中,’表名’为需要查询的表名。此SQL语句会返回该表的所有列名。 判断是否存…

    other 2023年6月25日
    00
  • thinkphp5.1框架模板布局与模板继承用法分析

    ThinkPHP5.1框架模板布局与模板继承用法分析攻略 1. 概述 ThinkPHP5.1是一款流行的PHP开发框架,它提供了强大的模板引擎功能,其中包括模板布局和模板继承。模板布局允许我们定义一个公共的页面布局,而模板继承则允许我们在不同的页面中继承这个布局,并进行相应的扩展和修改。 2. 模板布局 模板布局允许我们定义一个公共的页面布局,这样我们就可以…

    other 2023年8月23日
    00
  • 电脑C盘内存满了怎么转移到别的盘 电脑C盘满了变成红色的解决办法

    电脑C盘内存满了怎么转移到别的盘 当电脑的C盘内存满了,我们可以将一些文件或文件夹转移到其他盘来释放空间。下面是一个详细的攻略,包含两个示例说明。 步骤一:查看C盘的使用情况 首先,我们需要查看C盘的使用情况,以确定哪些文件或文件夹占用了大量的空间。可以按照以下步骤进行: 打开“我的电脑”或“此电脑”。 右键点击C盘,并选择“属性”。 在属性窗口中,可以看到…

    other 2023年8月1日
    00
  • flask框架菜鸟教程

    当然,我可以为您提供有关“Flask框架菜鸟教程”的完整攻略,以下是详细说明: 什么是Flask框架? Flask是一个基于Python的轻量Web应用框架,它使用简单灵活,适合快速开发小型Web应用。Flask框架的核心思想是“”,它只提供了最基本的功能,其他功能可以通过插件或扩展来实现。 Flask框架的安装 在使用Flask架之前,需要先安装Flask…

    other 2023年5月7日
    00
  • mysql根据json字段内容作为查询条件(包括json数组)检索数据

    Sure! Here is a detailed guide on how to retrieve data from MySQL based on the content of JSON fields, including JSON arrays. MySQL JSON Functions: MySQL provides a set of JSON fun…

    other 2023年10月17日
    00
  • Android浅析viewBinding和DataBinding

    Android浅析viewBinding和DataBinding攻略 介绍 在Android开发中,viewBinding和DataBinding是两种常用的数据绑定技术。它们可以简化UI组件与数据之间的交互,提高开发效率。本攻略将详细介绍这两种技术的使用方法和区别,并提供示例说明。 viewBinding viewBinding是Android官方在And…

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