赋值运算符的重载

Posted -asurada-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了赋值运算符的重载相关的知识,希望对你有一定的参考价值。

1.有时候希望赋值运算符两边的类型可以不匹配,比如说char*类型的字符串赋值给字符串对象

2.赋值运算符“=”只能重载为成员函数

#include <iostream>
#include <string.h>
#include <iomanip>

using namespace std;

class String
{
private:
    char* str;
public:
    String ():str(new char[1]){ str[0]=0; }
    const char *c_str(){ return str }
    String & operator=(const char* s);
    ~String() { delete[] str; }
};

String & String::operator=(const char* s)
{
    delete[] str;//清空当前指针指向的内存
    str=new char[strlen(s)+1];
    strcpy(str,s);
    return *this;
}

3.深拷贝和浅拷贝

#include <iostream>
#include <string.h>
#include <iomanip>

using namespace std;

class String
{
private:
    char* str;
public:
    String ():str(new char[1]){ str[0]=0; }
    const char *c_str(){ return str }
    String & operator=(const char* s);
    ~String() { delete[] str; }
    String (const String& s);
};

String String::String(const String& s)
{
    //delete[] str;拷贝构造函数被调用,不调用构造函数,不用delete
    str=new char[strlen(s.str)+1];
    strcpy(str,s.str);
}

String & String::operator=(const char* s)
{
    delete[] str;//清空当前指针指向的内存
    str=new char[strlen(s)+1];
    strcpy(str,s);
    return *s;
}

String & String::operator=(const String &s)
{
    if(this==&s)
    {
        return *this;
    }//防止s=s
    delete[] str;
    str=new char[strlen(s.str)+1];
    strcpy(str,s.str);
    return *this;
}

4.运算符重载为友元函数

成员函数不能满足要求,普通函数又不能访问私有成员变量

成员函数只能满足c=c+5,不能满足c=5+c;后者需要重载为友元函数才可以。

5.运算符重载示例(vector)

#include <iostream>
#include <string.h>
#include <iomanip>

using namespace std;

class CArray
{
    int size;
    int *ptr;
public:
    CArray(int s=0);
    CArray(const CArray &a);
    ~CArray();
    void push_back(int v);
    CArray& operator=(const CArray &a);
    int& operator[](int i);
    int length(){ return size; }
};

CArray::CArray(int s):size(s)
{
    if(s==0)
    {
        ptr=NULL;
    }
    else
    {
        ptr=new int[s];
    }
}

CArray::CArray(const CArray & a)
{
    if(!a.ptr)
    {
        ptr=NULL;
        size=0;
        return;
    }
    ptr=new int[a.size];
    memcpy(ptr,a.ptr,sizeof(int)*a.size);
    size=a.size;
}

CArray::~CArray()
{
    if(ptr)
    {
        delete[] ptr;
    }
}

CArray& CArray::operator=(const &CArray a)
{
    if(ptr==a.ptr)
    {
        return *this;
    }
    if(a.ptr==NULL)
    {
        if(ptr)
        {
            delete[] ptr;
        }
        ptr=NULL;
        size=0;
        return *this;
    }
    if(size<a.size)
    {
        if(ptr)
        {
            delete[] ptr;
        }
        ptr=new int[a.size];
    }
    memcpy(ptr,a.ptr,sizeof(int)*a.size);
    size=a.size;
    return *this;
}

void CArray::push_back(int v)
{
    if(ptr)
    {
        int *tmpPtr=new int[size+1];
        memccpy(tmpPtr,ptr,sizeof(int)*size);
        delete[] ptr;
        ptr=tmpPtr;
    }
    else
    {
        ptr=new int;
    }
    ptr[size++]=v;
}

int& CArray::operator[](int i)
{
    return ptr[i];
}

 

以上是关于赋值运算符的重载的主要内容,如果未能解决你的问题,请参考以下文章

C++ ——赋值运算符重载函数

重载“着色器”类中的赋值运算符

Kotlin中复合赋值(+=,-=,……)运算符重载

赋值运算符重载函数 引用返回 与 对象返回

类和对象—4

free():在调用重载赋值运算符时在 tcache 2 中检测到双重空闲