话不多说,直接上重点:
1.在函数中直接创建对象时(不申请空间),不用括号才能调用无参的构造函数;
用括号(括号内必须填参数,否则既不调用无参也不调用有参)只能调用有参构造函数。
这种情况下,由于创建的是一个实例对象,所以只要调用了构造函数必然会调用析构函数。
2.在函数中使用new创建对象时,不用括号调用默认函数构造或唯一构造函数;
用括号(括号内无参)调用无参构造函数;用括号(括号内有参)调用有参构造函数;
在函数中使用delete释放空间后,才会调用析构函数。
可由以下代码证明:
#include "stdafx.h"
class ClassTest
{
private:
int x;
public:
int* p;
public:
ClassTest()
{
x = 2;
p = new int[x];
printf("无参构造函数被调用了\n");
}
ClassTest(int x)
{
this->x = x;
p = new int[x];
printf("有参构造函数被调用了\n");
}
~ClassTest()
{
delete[] p;
printf("析构造函数被调用了\n");
}
};
void Test()
{
//ClassTest v; //无括号调用无参构造函数,调用析构函数
//ClassTest v(); //括号内无参数不调用构造函数,不调用析构函数
//ClassTest v(3); //括号内有参数调用有参构造函数,调用析构函数
ClassTest* pv = new ClassTest; //无括号调用默认构造函数或唯一构造函数
//ClassTest* pv = new ClassTest(); //括号内无参数调用无参构造函数
//ClassTest* pv = new ClassTest(1); //括号内有参数调用有参构造函数
delete pv; //只有在这里delete掉new的空间才会调用类的析构函数
}
int _tmain(int argc, _TCHAR* argv[])
{
Test();
return 0;
}
以上为本人学习C++过程的一点学习笔记,欢迎大家勘误指正或做进一步的讨论。