[Reprint]c++ 析构函数的调用】的更多相关文章

析构函数在调用默认的析构函数和用户自己覆写的析构函数的时候有点意识模糊呢.写段代码总结下 #include <iostream> using namespace std; class Box { private: double length; public: Box(double lv=1.0):length(lv)//构造函数都没有返回值 { cout << "constructor called" << endl; } ~Box()//重写的析构…
9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #; } 上述程序会产生什么样的输出呢? 你一定会以为会输出: cls2 make cls2 delete 或者是: cls2 make cls2 make cls2 delete cls2 delete (如果你想到了后一种,说明你对派生类的构造有一定了解) 因为在构造和析构函数使用了虚函数,应该是迟绑定.但是实际的输出是: cls1 make cls2 make cls2 delete cls1 de…
#include <iostream> using namespace std; class A{ int data_a; public: A(){ data_a = ; cout << "A" << endl; } A(int a){ data_a = a; cout << "A(a)" << endl; } void show(){ cout << data_a << endl;…
http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2: 构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 参考3: C++构造函数与析构函数的调用顺序 2.构造函数.析构函数与拷贝构造函数介绍 2.1构造函数 构造函数不能有返回值 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 创建一个对象…
如果你已经从另外一种语言如C#或者Java转向了C++,你会觉得,避免在类的构造函数或者析构函数中调用虚函数这一原则有点违背直觉.但是在C++中,违反这个原则会给你带来难以预料的后果和无尽的烦恼. 正文 我想以重复本文的主题开篇:不要在类的构造或者析构函数中调用虚函数,因为这种调用不会如你所愿,即使成功一点,最后还会使你沮丧不已.如果你以前是一个Java或者C#程序员,请密切注意本节的内容-这正是C++与其它语言的大区别之一. 假设你有一个为股票交易建模的类层次结构,例如买单,卖单,等等.为该类…
构造函数和析构函数的调用顺序 构造函数的调用顺序: 当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达最底层的目标派生类的构造函数为止. 析构函数的调用书序: 当删除一个对象时,首先调用该派生类的析构函数,然后调用上一层基类的析构函数,依次类推,直到到达最顶层的基类的析构函数为止. 简单的说,构造函数是"自上向下"调用,析构函数是"自下而上"调用. 演示代码如下: #include<iostream> using…
今天看了一道迅雷的笔试题目,然后引起一段思考,题目如下: 下列关于虚函数的说法正确的是()A.在构造函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效.B.在析构函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效.C.静态函数不可以是虚函数D.虚函数可以声明为inline 此题答案给的是BCD,当时我就产生很大疑惑,所以我对四个选项依依来验证. 1.首先对于AB选项,我做了如下代码: #include <iostream> using namespace std; class Clas…
1.构造函数的调用顺序 基类构造函数.对象成员构造函数.派生类本身的构造函数 2.析构函数的调用顺序 派生类本身的析构函数.对象成员析构函数.基类析构函数(与构造顺序正好相反) 3.特例 局部对象,在退出程序块时析构 静态对象,在定义所在文件结束时析构 全局对象,在程序结束时析构 继承对象,先析构派生类,再析构父类 对象成员,先析构类对象,再析构对象成员 4.例子 #include <iostream> using namespace std; class Base1 { public: Ba…
一般而言,析构函数调用的顺序和构造函数调用顺序相反,但是,对象的存储类别可以改变调用析构函数的顺序.举例说明: CreateAndDestroy类的定义 CreateAndDestroy类的成员函数的定义 测试函数 构造函数和析构函数的调用顺序: 分析 全局作用域内定义的对象的构造函数,在文件内任何其他函数(包括main函数)开始执行之前调用,当main函数执行结束时,相应的析构函数被调用,如上面的Object 1. exit函数迫使程序立即结束,不执行自动对象的析构函数.当程序中检测到输入中有…
一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: • 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. • 改造基类函数:在派生类中声明一个或多个与其(某个)基类中的成员函数同名的成员函数,并将它(们)根据新的需求进行重写 • 发展新的成员:在派生类中添加新的成员变量和成员函数,其中新添加的成员要求必须和基类中的成员不同名,并且应当保证新添加的成员会使派生类在功能上相比其基类有所发展 • 重写派生类的构造函数和析构函数…
1.不要在构造函数中调用虚函数的原因 在概念上,构造函数的工作是为对象进行初始化.在构造函数完成之前,被构造的对象被认为“未完全生成”.当创建某个派生类的对象时,如果在它的基类的构造函数中调用虚函数,那么此时派生类的构造函数并未执行,所调用的函数(派生类的虚函数)可能操作还没有被初始化的成员,将导致灾难的发生. 2.不要在析构函数中调用虚函数的原因 同样的,在析构函数中调用虚函数,函数的入口地址也是在编译时静态决定的.也就是说,实现的是实调用而非虚调用. 考察如下例子. #include <io…
C++类的数组中构造函数和析构函数的调用顺序(2) 对于如下的代码: #include<iostream> using namespace std; class CBase { private: static int count; public: int id; public: CBase() { id = CBase::count++; cout << "CBase():Constructor:" <<id<< endl; } ~CBa…
这个问题来自于<Effective C++>条款9:永远不要在构造函数或析构函数中调用虚函数 . 假设有如下代码: class Transaction {// 所有交易的基类 public: Transaction(); ;//建立依赖于具体交易类型的登录项 ... }; Transaction::Transaction() //实现基类的构造函数 { ... logTransaction(); //最后,登录该交易 } class BuyTransaction: public Transac…
在构造函数和析构函数中调用虚函数不是多态,因为编译时即可确定调用的是哪个函数.如果本类有该函数,调用的就是本类的函数:如果本类没有,调用的就是直接基类的函数:如果基类没有,调用的就是间接基类的函数,以此类推.例如: #include<iostream> using namespace std; class A { public: virtual void hello(){cout<<"A::hello()"<<endl;} virtual void…
示例1: #include<iostream> using namespace std; class CDemo{ public: ~CDemo(){cout<<"destructor"<<endl;} }; void Func(CDemo obj){ cout<<"func"<<endl; } CDemo d1; CDemo Test(){ cout<<"test"<…
搜索MSDN的资源可以找到答案: 原文如下http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=473449&SiteID=1 以下是关于SqlDataReader.CLose()方法的解释: http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.close.aspx 注意这段文字: Do not call Close or Dispose o…
前些天想把以前写的内存池算法重写一遍,跨平台是第一目标,当时突发奇想,因为不愿意做成一大堆#if..#end,所以想利用C++的多态性,但是怎么让内存池完好退出却没想到自认为完美的方案.但是一个很偶然的机会想到在基类的析构函数中调用虚函数来做文章,不过又一想,一个类如果有虚函数,那么编译器会在即使没写构造函数的情况下也会生成构造函数,那么如果想类的构造与析构函数中强行调用虚函数会出现什么情况呢?今天来研究一下这个问题. 首先看一段测试代码 #include <stdio.h> class CB…
看下面的这段代码,问 print调用的是基类还是派生类的版本? 答案是 基类... 可能大家会很惊讶,print不是virtual function 吗?为什么不是调用派生类的版本呢? 首先,当定义一个派生类的对象的时候, 由于 base class 构造函数的执行更早于 derived class构造函数, 所以当 base class constructor 调用的时候,派生类的成员尚未初始化(说明,这个时候真正的 虚函数表尚未完全初始化). 如果这个时候调用 派生类的函数(可能使用未初始化…
在base class构造期间,virtual函数不是virtual函数. 构造函数.析构函数中不要调用virtual函数.…
ilocker:关注 Android 安全(新手) QQ: 2597294287 class Transaction { //所有交易的 base class public: Transaction(); ; //做出一份因类型不同而不同的日志记录 … } Transaction::Transaction() { … logTransaction(); } derived class: class BuyTransaction : public Transaction { public: vir…
转自 http://www.jb51.net/article/37527.htm,感谢作者 #include "stdafx.h"      #include <iostream>      using namespace std;      class B      {      public:          B():data(0)    //默认构造函数          {               cout << "Default con…
关于构造函数的一个违反直觉的行为 我会以重复标题开始:你不应该在构造或者析构的过程中调用虚函数,因为这些调用的结果会和你想的不一样.如果你同时是一个java或者c#程序员,那么请着重注意这个条款,因为这是c++同它们不一样的地方. 假设你已经有一个为股票交易建模的类继承体系,它可以买卖股票等.这些交易的可审计性很重要,所以每次交易对象被创建的时候,需要在审计日志中创建一个合适的记录.这看上去是解决问题的合理方法: class Transaction { // base class for all…
如上. 这是因为:delete派生类对象时,先调用派生类的析构函数,然后再调用基类的析构函数:此时如果调用纯虚函数的话,派生类的对象已经被破坏了,所以会报错. http://www.cnblogs.com/cswuyg/archive/2012/08/22/2650610.html…
老师在课堂上讲到了return语句在执行时会自动调用对象的析构函数.我编写了下述代码测试发现整个程序析构函数调用次数与构造函数不等,这样难道不会产生内存泄漏吗? 源代码如下: #include <iostream>using namespace std; class A {public:    A(int i = 1) :x(i){ cout << "constructed." << endl; }    ~A() { cout << &…
測试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; } ~base() { cout<<"base destroyed!"<<endl; } };…
结论:只有当类的某个实例化对象的构造函数执行完毕,而且当该对象退出作用域时,才会执行析构函数. 如果在执行构造函数的过程中抛出了异常,就不会调用析构函数 上测试代码: class Test { public: Test() { cout << "Test() begin..." << endl; ); cout << "Test() end" << endl; } ~Test() { cout << &qu…
在实习的单位搞CxImage库时不知为什么在Debug时没有问题,但是Release版里竟然跳出个Pure virtual function call error! 啥东西呀,竟然遇上了,就探个究竟吧! MSDN上的解释 http://forums.msdn.microsoft.com/zh-CN/clr/thread/bfa759a8-0cc0-4d65-8711-d2d0d6765687/ 这时讲得很详细 http://www.artima.com/cppsource/pure_virtua…
做个实验,看一下成员变量的构造析构,父类子类的构造析构,以及虚函数对调用的影响. #include <iostream> using namespace std; class Member { public: Member(int n):m_n1(n) { cout<<"Member::Member("<<m_n1<<")"<<endl; } ~Member() { cout<<"Me…
小结 1.cpy的垃圾回收会对调用__del__多次:pypy仅仅一次: https://www.liaoxuefeng.com/wiki/1016959663602400/1016966024263840 PyPy是另一个Python解释器,它的目标是执行速度.PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度. 绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python…
在STL中的容器中的析构函数中,会经常调用destroy()这个函数 在STL中  destroy()被重载了 这点在这里到不去讨论 这里贴最简单的那个版本 template<class T> inline void destory(T * pointer) { pointer->~T(); } 这里通过指针调用了析构函数.C++ 显示析构函数是一个怎么执行流程呢? 2点来讨论: 1)通过指针或者引用 2)通过值 #include <iostream> using names…