小白学习C++ 教程十二C++面向对象编程中的构造函数和析构函数

Posted 刘润森!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白学习C++ 教程十二C++面向对象编程中的构造函数和析构函数相关的知识,希望对你有一定的参考价值。

@Author:Runsen

面向对象编程旨在:在编程中实现继承、隐藏、多态等现实世界的实体。OOP 的主要目的是将数据和对它们进行操作的函数绑定在一起。

我们可以说C++中的类,代表一组共享一些共同属性和行为的对象。

class person
{
    char name[20];
    int id;
public:
    void getdetails(){}
};
  
int main()
{
   person p1; // p1 is a object 
}

构造函数

构造函数是特殊的类成员,每次实例化该类的对象时,编译器都会调用它们。构造函数与类同名,可以定义在类定义的内部或外部。

构造函数在以下方面与普通函数不同:

  • 构造函数与类本身同名
  • 构造函数没有返回类型
  • 创建对象时会自动调用构造函数。
  • 它必须放在class的公共部分。
  • 如果我们不指定构造函数,C++ 编译器会为对象生成一个默认构造函数(期望没有参数并且有一个空体)。

有3种类型的构造函数:

  • 默认构造函数
  • 参数化构造函数
  • 复制构造函数(这种比较少见)
#include <iostream>
using namespace std;
class Geeks
{
public:
    int id;
    //默认构造
    Geeks()
    {
        cout << "Default Constructor called" << endl;
        id = -1;
    }

    //参数化构造函数
    Geeks(int x)
    {
        cout << "Parameterized Constructor called" << endl;
        id = x;
    }
};

int main()
{

    // 默认构造
    Geeks obj1;
    cout << "Geek id is: " << obj1.id << endl;

    //  参数化构造函数
    Geeks obj2(21);
    cout << "Geek id is: " << obj2.id << endl;
    return 0;
}

Default Constructor called
Geek id is: -1
Parameterized Constructor called
Geek id is: 21

复制构造函数是一个成员函数,它使用同一类的另一个对象来初始化一个对象。复制构造函数具有以下通用函数原型:

ClassName (const ClassName &old_obj); 

以下是复制构造函数的简单示例。

#include <iostream>
using namespace std;

class Point
{
private:
    int x, y;

public:
    // 参数化构造函数
    Point(int x1, int y1)
    {
        x = x1;
        y = y1;
    }

    // 复制构造函数
    Point(const Point &p1)
    {
        x = p1.x;
        y = p1.y;
    }

    int getX() { return x; }
    int getY() { return y; }
};

int main()
{
    Point p1(10, 15); // 参数化构造函数
    Point p2 = p1;    // 复制构造函数

    cout << "p1.x = " << p1.getX() << ", p1.y = " << p1.getY();
    cout << "\\np2.x = " << p2.getX() << ", p2.y = " << p2.getY();

    return 0;
}

p1.x = 10, p1.y = 15
p2.x = 10, p2.y = 15

析构函数

析构函数是另一个特殊的成员函数,当对象的作用域结束时由编译器调用。

#include <iostream>
using namespace std;
class Geeks
{
    public:
    int id;
     
    //析构函数
    ~Geeks()
    {
        cout << "Destructor called for id: " << id <<endl;
    }
};
 
int main()
  {
    Geeks obj1;
    obj1.id=7;
    int i = 0;
    while ( i < 5 )
    {
        Geeks obj2;
        obj2.id=i;
        i++;       
    } // obj2的范围到此结束
 
    return 0;
  } // obj1的范围到此结束


Destructor called for id: 0
Destructor called for id: 1
Destructor called for id: 2
Destructor called for id: 3
Destructor called for id: 4
Destructor called for id: 7

面向对象编程中的三大封装、继承和多态

继承

继承:一个类从另一个类派生属性和特征的能力称为继承。继承是面向对象编程最重要的特性之一。

  • 子类:从另一个类继承属性的类称为子类或派生类。
  • 超类:其属性由子类继承的类称为基类或超类。
  • 可重用性:继承支持“可重用性”的概念,即当我们想要创建一个新类并且已经有一个包含我们想要的一些代码的类时,我们可以从现有类中派生出我们的新类。通过这样做,我们正在重用现有类的字段和方法。

封装

数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。

C++ 通过创建类来支持封装和数据隐藏(public、protected、private)。我们已经知道,类包含私有成员(private)、保护成员(protected)和公有成员(public)成员。默认情况下,在类中定义的所有项目都是私有的。例如:

多态

多态:多态这个词意味着有多种形式。简单来说,我们可以将多态性定义为消息以多种形式显示的能力。

一个人同时可以有不同的特点。就像男人同时是父亲、丈夫、雇员。所以同一个人在不同的情况下会有不同的行为。这称为多态性。

以上是关于小白学习C++ 教程十二C++面向对象编程中的构造函数和析构函数的主要内容,如果未能解决你的问题,请参考以下文章

小白学习C++ 教程二十二C++ 中的STL容器stackqueue和map

小白学习C++ 教程十一C++类中访问修饰符

小白学习C++ 教程二十一C++ 中的STL容器Arrays和vector

小白学习C++ 教程二十一C++ 中的STL容器Arrays和vector

C++实例学习视频教程

C++核心编程面向对象