浅析c++ 三大函数
三大函数的特殊性
c++三大函数指的是拷贝构造、拷贝赋值、析构函数。这3个函数比较特殊:
- 一般的类都有这3个函数
- 这3个函数一般都是public类型的
- 拷贝构造是通过已有的对象来创建新的对象,新创建的对象数据和已有的对象相同,拷贝赋值是将已有对象的值拷贝到另一个对象中,析构函数用来内存释放和回收,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;
}
通过上面的实验可以看到,通过已有对象创建新的对象的时候会调用拷贝构造;函数实参到形参传递的时候也会调用拷贝构造函数
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;
3 析构函数.分配在栈上的对象离开作用域的时候对象会自动调用析构函数,实验结果见1图,f2()函数中的Test自动调用析构函数