(转载)http://blog.csdn.net/zhangxinrun/article/details/6056321

代码: 
view plaincopy to clipboardprint?
#include <iostream>   
using namespace std;   
  
class A   
{   
public:   
    A()   
    {   
        cout << "Default constructor is called./r/n";   
    }   
  
    A(int ix)   
    {   
        cout << "Another constructor is called./r/n";   
    }   
  
    ~A()   
    {   
        cout << "Destructor is called./r/n";   
    }   
};   
  
int main()   
{   
    A a1;          // <1>   
    a1.A::A();     // <2> 显示调用默认构造函数(写成a1.A()会报错)   
    a1.A::A(7);    // <3> 显示调用非默认构造函数(写成a1.A(7)会报错)   
    a1.A::~A();    // <4> 显示调用析构函数, 但是此时对象a1并没有销毁(写成a1.~A()不会报错)   
  
    // A a2();     // 这样写没报错, 但也没调用任何构造函数和析构函数.   
    A a3 = A();    // <5> 完整写法: A a3 = A::A();   
    A a4(77);      // <6>   
    A a5 = A(777); // <7> 完整写法: A a5 = A::A(777);   
  
    return 0;   
    // <8>, <9>, <10>, <11> return语句之后, 右括号之前析构函数被隐式调用. a1, a3, a4, a5对象在这里被销毁.   
}  
#include <iostream>
using namespace std;

class A
{
public:
    A()
    {
        cout << "Default constructor is called./r/n";
    }

A(int ix)
    {
        cout << "Another constructor is called./r/n";
    }

~A()
    {
        cout << "Destructor is called./r/n";
    }
};

int main()
{
    A a1;          // <1>
    a1.A::A();     // <2> 显示调用默认构造函数(写成a1.A()会报错)
    a1.A::A(7);    // <3> 显示调用非默认构造函数(写成a1.A(7)会报错)
    a1.A::~A();    // <4> 显示调用析构函数, 但是此时对象a1并没有销毁(写成a1.~A()不会报错)

// A a2();     // 这样写没报错, 但也没调用任何构造函数和析构函数.
    A a3 = A();    // <5> 完整写法: A a3 = A::A();
    A a4(77);      // <6>
    A a5 = A(777); // <7> 完整写法: A a5 = A::A(777);

return 0;
    // <8>, <9>, <10>, <11> return语句之后, 右括号之前析构函数被隐式调用. a1, a3, a4, a5对象在这里被销毁.

输出: 
view plaincopy to clipboardprint?
Default constructor is called. // <1>   
Default constructor is called. // <2>   
Another constructor is called. // <3>   
Destructor is called.          // <4>   
Default constructor is called. // <5>   
Another constructor is called. // <6>   
Another constructor is called. // <7>   
Destructor is called.          // <8>   
Destructor is called.          // <9>   
Destructor is called.          // <10>   
Destructor is called.          // <11>  
Default constructor is called. // <1>
Default constructor is called. // <2>
Another constructor is called. // <3>
Destructor is called.          // <4>
Default constructor is called. // <5>
Another constructor is called. // <6>
Another constructor is called. // <7>
Destructor is called.          // <8>
Destructor is called.          // <9>
Destructor is called.          // <10>
Destructor is called.          // <11> 
总结:  
C++中, 构造函数和析构函数可以被显示调用. 显示调用默认构造函数的语法: a.A::A();(不能写成a.A();) , 显示调用非默认构造函数的语法: a.A::A(7);(不能写成a.A(7);); 显示调用析构函数的语法: a.A::~A();(可以写成a.~A();) . 
显示调用构造函数和析构函数就像调用一般的函数一样, 并不意味着创建或销毁对象; 
如果构造函数中动态分配了空间, 则显示调用构造函数会造成内存泄露. 创建对象时的隐式构造函数调用已经为对象分配了动态内存. 当用创建好的对象显示调用构造函数时, 对象指向的动态内存更新显示调用时所分配的, 对象生命周期结束时析构函数所释放掉的是后一次分配的动态内存, 也就是说创建对象时隐式构造函数调用所分配的那块内存泄漏了. 
如果析构函数中释放动态分配的空间, 则会造成多次释放同一内存, 会出现严重错误.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/g5dsk/archive/2009/11/06/4775089.aspx

(转载)C++中, 构造函数和析构函数能不能被显示调用?的更多相关文章

  1. C++学习笔记(7)----类的数组中构造函数和析构函数的调用顺序

    C++类的数组中构造函数和析构函数的调用顺序(2) 对于如下的代码: #include<iostream> using namespace std; class CBase { priva ...

  2. 显示调用C++中构造函数和析构函数(有什么弊端)

    1.C++中, 构造函数和析构函数可以被显示调用. 显示调用默认构造函数的语法: a.A::A();(不能写成a.A();) , 显示调用非默认构造函数的语法: a.A::A(7);(不能写成a.A( ...

  3. C++C++中构造函数与析构函数的调用顺序

    http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...

  4. (转)PHP中构造函数和析构函数解析

    --http://www.jb51.net/article/56047.htm 构造函数 void __construct ([ mixed $args [, $... ]] ) PHP 5 允行开发 ...

  5. c++中构造函数 、析构函数的作用域详解

    我们知道,在c++中,析构函数是在函数作用域尾部执行析构函数,从而释放对象,但是有一种情况下,析构函数作用域发生变化,请看下面的例子,定义了一个Stock类,Stock类存放在stock.h中,主调用 ...

  6. C++中构造函数或析构函数定义为private

    转自:http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278971.html 很多情况下要求当前的程序中只有一个object.例如一个程序只有 ...

  7. php 中构造函数和析构函数

    构造函数: 在对象实例化时被调用,一个类中只能有一个构造函数,在类中起初始化的作用. 析构函数: 在对象结束时被自动调用. 话不多说,用一段代码来说明两者的区别: <?php //定义一个类 c ...

  8. C++中构造函数和析构函数的调用顺序

    一般而言,析构函数调用的顺序和构造函数调用顺序相反,但是,对象的存储类别可以改变调用析构函数的顺序.举例说明: CreateAndDestroy类的定义 CreateAndDestroy类的成员函数的 ...

  9. PHP中构造函数和析构函数解析

    构造函数 void __construct ([ mixed $args [, $... ]] ) PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先调用 ...

随机推荐

  1. Ext.Net学习笔记02:Ext.Net用法概览

    这两天越来越觉得Ext.Net很强大,如果运用熟练可以极大的提高编程效率.如果你也要学习Ext.Net,推荐你看一下<Ext.Net Web 应用程序开发教程>. Ext.Net与ExtJ ...

  2. js判断手机浏览器操作系统和微信浏览器的方法

    做手机端的前端开发,少不了对手机平台的判断.如,对于app下载,就要判断在Android平台下就显示Android下载提示:在iOS平台下就显示iOS下载提示. 今天就为大家介绍一下用js判断手机客户 ...

  3. iOS 开发中的单例

    在iOS开发中经常会用到单例,比如每个iOS程序本身就是一个单例,在比如进行个人偏好设置存储的时候用的也是一个单例.那我们如何自己来写一个单例类呢,用自己的单例对象呢?下面是我写的一个单例的头文件里的 ...

  4. WPF动画之关键帧动画(2)

    XAML代码: <Window x:Class="关键帧动画.MainWindow" xmlns="http://schemas.microsoft.com/win ...

  5. 初步认识 Web Service

     Web Service初步认识   Web Service:不是框架,不是一种技术,而是一种跨平台,跨语言的规范. 作用:异构平台之间的交互,解决了不同平台,不同语言所编写的应用之间的相互调用.(远 ...

  6. java web环境配置类型问题

    一, cmd查看jdk版本 java -version cmd查看jdk安装路径 java -verbose 二, 如果出现了上述的错误按照如下的3个步骤解决:1.首先关闭MyEclipse工作空间. ...

  7. 数据挖掘-关联规则分析[ZZ]

    1.什么是关联规则 "尿布与啤酒"的故事大家都有听过,这里就不罗嗦了. 按常规思维,尿布与啤酒风马牛不相及,若不是借助数据挖掘技术对大量交易数据进行挖掘分析,沃尔玛是不可能发现数据 ...

  8. 最近使用Qt遇到的一些小问题解决办法总结

    1. 我想获取当前星期几这样的,我没在API里面找到这样的函数,但是我找到了今天是第几天这样的,所以自己转换一下就OK了: typedef struct { int numInWeek; QStrin ...

  9. Cocos2d-x 3.0 cocostudio骨骼动画的动态换肤

    概述 游戏中人物的状态会发生改变,而这种改变通常要通过局部的变化来表现出来.比如获得一件装备后人物形象的改变,或者战斗中武器.防具的损坏等.这些变化的实现就要通过动态换肤来实现.在接下来的这个Demo ...

  10. CSS Masking(翻译)

    原文地址:http://www.html5rocks.com/en/tutorials/masking/adobe/ 关于计算机图形,两种常见的操作是:cliping(裁剪) and  masking ...