我们来分析下面这段代码:
#include <iostream>
#include <vector>using namespace std;struct X {X() {cout << "构造函数X()" << endl;}X(const X &) {cout << "拷贝构造函数X(const X&)" << endl;}X &operator=(const X &rhs) {cout << "拷贝赋值运算符 = (const X&)" << endl;return *this;}~X() {cout << "析构函数~X()" << endl;}
};void f1(X x) {}void f2(X &x) {}int main() {cout << "局部变量:" << endl;X x;cout << endl;cout << "非引用参数传递:" << endl;f1(x);cout << endl;cout << "引用参数传递:" << endl;f2(x);cout << endl;cout << "动态分配:" << endl;X *px = new X;cout << endl;cout << "添加到容器中:" << endl;vector<X>vx;vx.push_back(x);cout << endl;cout << "释放动态分配对象:" << endl;delete px;cout << endl;cout << "间接初始化和赋值:" << endl;X y = x;y = x;cout << endl;cout << "程序结束:" << endl;return 0;
}
测试结果:
- X x:调用了构造函数
- f1(x),因为是非引用参数传递,所以会有临时量的产生,调用拷贝构造函数初始化临时量,然后用析构函数销毁临时量。
- f2(x),引用参数传递,所以不会有临时量产生,也就不会有拷贝成员的操作。
- 动态分配,调用构造函数,这个new出来的动态内存需要我们手动释放,所以此时不会调用析构函数。
- 添加到容器中,调用拷贝构造函数。
- 释放动态分配对象,此时我们手动释放new出来的内存,所以调用了析构函数。
- X y = x:调用拷贝构造函数
- y = x:调用拷贝赋值运算符
- 程序结束时,调用了三个析构函数,分别销毁了x,y,vx的第一个元素
如有错误,请在评论区留言指正一下,谢谢 !!!