===============================================
未完待续,转载时请表明出处:
http://www.cofftech.com/thread-1400-1-1.html
欢迎大家跟帖讨论哈~~~~~
===============================================
现在看一下不同数据类型对象的构造函数和析构函数的调用顺序,从而看出它们的生命周期和作用域。
[例1]建立不同数据类型的对象时,构造函数和析构函数的调用顺序。
此程序按照数据隐藏类型处理,共有三个文件:cons_des.h,cons_des.cpp,cons_des_hide.cpp。其中不向用户提供cons_des_hide.cpp源文件而只提供cons_des_hide.obj目标文件
头文件:
// cons_des.h
#ifndef CONS_DES_H
#define CONS_DES_H
#include <iostream.h>
class base {
int data;
public:
base( int ); // constructor declaration
~base(); // destructor declaration
};
#endif
这是类的接口。
隐藏源文件:
// cons_des_hide.cpp
#include "cons_des.h"
base::base( int value ) : data(value)
{
cout << "Object " << data << " constructor";
}
base::~base()
{ cout << "Object " << data << " destructor " << endl; }
主文件:
// cons_des.cpp
#include "cons_des.h"
void create( void ); // prototype
base first( 1 ); // global object
void main()
{
cout << " (globally created before main)" << endl;
base second( 2 ); // local object
cout << " (local automatic in main)" << endl;
static base third( 3 ); // local static object
cout << " (local static in main)" << endl;
create( ); // call function to create objects
base sixth( 6 ); // local object
cout << " (local automatic in main)" << endl;
}
// ordinary function for creating objects
void create( void )
{
base fourth( 4 );
cout << " (local automatic in create)" << endl;
static base fifth( 5 );
cout << " (local static in create)" << endl;
}
/* Results:
Object 1 constructor (globally created before main)
Object 2 constructor (local automatic in main)
Object 3 constructor (local static in main)
Object 4 constructor (local automatic in create)
Object 5 constructor (local static in create)
Object 4 destructor
Object 6 constructor (local automatic in main)
Object 6 destructor
Object 2 destructor
Object 5 destructor
Object 3 destructor
Object 1 destructor */
以上程序中,当局部对象离开其作用域时,即离开其函数时,就被删除,从而调动其析构函数。
在主程序运行之前,已经建立第一个对象(即全局对象first),主程序运行之后,顺序地建立自动对象second和静态对象third。
接着调用函数create( ),在create( )中建立自动对象fourth和内部静态对象fifth,退出create( )时除静态对象fifth外,删除其它对象并调用它的析构函数,即fourth。
回至主程序后,建立自动对象sixth。
退出主程序时,先删除主程序内的自动对象并调用它们的析构函数,即fourth和second。然后删除内部静态对象并调用它们的析构函数,即second和fifth。最后删除主程序外的全局对象并调用它的析构函数,即first。
此外,当局部对象离开其作用域后,就无法再被访问。例如在主函数main( )中无法访问fourth对象,而在子函数create( )中则无法访问third对象。
分享到:
相关推荐
2. C++中的构造函数有几种类型:默认构造函数、拷贝构造函数、委托构造函数等。构造函数是在创建对象时自动调用的特殊成员函数,用于初始化对象的成员变量。 3. 结构体内存对齐是C++中为了提高内存存取效率而采取的...
【C++学习笔记概述】 C++是一门强大的编程语言,其在C语言的基础上进行了扩展,引入了许多现代化的特性。这份笔记主要涵盖了C++的基础知识,包括C++11和C++17的新特性,旨在帮助初学者理解C++的核心概念。 ### C++...
在C++中,类和对象是面向对象编程的基础。对象特性包括它们的初始化和清理,主要通过构造函数和析构函数来实现。...同时,理解和掌握不同类型的构造函数及其调用方式是编写高效、可靠的C++代码的关键。
- 创建对象时,构造函数自动调用。 2. **析构函数**: - 析构函数用于清理对象释放资源。 - 析构函数无返回值,无参数。 - 每个类只能有一个析构函数。 - 对象生命周期结束时,析构函数自动调用。 #### 五、...
- **派生类的构造函数和析构函数** - **构造函数**:派生类的构造函数可以调用基类的构造函数,通过成员初始化列表来初始化基类成员。例如: ```cpp 派生类名::派生类名(参数表 0) : 基类名(参数表) { // 函数...
这部分还会涵盖构造函数和析构函数,以及静态成员和友元函数。读者还将学习如何使用访问控制修饰符(public、private和protected)来保护类的数据。 文件输入输出(I/O)是任何程序与外部世界交互的重要手段。笔记...
2. **构造函数与析构函数**:用于对象的创建和销毁,管理对象生命周期。 3. **虚函数与纯虚函数**:实现多态性,为接口设计提供支持。 4. **标准模板库(STL)**:包括容器(如vector、list、set等)、迭代器、...
此外,复制控制涉及到了C++中对象的创建和销毁的过程,包括复制构造函数、赋值操作符和析构函数。复制构造函数用于创建一个新对象作为现有对象的副本,赋值操作符用于对象之间的赋值操作,而析构函数则在对象销毁时...
6. 构造函数不能是虚函数,但析构函数可以而且常常声明为虚函数,以便在派生类对象销毁时调用正确的析构函数。 在示例代码中,`CBase`、`CDerive`和`CSubDerive`类展示了如何通过指针调用虚函数。`PrintX()`是虚...
2. 虚函数在基类中声明,目的是提供一个统一的接口,即便在派生类中被重定义,基类指针仍然可以通过虚函数调用派生类的方法。 3. 派生类可以重新定义基类的虚函数,但函数签名(返回类型、函数名、参数列表)必须...
C++类对象的深拷贝、浅拷贝构造函数学习笔记 在 C++ 中,类对象的复制是通过拷贝构造函数来完成的。拷贝构造函数是类的一种特殊构造函数,用于将一个对象的内容复制到另一个对象中。在了解拷贝构造函数之前,首先...
5. **了解C++默默编译并调用哪些函数**:C++会自动创建默认构造函数、拷贝构造函数、赋值运算符和析构函数。理解这些隐式生成的函数,能更好地控制对象生命周期和数据复制。 6. **若不想使用编译器自动生成的函数,...
### c++学习笔记之拷贝构造函数详解 在C++编程中,理解并正确使用拷贝构造函数至关重要,尤其在处理复杂数据结构和资源管理时更是如此。本文将深入探讨拷贝构造函数的概念、作用以及如何正确实现它,帮助读者避免...
这个“C & C++学习笔记集合”显然是一份综合性的资源,旨在帮助学习者深入理解和掌握这两种语言。 C 语言是基础,它的语法简洁明了,对内存管理有直接的控制,是理解计算机底层工作原理的良好起点。C 语言的核心...
对象是类的实例,通过构造函数初始化,可以调用类中的成员函数进行操作。 3. **继承与多态**:C++支持单一继承和多重继承,子类可以继承父类的属性和方法,实现代码复用。多态性主要通过虚函数和纯虚函数实现,允许...
在构造函数和析构函数中调用虚函数,或者在析构函数中抛出异常,都应当被避免,因为这些做法可能会导致未定义行为。 在对对象进行赋值操作时,应当返回一个类型为“当前类类型 &”的引用,并且要处理自我赋值的情况...