;构造函数
构造函数和类同名,无类型和返回值
构造函数可以重载
构造函数编译器在对象申请完内存地址空间之后帮你调用,如果有父类先一层层的调完父类的构造函数最后子类
;析构函数
析构函数只调用一次
析构函数在出对象所属作用域之后立马被调用
析构函数无类型,返回值参数
西沟函数可以外部手工调用
;拷贝构造函数
拷贝构造函数参数为引用参数 类& object
拷贝构造函数在发生对象拷贝的时候被调用,例如函数传参如果形参是对象类型就会发生,其他类型不会,
(const 类& object)
如果实参为常量,会把实参尝试成一个对象,来匹配生成放置对象的新空间
;一个类的成员方法大部分是与数据成员相关的,但是也有不操作数据成员的方法具体看业务
;一个类如果有动态增长(经常会变的)的数据成员,要写一个算法算出这个数据而不是直接写死,如 人的年龄就会随着时间的变化而增长,如果类直接存人的年龄那么随着时间的增长势必要紧跟着修改更新年龄造成大量的写入操作,如果存的是这个的出生年月呢, 那么就可以根据出生年月算出他的年龄(1亿数据的情况下显然不适合频繁更改年龄)
;构造函数初始化数据成员,析构函数销毁对象
;如果一个成员函数返回值是数据成员的指针,那么要返回一个const * 指针保证别人不能修改这个数据成员,只能通过接口修改例如这样写就会报错不能从char * to const char*
;非标准显式调用构造(windows)
类::构造() 返回this指针
;对象出了对象作用域就被释放了(这个对象所属的作用域消失对象就会被释放此时自动调用析构函数)
;如果函数返回值是对象那么会产生拷贝构造函数,函数参数如果是对象也会产生拷贝构造函数,利用一个对象生成一个新的对象也会调用拷贝构造函数,对象等于对象也会调用拷贝构造函数
例如c语言的 struct1=struct2,//这是memcpy直接拷贝内存
c++的obj1=obj2 //也是memcpy直接拷贝内存,但是会调用一次拷贝构造
;后定义的对象先析构函数
;俩对象如果做赋值相等,如果数据成员有malloc的动态空间,就会产生重复释放的问题,但是copy对象时候会调用拷贝构造函数可以在这个函数里为新的对象的数据成员申请新的内存地址空间解决此问题
在发生对象拷贝的时候自动调用拷贝构造函数
总结:
基本数据类型不会发生拷贝构造函数
函数参数如果为对象那么会多调用拷贝构造函数造成速度慢,传引用或者地址就不会了速度快少了很多指令
//浅拷贝,只拷贝数据成员的值全部照搬
//深拷贝,数据成员如果有动态存储的空间地址,那么重新申请空间避免俩对象的数据成员指向同一片空间
obj=obj
call function and return object
class stu2(stu1);利用一个对象来生成一个对象
;无名对象,如果函数返回值必须是一个对象可以用无名对象用完就被释放掉了