由始至终
----构造与析构
作者:HolyFire
我们在平时的生活中一般会总结出一些规律,早上起床会刷牙洗脸,晚上会洗澡睡觉,这些都成了惯例。使用瓶装调味品时先将瓶盖打开,用完后将瓶盖盖上。这是一种好习惯。但是有些人不同,他们往往偷懒,一个常常不刷牙不洗脸不洗澡的人会有体味,东西放得乱七八糟的人生房间很不整洁。这些都是我们不希望看到的。当然编程中我们也不希望代码乱七八糟。
使用一个未初始化的变量简直就是灾难,使用一个未初始化的指针将导致崩溃。这是我的忠告。在C++中初始化不会有附加的效果,不会降低效率,我们要做的是养成好习惯,产生一个对象的时候就将它初始化。
对于
Object.Init();
Object.Free();
这样的调用并不是很困难,要记住他也不是难事,但是谁都不能保证他永远不会忘记,更糟糕的是
Object.Init();
Object.Free();
没有配对使用
Object.Init();
Object.Free();
Object.Free();
或
Object.Init();
Object.Init();
Object.Free();
会带来什么样的结果,谁也不知道,而且这样的错误,编译器不会报错。这是多么可怕的错误,一个程序员最怕遇上的就是这样的逻辑错误,它可能为了找这样的一个错误花上一整天时间。
让我们看看有什么好的办法。
一个对象按时间来分析,一般有三个阶段,出生,活动,死亡。与我们要做的有什么相关之处呢,初始化,运行,释放。很好,对照一下,我们发现在对象出生的时候初始化,死亡的时候释放,如果这一切能用这样的机制来操作,我们就再也不用担心会由于忘记或错误的使用带来麻烦了。
C++里就提供了这样的机制。使用他有个约定
class Object{
public:
Object(); //与类同名的函数,该函数没有返回值,叫做构造函数
~Object(); //类似的,在构造函数名前加一个取反符号,叫做析构函数
};
构造函数将在对象产生的时候调用
析构函数将在对象销毁的时候调用
调用的过程和实现方法由编译器完成,我们只要记住他们调用的时间就行了,而且他们的调用是自动完成的,不需要我们控制。
#include <iostream>
由始至终----构造与析构(转转)
时间: 2024-09-26 16:50:51
由始至终----构造与析构(转转)的相关文章
C++中派生类的构造和析构顺序详解
派生类因为要调用基类, 所以构造和析构都是按照一定顺序进行; 构造的顺序是: 基(base) -> 派生(derived);即先构造基类, 再构造派生类; 因为 基类 是独立于派生类的, 即不会调用派生类中的对象, 所以应该先被生成; 如果派生类先于基类生成, 则因为无法调用基类资源, 可能生成失败; 析构的顺序是: 派生(derived) -> 基(base); 即先释放派生类, 再释放基类; 因为 派生类 需要先释放调用的基类资源, 所以应该优先释放; 如果基类先析构, 则有可能某些资源被
【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数
类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);
Python类方法__init__和__del__构造、析构过程分析_python
最近学习<Python参考手册>学到Class部分,遇到了类的构造析构部分的问题: 1.什么时候构造? 2.什么时候析构? 3.成员变量如何处理? 4.Python中的共享成员函数如何访问? ------------------------ 探索过程: 1.经过查找,Python中没有专用的构造和析构函数,但是一般可以在__init__和__del__分别完成初始化和删除操作,可用这个替代构造和析构.还有一个__new__用来定制类的创建过程,不过需要一定的配置,此处不做讨论. 2.类的成员函
(多)继承中的构造与析构
(多)继承中的构造与析构 问:析构函数为何定义为虚函数较好? 答:若不这样,基类指针指向子类,再删除该指针时,子类的析构函数得不到调用,子类中比父类多的那些变量得不到回收,造成内存泄露.
C++构造和析构以及虚函数应用
#include <iostream> using namespace std; class A { public: A()//构造函数不能申明为虚函数,不然会报错 { cout<<"构造函数A"<<endl; } ~A() //析构函数应该定义成虚函数,如果不定义成虚函数则会造成内存泄露 { cout<<"析构A"<<endl; } virtual void DoSomething() { cout<
php学习笔记 面向对象的构造与析构方法
复制代码 代码如下: <?php /* * 1.对象中成员的访问(在一个对象的内部方法中,去访问本对轩昂中的其他方法和成员属性) * 2.在对象中的方法中都默认有一个$this关键字,这个关键字代表调用这个方法的对象 * * 构造方法 * * 1.是对象创建完成后,"第一个""自动调用"的方法 * * 2.构造方法的定义,方法名是一个固定的, * 在php4中:和类名相同的方法就是构造方法 * 在php5中:构造方法选择使用 魔术方法__construct()
《Effective C++》读书笔记09:绝不在构造和析构过程中调用virtual函数
首先明确一下,对于一个继承体系,构造函数是从基类开始调用了,而析构函数则正 好相反,从最外层的类开始. 对于在构造函数中调用virtual函数,先举个例子: 1 class Transaction //所有交易的基类 2 { 3 public: 4 Transaction(); 5 virtual void logTransaction() const = 0;//日志记 录,因交易类型的不同而有不同的记录 6 } 7 8 Transaction::Transaction()//构造函数实现 9
php学习笔记 面向对象的构造与析构方法_php基础
复制代码 代码如下: <?php /* * 1.对象中成员的访问(在一个对象的内部方法中,去访问本对轩昂中的其他方法和成员属性) * 2.在对象中的方法中都默认有一个$this关键字,这个关键字代表调用这个方法的对象 * * 构造方法 * * 1.是对象创建完成后,"第一个""自动调用"的方法 * * 2.构造方法的定义,方法名是一个固定的, * 在php4中:和类名相同的方法就是构造方法 * 在php5中:构造方法选择使用 魔术方法__construct()
继承与包含中构造与析构的执行顺序
[HP笔试题目] 一个类A继承类B并且包含C,B中包含D.在构造A的时候,先构造B中的D,再构造B,然后构造A中的C,最后构造A.虚构的过程刚好相反.例子如下:| #include<iostream.h> class IDCart{ public: IDCart() { cout<<"IDCart construstor"<<endl;