重载赋值函数与复制构造函数

关于运算符重载问题,以及复制构造函数等。这些都是十分容易让人的凌乱的东西,所以我觉得,有必要好好的梳理一下他们。


1.重载赋值(=)运算符
关于重载赋值函数,一个容易混乱的地方便是,到底是谁赋值给谁?以及,怎么赋值? 为何和复制构造函数那么像,他们之间又有什么区别?

Book & Book::operator=(const Book &b){
    if( this != &b){
        this->price = b.price;
        this->num = b.num;
        //为bookmark赋值
        int *bmTemp = new int[b.num];
        for(int i=0; i<b.num; i++){
            bmTemp[i] = b.bookmark[i];
        }
        this->bookmark = bmTemp;
    }
    return *this;
}
1.赋值给谁? 我的方法便是,这样理解Book::operator=(Book &) 就是 Book.operator=(Book & ) 

所以对于Book的两个对象,比如java 和ccc ,ccc=java 的意思其实是ccc.operator(java); 

2.重载赋值语句中需要写什么?

和复制构造函数类似,重载赋值语句是有参数的。参数是值得来源

重载赋值语句的必要是,数据成员有指针,并且存在动态内存分配的时候,赋值的时候,不可以只是简单的将指针的值赋值过去,而是需要为赋值的指针分配存储值得空间。所以,主要的操作便是对this->的指针进行动态内存分配,并将值赋值过来(记住,当自己写重载赋值函数的时候,不要丢掉别的部分,虽然在默认的赋值函数中,他们是正确的,但自己重写函数的时候,默认构造函数便不再调用!)

认识到 赋值函数中的this指的是 = 号左边被赋值的。

2.复制构造函数

复制构造函数,首先,他是构造函数的范畴,是用来构造对象的。

其次,便要意识到,在复制构造函数中的this 指的是,即将创建的这个对象的属性,而复制构造函数的参数,是你复制的模板(这个和重载赋值语句很像)

再而,复制构造函数没有return;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章