0


类和对象——默认成员函数


默认成员函数

构造函数

构造函数并不是创建一个函数,它是一种特殊的函数,给对象初始化用的。
构造函数的形式:

类名(参数){};

构造函数也可以重构,构造函数一般写在类里面实现形成内联函数。
当没有自己写构造函数的时候,会调用默认的构造函数,默认的构造函数只对自定义类型进行处理(调用它的构造函数),对内置类型不做处理。
内置类型:

int double char 指针

等等
自定义类型:类 等等。
默认构造函数:全缺省,无参,自动生成的默认构造函数
因为不对内置类型处理,所以C++11又进行了弥补,在类的成员又加了一个默认值。

析构函数

析构函数的形式:

~类名(){};

析构函数是释放类成员的资源。不是销毁对象。
析构函数可以自己写,当没有自己实现的时候会调用默认析构函数,默认析构函数对内置类型不做处理,对自定义类型会调用它的析构函数。
析构的顺序是先构造的后析构,后构造的先析构,局部先析构,全局/静态后析构。

拷贝构造函数

拷贝构造函数的形式:

类名(const类名&对象){};

如果你创建的对象想直接是另一个对象的值,就可以使用拷贝构造

classDate{public:Date(int year =1,int month =1,int day =1){
        _year = year;
        _month = month;
        _day = day;}Date(const Date& d){
        _year = d._year;
        _month = d._month;
        _day = d._day;}private:int _year;int _month;int _day;};intmain(){
    Date a(2022,8,11);
    Date b(a);
    Date c = a;return0;}

第26,27行的是同一个意思,都是拷贝构造,不能把第27个看作是赋值。
关于为什么拷贝构造函数的参数是引用呢?
是为了放在死拷贝。如果是传值拷贝,在传参的时候就要拷贝,然后就业调用这个函数,调用这个函数又需要传值拷贝,最后还是要调用这个函数…无穷无尽。而传引用就避免了这个情况。
如果没有自己写拷贝构造函数,会调用默认构造函数,默认构造函数对内置类型进行值拷贝,对自定义类型会调用它的拷贝构造函数。

运算符重载

让对象也可以直接运用运算符,
运算符重载的形式:

返回类型operator运算符(参数){};
.* :: sizeof ?: . 

这5个运算符不能重载

赋值运算符重载

以日期类为例

    Date&operator=(const Date& d){
        _year = d._year;
        _month = d._month;
        _day = d._day;return*this;}

弄返回值是为了应对多次赋值的情况,引用左返回值和参数的原因是避免拷贝构造。
即使没有显式实现赋值运算符重载,也会生成默认的,其和拷贝构造一样,内置类型值拷贝,自定义类型调用它的赋值重载。

前置++/后置++重载

前置后置++怎么实现呢?
前置++,无参数
后置++,有一个int参数,只是为了去吧,没有什么实际意义。

//前置
    Date&operator++(){
        _day++;return*this;}//后置
    Date operator++(int){
        Date ret =*this;
        _day++;return ret;}

const成员

我们知道const修饰的不能改变,当const修饰的对象时,该对象的地址的类型是

const 类*

,而this指针的类型是

类* const

,会导致类型不匹配,所以此时要在类的成员函数后面加上一个

const


例如日期类:

classDate{public:booloperator==(const Date& d){return _year == d._year && _month == d._month && _day == d._day;}private:int _year;int _month;int _day;};intmain(){
    Date a;const Date b;
    b == a;//这里就会报错return0;}

因为此时传过去的类型是

const Date* 

,而this的类型是

Date* const


这样处理就可以解决这种问题了

bool operator==(const Date& d)const


只要是不改变this指针指向的内容都可以加上const。

&取地址操作符重载

这种操作符默认会生成,不需要自己写

    Date*operator&(){returnthis;}const Date*operator&()const{returnthis;}
标签: c++ 开发语言

本文转载自: https://blog.csdn.net/m0_60598323/article/details/126311540
版权归原作者 编程SHARE 所有, 如有侵权,请联系我们删除。

“类和对象——默认成员函数”的评论:

还没有评论