话说现在我已经习惯了这种生活,以前俺是中午不睡觉会死星人,现在感觉不睡觉也就是那样了,准备把自己的时间好好安排一下了,由于我是在培训班,所以每天的时间也很紧的,以前打算每天晚上更新博客的,现在看来实现不了了。我决定在每天中午,回顾前天学习的内容,并巩固上午所学的。我想这应该是我学习效率最高的方法了。在这感谢一下@奋斗的小歌谢谢你的鼓励,我想这将是我以后坚持不下去的动力,我会坚持的不就是6个月吗?加油!!
好了,废话不说了,进入今天的主题吧!
析构函数:就是用来释放对象的。c++中一切都是按对象来说的,但是对象里面也有成员变量,成员函数之类的,所以析构函数就是来释放对象所占的内存空间的。
析构函数的特点:无返回值,不能重载,必须公有,不带任何参数
那么,什么时候会用到析构函数呢?总结一句话就是对象马上释放的时候!
1、离开对象的作用域
2、 销毁对象
3、删除一个指向对象的时候
#include <iostream> using namespace std; class Test { public: Test(){cout<<"这是不带参的默认构造函数"<<endl;} ~Test(){cout << "这是析构函数"} }; void main() { Test t; return ; } /******************************************/ The output is 这是不带参的默认构造函数 这是析构函数
浅拷贝:一个类的对象同过赋值操作可以把自己拷贝给相同类的另外一个对象。但是这种赋值方式是对象数据成员之间的相互赋值,这可能创建的仅仅是一种物理拷贝
当所拷贝的对象里面包含指针的成员变量的时候,这种浅拷贝会造成二次删除,这是不合法的。所以应当避免这种拷贝
class Thing { private: int a,b; int *p public: Thing ():b(0){a=0,p=&a} }; Thing t1,t2; t1=t2;
在这个程序段里,我声明了一个类Thing ,里面包含一个指针类型的成员变量,int *p,在接着我把 Thing 类型的 t2 赋值给t1,这个时候就把t2的指针的值付给了t1 ,指针同时指向t2的 成员变量a,在释放内存的时候,先释放t2,再释放t1的时候,发现t1的指针变量所指向的内存已经被释放了,所以就会抛出异常,就是二次删除。
当然在这个程序中构造方法使用了初始化列表对数据成员进行初始化,比在函数中进行赋值要高效
在一个类中,访问函数get和print函数通常要作为const成员函数,常成员函数,不能修改成员变量的值。
this 指针
每一个对象都包含了一个指向自身的指针,称作this指针。他是隐藏的,但是可以在需要的地方显式的调用。
在用指针的时候要注意操作符的优先级,一般我们要像(*this)这样用
this指针的链式表达式:
class Thing { public: Thing & setx(int a ) { (*this).x=a; return *this; } Thing & sety(int b) { (*this).y=b; return *this; } Thing & setz(int c) { (*this).z=c; return *this; } }; Thing thing ; thing.setx(1).sety(2).setz(3); /********************************/ 打印输出后会输出Thing的xyz的值:1 2 3
如果把引用去掉会发生怎么样的变化呢?
去掉引用 函数返回的就是一个临时的对象,他会把 2 3 付给新生成的两个临时对象,所以去掉引用发生的结果不能预测,因此我们一定要避免这种情况。
this指针的特点:
1、this指针由编译器自动在声明类对象是创建(不需要自己定义)
2、每个对象或者函数(成员变量,或函数 非static都隐藏了一个this指针)
3、this指针都保留了指向该对象的地址
4、当类的非static成员函数访问另一个非static函数时,编译器会自动将对象的地址传递给内部调用的函数。(就是在一个成员函数内调用另一个成员函数时,不用管对象的地址)