您的当前位置:首页正文

浅析c++三大函数--GeekBand

来源:图艺博知识网

浅析c++ 三大函数

三大函数的特殊性

c++三大函数指的是拷贝构造、拷贝赋值、析构函数。这3个函数比较特殊:

  1. 一般的类都有这3个函数
  2. 这3个函数一般都是public类型的
  3. 拷贝构造是通过已有的对象来创建新的对象,新创建的对象数据和已有的对象相同,拷贝赋值是将已有对象的值拷贝到另一个对象中,析构函数用来内存释放和回收,java中虚拟机会自动回收,但在c++中new出来的对象在堆区,需要我们手动释放

三大函数详解

1 拷贝构造. 什么时候会用到拷贝构造函数,当我们通过一个已有的对象来构造另一个对象的时候;当函数传参的时候。

#include<iostream>
using namespace std;
class Test{
private:
    int val;
public:
    Test(int ival):val(ival){
        cout << "Test(int val)构造函数" << endl;
    }
    Test(const Test &test){
        val = test.val;
        cout << "Test(const Test &test)构造函数" << endl;
    }
    ~Test(){
        cout << "ival: " << val;
        cout << " 析构函数被调用了" << endl;
    }
};
void f(Test test){  //这里会调用拷贝构造函数

}


void f2(){  //f2函数退出时会调用析构函数
    Test test3(2);
    Test test4(test3);
}
int main(){
    Test test(1);
    cout << "-----------------------------" << endl;
    f(test);
    cout << "----------------------------" << endl;
    f2();  
    cin.get();
    return 0;
}
三大函数.jpg

通过上面的实验可以看到,通过已有对象创建新的对象的时候会调用拷贝构造;函数实参到形参传递的时候也会调用拷贝构造函数

2 拷贝赋值. 通过操作符=重载来将已有对象的数据拷贝给现有对象,函数实现的时候要注意对要赋值给的对象已有的数据清除(含有指针)

Test & operator= (const Test &test){
        val = test.val;
        return *this;
    }
   //main 函数
    Test test4(4);
    Test test5(5);
    cout << "test5 val= " << test5.getVal() << endl;
    test5 = test4;
    cout << "test5 val= " << test5.getVal() << endl;
拷贝赋值.jpg

3 析构函数.分配在栈上的对象离开作用域的时候对象会自动调用析构函数,实验结果见1图,f2()函数中的Test自动调用析构函数

Top