(转载)C++中, 构造函数和析构函数能不能被显示调用?
(转载)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++中, 构造函数和析构函数能不能被显示调用?的更多相关文章
- C++学习笔记(7)----类的数组中构造函数和析构函数的调用顺序
C++类的数组中构造函数和析构函数的调用顺序(2) 对于如下的代码: #include<iostream> using namespace std; class CBase { priva ...
- 显示调用C++中构造函数和析构函数(有什么弊端)
1.C++中, 构造函数和析构函数可以被显示调用. 显示调用默认构造函数的语法: a.A::A();(不能写成a.A();) , 显示调用非默认构造函数的语法: a.A::A(7);(不能写成a.A( ...
- C++C++中构造函数与析构函数的调用顺序
http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...
- (转)PHP中构造函数和析构函数解析
--http://www.jb51.net/article/56047.htm 构造函数 void __construct ([ mixed $args [, $... ]] ) PHP 5 允行开发 ...
- c++中构造函数 、析构函数的作用域详解
我们知道,在c++中,析构函数是在函数作用域尾部执行析构函数,从而释放对象,但是有一种情况下,析构函数作用域发生变化,请看下面的例子,定义了一个Stock类,Stock类存放在stock.h中,主调用 ...
- C++中构造函数或析构函数定义为private
转自:http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278971.html 很多情况下要求当前的程序中只有一个object.例如一个程序只有 ...
- php 中构造函数和析构函数
构造函数: 在对象实例化时被调用,一个类中只能有一个构造函数,在类中起初始化的作用. 析构函数: 在对象结束时被自动调用. 话不多说,用一段代码来说明两者的区别: <?php //定义一个类 c ...
- C++中构造函数和析构函数的调用顺序
一般而言,析构函数调用的顺序和构造函数调用顺序相反,但是,对象的存储类别可以改变调用析构函数的顺序.举例说明: CreateAndDestroy类的定义 CreateAndDestroy类的成员函数的 ...
- PHP中构造函数和析构函数解析
构造函数 void __construct ([ mixed $args [, $... ]] ) PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先调用 ...
随机推荐
- jfinal不能正确加载html网页,总是报错的解决方法
今天自学jfinal,遇到一个很奇怪的问题,render("/index.html");总是报错. 仔细看错误日志,才发现原来是因为html网页放到了WEB-INF文件夹下面了,所 ...
- 数据操作So easy-LINQ解析
1.LINQ是什么? LINQ是Language Integrated Query的缩写,即“语言集成查询”的意思.LINQ的提出就是为了提供一种跨越各种数据源的统一的查询方式,它主要包含4个组件-- ...
- IOS之沙盒(Sandbox)机制
IOS中每个App应用程序都有一个单独封闭的文件夹,这个文件夹称为沙盒,并且苹果规定,任何App都无权访问其他App的沙盒 沙盒目录通过 FOUNDATION_EXPORT NSString *NSH ...
- 获取键盘输入或者USB扫描枪数据
/// <summary> /// 获取键盘输入或者USB扫描枪数据 可以是没有焦点 应为使用的是全局钩子 /// USB扫描枪 是模拟键盘按下 /// 这里主要处理扫描枪的值,手动输入的 ...
- 数位DP入门Ural1057
CF一战让我觉得很疲倦,所以今天感觉很慢. 昨天解D题时候,因为太累,根本连题目都没看,今天看了之后感觉不会做,听闻是数位DP问题. 有某神说过,DP的功力建立在刷过的题上,我真的毫无功力可言. 介绍 ...
- Java面向对象程序设计--泛型编程
1. 为何要进行泛型编程? 泛型变成为不同类型集合提供相同的代码!省去了为不同类型而设计不同代码的麻烦! 2. 一个简单泛型类的定义: public class PairTest1 { public ...
- notepad++使用技巧
1.将tab设置为插入4个空格而不是tab字符 1)点击设置-->首选项 2)选中转换为空格.点击蓝色数字,可以设置制表符宽度 2.对已有文档,进行tab和空格的相互转换 选中编辑-->空 ...
- linux curl命令验证服务器断点续传支持
有个同事说,发现现在对外下载安装包的服务器不支持断点续传,我听了一阵纳闷,lighttpd server对于静态文件应该默认支持断点续传的,登机器查看lighttpd配置文件发现 对断点续传的支持被禁 ...
- odoo 的 拉式 和 推式 库链
推式链的数据定义在 stock.location.path 表,视图定义在 “路线” 界面的 “push rules” 具体可参考 入库设置为 Receipt in 2 steps . push ...
- C++顺序容器类总结
主要是vector,deque,list,forward_list,array,string 插入方法: 元素访问: 元素删除: 容器赋值: forward_list有很多特殊的方法 毕竟平时forw ...