C++笔记(复制构造函数、拷贝赋值运算符、运算符重载)


avatar
bo-jwolf 2015-08-02 3.38k

相关内容不做赘余,仅就部分问题个人以前未理解内容记录

一、this和*this的区别。

之前理解为this为指针,那么this则指向this指针的地址,而*this则应该指向其指针所指向当前对象。

正解应该是:this指针指向当前对象的地址,即它是一个指向当前对象的指针。

*this为当前对象的复制或者当前对象本身,即根据对象返回值类型而定。当为引用时为后者,否则为前者

看起来似乎意思差不多,但仔细理解会发现二者差别还是较大

相关资料链接1

相关资料链接2

相关资料链接3

二、运算符[]重载

下面相关代码似乎看起来似乎没什么不同。但是运算符[]需要考虑的有其作为左值和右值的差别。

右值:即A = NUM[ I ]

这时重载只需要考虑i为合法区间即可(下面未处理)

左值:即NUM[ I ] ?= 123

这时我们需要考虑的问题是:当前内存中所存储的值是需要改变的,那么就存在赋值或复制的关系。下面代码之前一直纠结【】二者重载没有多大区别,问题就出在这里,因为Vector中已经定义了复制构造函数和拷贝赋值运算符

相关资料链接

三、复制构造函数和拷贝赋值运算符的区别

当声明时进行初始化,为复制构造函数

int a = 1;

当声明之后有赋值运算,称为拷贝赋值运算符

int a;

a = 1;

以上例子虽然不是很合理,但意思如上(将以上例子改为对象)。虽然看起来只是概念性问题,但之前一直不理解

代码参照《C++语言导学》(2015年4月版,c++之父Bjarne Stroustrup新作);

#include <iostream>

using namespace std;

class Vector{
    double *elem;
    int sz;

public:
    Vector( int s );
    ~Vector(){delete []elem; };

    Vector( const Vector &a );//复制构造函数
    Vector& operator=(const Vector &a );//拷贝赋值函数

    double& operator[](int i);
    const double& operator[]( int i )const;
    int size() const;
};

Vector::Vector( int s ):elem{ new double[ s ] }, sz{ s }{};

Vector::Vector( const Vector &a ):elem{ new double[ a.sz ] },sz{a.sz}{
    for( int i = 0; i != sz; ++i ){
        elem[ i ] = a.elem[ i ];
    }
}

double& Vector::operator[]( int i ){
    return elem[ i ];
}

const double& Vector::operator[]( int i )const{
    return elem[ i ];
}

Vector& Vector::operator=( const Vector &a ){
    double *p = new double[ a.sz ];
    for( int i = 0; i != a.sz; ++i ){
        p[ i ] = a.elem[ i ];
    }
    delete []elem;
    elem = p;
    sz = a.sz;
    return *this;
}

int Vector::size()const{
    return sz;
}

void bad_copy(Vector v1 ){
    Vector v2 = v1;
    int len = v1.size();
    /*test*/
    for(int i = 0; i < len; ++i ){
       cout << &v1[ i ] << " " << &v2[ i ] << endl;
    }
    cout <<"***********" << endl;
    v1[ 0 ] = 2;
    v2[ 1 ] = 3;
   /*对比*/
   for(int i = 0; i < len; ++i ){
        cout << &v1[ i ] << " " << &v2[ i ] << endl;
    }
}
int main()
{
    Vector v1( 4 );
    bad_copy( v1 );
    return 0;
}

暂无评论

发表评论

相关阅读