C++分析类的对象作类成员调用构造与析构函数及静态成员

C++中,类对象也可以充当类的成员,这样的类称为分析类或组合类。在分析类的对象作为其他类的成员变量时,需要注意其构造函数、析构函数及静态成员的调用。

构造函数和析构函数的调用

当组合类的对象作为另一个类的成员时,先调用另一个类的构造函数,再调用组合类的构造函数;在调用析构函数时,先调用组合类的析构函数,再调用另一个类的析构函数。

示例1:

class A {
public:
    A() {cout << "A Constructor" << endl;}
    ~A() {cout << "A Destructor" << endl;}
};

class B {
public:
    B() {cout << "B Constructor" << endl;}
    ~B() {cout << "B Destructor" << endl;}
};

class C {
public:
    A a;
    B b;
    C() {cout << "C Constructor" << endl;}
    ~C() {cout << "C Destructor" << endl;}
};

int main() {
    C c;
    return 0;
}

运行结果:

A Constructor
B Constructor
C Constructor
C Destructor
B Destructor
A Destructor

可以看到,先构造A,再构造B,最后构造C;而在销毁对象时,先销毁C,再销毁B和A。

示例2:

class Date {
public:
    int year;
    int month;
    int day;
    Date(int y, int m, int d) : year(y), month(m), day(d) {
        cout << "Date Constructor" << endl;
    }
    ~Date() {cout << "Date Destructor" << endl;}
};

class Employee {
public:
    string name;
    Date birthDate;
    Employee(string n, Date d) : name(n), birthDate(d) {
        cout << "Employee Constructor" << endl;
    }
    ~Employee() {cout << "Employee Destructor" << endl;}
};

int main() {
    Date birthdate(2001, 10, 1);
    Employee employee("Tom", birthdate);
    return 0;
}

运行结果:

Date Constructor
Employee Constructor
Employee Destructor
Date Destructor

可以看到,首先构造Date对象,然后构造Employee对象,最后按相反的顺序销毁对象。

静态成员的调用

静态成员是属于整个类的,其调用方式与一般成员不同。一个类的静态成员只有一份实体,不随对象的生成而生成。

当组合类对象生成时,其静态成员只会初始化一次,而不是针对每个对象分别初始化。当组合类对象被销毁时,其静态成员也不会被销毁,直到整个程序结束。

示例:

class A {
public:
    A() {cout << "A Constructor" << endl;}
    ~A() {cout << "A Destructor" << endl;}
    static int x;
    static void print() {cout << "x=" << x << endl;}
};

int A::x = 1;

class B {
public:
    A a;
    B() {cout << "B Constructor" << endl;}
    ~B() {cout << "B Destructor" << endl;}
};

int main() {
    B b1, b2;
    A::print();
    return 0;
}

运行结果:

A Constructor
B Constructor
A Constructor
B Constructor
x=1
B Destructor
A Destructor
B Destructor
A Destructor

可以看到,静态成员x只被初始化了一次,并且在对象被销毁时没有被销毁。可以通过静态成员函数print,在不创建任何对象的情况下访问静态成员x的值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++分析类的对象作类成员调用构造与析构函数及静态成员 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++实现线程池的简单方法示例

    关于”C++实现线程池的简单方法示例”,我们可以以下步骤进行: 步骤1:了解线程池的概念 线程池是一种多线程处理形式,为了避免反复地创建和销毁线程带来的系统开销,为了使线程能够得到复用,提高代码的效率和稳定性。线程池所要做的工作就是控制线程的数量、保证任务的异步执行和线程安全。 步骤2:实现线程池 在实现线程池时,需要考虑以下几个方面: 2.1 任务队列 线…

    C 2023年5月22日
    00
  • C语言编程之三个方法实现strlen函数

    以下是详细的讲解“C语言编程之三个方法实现strlen函数”的完整攻略。 目录 什么是strlen函数 方法一:遍历字符串计数 方法二:使用指针递增统计 方法三:调用标准库函数strlen 总结 什么是strlen函数 strlen是一个C语言标准库函数,用来计算字符串的长度,即该字符串中字符的个数。函数的原型如下: size_t strlen(const …

    C 2023年5月23日
    00
  • 华为C8816怎样申请官方解锁码和一键解锁

    华为C8816怎样申请官方解锁码和一键解锁攻略 什么是官方解锁码? 官方解锁码是指厂商(如华为、小米等)提供的一种解锁手机 bootloader 的解锁码。通常情况下,手机的 bootloader 是由厂商加密的,无法直接修改系统文件。而通过解锁 bootloader,就可以进入到手机的刷机模式,安装第三方ROM等操作。 一、如何申请官方解锁码? 官方解锁码…

    C 2023年5月23日
    00
  • C语言 枚举类型(Enum)详解及示例代码

    那我来详细讲解一下“C语言 枚举类型(Enum)详解及示例代码”。 什么是枚举类型? 枚举类型是C语言中的一种基本数据类型,它是一组预定的常量的集合,在某些情况下可以用于替代常量。 枚举类型采用关键字enum定义,格式如下: enum 枚举名{ 枚举常量1, 枚举常量2, …… }; 其中,枚举常量默认从0开始,依次递增1,也可以手动指定初值。 枚举类型的应…

    C 2023年5月24日
    00
  • C++函数重载的定义与原因详解

    C++函数重载的定义与原因详解 什么是函数重载 函数重载是指在一个类中定义多个同名函数,但它们的参数不同(参数个数、参数类型或参数顺序不同)。 函数重载的定义 函数名必须相同。 函数的参数列表必须不同(个数、类型、顺序)。 函数的返回类型可以不同。 可以发生在同一个 class 内,也可以发生在父类和子类之间。 编译器根据函数参数列表的不同自动进行函数匹配。…

    C 2023年5月23日
    00
  • Java中的异常处理机制介绍(非常全面!)

    Java中的异常处理机制介绍(非常全面!) Java中的异常处理机制是指在程序执行过程中发生错误时,程序能够捕获并跳转到异常处理代码。Java中的异常处理机制可以帮助程序员更快地发现和解决程序中的错误,使代码更加健壮。 Java中异常的分类[1] Java中的异常主要分为三类: 检查型异常(Checked Exception):编译时就能发现的异常,要么需要…

    C 2023年5月23日
    00
  • C++的类型转换详细介绍

    C++的类型转换详细介绍 什么是类型转换? 在程序开发中,我们常常需要在不同的数据类型之间进行转化,以方便数据的处理和使用。C++提供了多种类型转换方式,这些方式叫做类型转换。 隐式类型转换 隐式类型转换是指,当程序需要的数据类型和给出的数据类型不一致时,系统会自动将数据类型进行转换。例如: int a = 10; double b = 3.14; // 自…

    C 2023年5月23日
    00
  • 基于C语言实现泛型编程详解

    基于C语言实现泛型编程详解 在C语言中实现泛型编程是一件比较困难的事情,因为C语言本身不支持泛型。但是,有一种叫做泛型指针的技术,在C语言中实现泛型编程成为了可能。 泛型指针 泛型指针是一种特殊的指针类型,它可以指向任何类型的数据。在C语言中,使用void*关键字定义泛型指针。 void* ptr; 泛型指针可以将数据类型定义为一个指针类型。例如: int …

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