总结C++构造函数、拷贝构造和析构函数的相关注意点。
构造函数分类
- 按照类型分类
普通构造
拷贝构造
- 按照参数分类
有参构造
无参构造
构造函数调用
默认构造调用
注意点: 不能用Person p();调用默认构造函数,原因是编译器以为这是个函数的声明。如下图,调用后并未打印任何日志,编译器认为这是个函数声明。
括号法调用
显示法调用
隐式法调用
如果使用以下方式调用呢?
Person(10);
以上调用称为匿名调用,在程序执行完这句后,就直接回收资源,释放对象了。
Person p1(10);
Person(p1);
不可以调用拷贝构造函数初始化匿名对象,编译器认为代码为Person p1;出现重复对象,如下图
构造函数和析构函数调用顺序
- 调用默认构造
#include<iostream>
using namespace std;
class Person
{
public:
Person()
{
cout << "默认构造" << endl;
}
~Person()
{
cout << "析构函数" << endl;
}
private:
int m_age;
};
void Test1()
{
Person p;
}
int main()
{
Test1();
return 0;
}
运行结果
默认构造
析构函数 .
- 调用有参构造
#include<iostream>
using namespace std;
class Person
{
public:
Person()
{
cout << "默认构造" << endl;
}
Person(const int age)
{
this->m_age = age;
cout << "有参构造" << endl;
}
~Person()
{
cout << "析构函数" << endl;
}
private:
int m_age;
};
void Test1()
{
Person p(10);
}
int main()
{
Test1();
return 0;
}
运行结果
有参构造
析构函数
- 调用拷贝构造
#include<iostream>
using namespace std;
class Person
{
public:
Person()
{
cout << "默认构造" << endl;
}
Person(const int age)
{
this->m_age = age;
cout << "有参数构造" << endl;
}
Person(const Person& p)
{
this->m_age = p.m_age;
cout << "拷贝构造" << endl;
}
~Person()
{
cout << "析构函数" << endl;
}
private:
int m_age;
};
void Test1()
{
Person p(10);
Person p1(p);
}
int main()
{
Test1();
return 0;
}
运行结果
有参数构造
拷贝构造
析构函数
析构函数
最后留一个思考:拷贝构造如果不加&会怎么样?