能直接调用析构函数,不能直接调用构造函数

  在我们进行面向对象程序设计的时候,我们肯定要设计自己的类,这样一来,我们就需要设计自己需要的构造函数和析构函数,那么我们可以通过指针直接调用构造函数和析构函数吗?

进行验证:

#include <iostream>
using namespace std;
//程序说明直接调用构造函数会出现错误,直接调用析构函数是成功的。
class A{
	public:
		int id;
		A(int i):id(i){cout<<"ctor.this = "<<this<<" id = "<<id<<endl;
		}
		~A(){cout<<cout<<"dtor.this = "<<this;
		}
};
int main3(){
	A* pa = new A(1);
	cout<<pa->id<<endl;
	cout<<"直接调用构造函数失败:"<<endl;
	//pa->A(1);
	cout<<"直接调用析构函数成功:"<<endl;
	//delete pa;
	pa->~A() ;
	return 0;
}

  经过上述代码,我们发现,在类外直接调用构造函数是不行的,但是可以直接调用析构函数。

原文地址:https://www.cnblogs.com/yjds/p/8948336.html

时间: 2024-11-09 19:05:00

能直接调用析构函数,不能直接调用构造函数的相关文章

构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序

构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 对象是由“底层向上”开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止.因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明0,就调用直接基类的默认构造函数.在对象析构时,其顺序正好相反.   下面简单介绍下这三个函数. 构造函数       1.构造函数不能有返回值  

delete了,析构函数却没有调用

析构函数在对象的生命结束时,会自动调用,大家所熟知的智能指针就是根据析构函数的这种特性而实现的,包括Qt的内存管理机制,也都是利用了析构函数的这一机制来实现的.c++创始人Bjarne Stroustrup在创造析构函数也是出于这种目的的,可见如果析构函数用的好的话,可以省去我们很多工作量,你不再需要手工调用删除对象使用的堆内存,你只需要把要删除的堆内存放入析构函数就行了,因为当对象离开其生命周期的时候,析构函数会自动调用,C++语言规范是这样规定析构函数的调用的: Destructors ar

C++中new的用法及显示调用析构函数

最近被问到了C++内存池的问题,其中不免涉及到在指定内存地址调用对象构造函数以及显示调用对象析构函数的情况. C++中new的用法 new是C++中用于动态内存分配的运算符,在C语言中一般使用malloc函数. (1)plain new顾名思义就是普通的new,就是我们惯常使用的new.分配内存,调用构造函数,在C++中是这样定义的: 1 void* operator new(std::size_t) throw(std::bad_alloc); 2 void operator delete(v

关于c++显示调用析构函数的陷阱

一.文章来由 现在在写一个项目,需要用到多叉树存储结构,但是在某个时候,我需要销毁这棵树,这意味着如果我新建了一个树对象,我很可能在某处希望将这个对象的声明周期终结,自然会想到显示调用析构函数,但是就扯出来这么大个陷阱. 二.原因 在了解为什么不要轻易显示调用析构函数之前,先来看看预备知识. 为了理解这个问题,我们必须首先弄明白"堆"和"栈"的概念. 1)堆区(heap) -- 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收.注意它与数据结构中的堆

子类如果不实例化则不会调用它自身的静态构造函数

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication6 { class Program { static void Main(string[] args) { #region 如果注释掉, 则Stat2.Instance为null 报错 Stat1.DoSth(); Stat2 st2 = new Stat2(); #en

反射调用与Lambda表达式调用

想调用一个方法很容易,直接代码调用就行,这人人都会.其次呢,还可以使用反射.不过通过反射调用的性能会远远低于直接调用——至少从绝对时间上来看的确是这样.虽然这是个众所周知的现象,我们还是来写个程序来验证一下.比如我们现在新建一个Console应用程序,编写一个最简单的Call方法. class Program { static void Main(string[] args) { } public void Call(object o1, object o2, object o3) { } }

JS中的间歇调用setInterval()与超时调用setTimeout()相关总结

超时调用需要使用window.setTimeout(code,millisec)方法 它接受两个参数:要执行的代码和以毫秒表示的时间(即在执行代码前需要等待多少毫秒).其中第一个参数可以是一个包含JS代码的字符串(就和在eval()函数中使用的字符串一样),也可以是一个函数.第二个参数表示等待多长时间的毫秒数,但经过该事件后指定的代码不一定会执行. 这是因为JS是一个单线程序的解释器,一定时间内只能执行一段代码,为了控制要执行的代码就有一个JS任务队列,这些任务会按照将他们添加到队列的顺序执行.

js调用php和php调用js的方法举例

js调用php和php调用js的方法举例1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <script type="text/javascript" src="b.php?action=test"></script> <script type="text/javascript" > alert(jstext); </script> 在b

.net 调用java或者Java调用.net返回的数据转换问题

经常发现这类问题,主要是返回的数据转换问题造成,一般情况下不要直接引用wsdl的方式(如果的调用.Net开发的webservice可以),用HttpWebRequest方式获取返回的数据,然后再解析,这种方式比引用wsdl成功率高,至于如何传参数,可以用 SoapUI工具进行分析,能看到该怎样传参数 还有用HTTPAnalyzerFull工具可以进行抓包,看看提交和返回的是什么内容 不管是.net 调用java或者Java调用.net,一般用以上两个工具都能解决问题 public string