默认构造函数,拷贝构造函数,移动构造函数实例

本文通过实例演示了C++中的默认构造函数、拷贝构造函数和移动构造函数的区别。在例子中,观察了vector容器在push_back时导致的对象拷贝和析构行为。此外,还展示了swap函数在涉及智能指针时的移动构造函数应用。
摘要由CSDN通过智能技术生成

直接上例子,更能清楚的显示区别:
(例子参考自c++ primer 5th 课后题)
例子1:

#include<iostream>
#include<vector>
using namespace std;
struct X {
   
    X() {
    std::cout << "X()" << std::endl; }
    X(const X&) {
    std::cout << "X(const X&)" << std::endl; }
    X& operator= (const X& x);
    ~ X() {
    std::cout << "~X()" << std::endl; }
};

X& X::operator=(const X& x)
{
   
	// 实际上这里没有输出
    std::cout << "=X()" << std::endl;
}

void f (X& x1, X* x2)
{
   
    vector<X> xvec;
    xvec.push_back(x1);
    xvec.push_back(*x2);
    cout << "------- destructor in f -----" << endl;
}

int main(){
   
	cout << "------- constructor -----" << endl;
    X x1;
    X *x2 = new X();
    cout << "------- copy constructor -----" << endl;
    f (x1, x2);
    // f()结束会调用一次析构
    cout << "------- destructor 1-----" << endl;
    delete x2;
    cout << "------- destructor 2-----" << endl;
	return 0;
}

运行结果:
这里有个STL的知识点,为什么会在------- copy constructor -----之后会再拷贝一次和析构一次,因为vector容器一开始给的capable_size是1,当你push_back第二的对象时,就要重新开辟空间(一般来说是按照两倍空间扩容为2),把原来的东西拷贝过去,然后析构原来的空间,所以这里多调用了一次拷贝和析构。对应的你要push_back第三个时就会再次扩容(再次两倍空间扩容为4),大家可以自己试试,这里就不再展示。

------- constructor -----
X()
X()
------- copy constructor -----
X(const X&)
X(const X&)
X(const X&)
~X()
------- destructor in f -----
~X()
~X()
------- destructor 1-----
~X()
------- destructor 2-----
~X()

例子2:

#include<iostream>
using namespace std;
// .h文件
class HasPtr {
   
    friend void swap
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值