题目一:赋值运算符函数


/
// 3.题目一:赋值运算符函数
class CMyString
{
public:
    // 默认函数
    CMyString();
    CMyString(const CMyString&);
    CMyString& operator=(const CMyString&);
    ~CMyString();

    void SetString(const char* pszStr)
    {
        // 释放旧数据
        Destroy();
        CopyData(pszStr);
    }

    void Print()
    {
        if (m_pszData)
        {
            cout << m_pszData << endl;
        }
    }

    void Destroy()
    {
        if (m_pszData)
        {
            delete [] m_pszData;
            m_pszData = NULL;
        }
    }

    void CopyData(const char* pszStr)
    {
        if (pszStr)
        {
            int iLen = strlen(pszStr);
            m_pszData = new char[iLen + 1];
            strncpy(m_pszData, pszStr, iLen + 1);
            m_pszData[iLen] = '\0';
        }
    }

private:
    char* m_pszData;
};

// 默认构造函数
CMyString::CMyString()
    :m_pszData(NULL)
{

}

//拷贝构造函数
CMyString::CMyString(const CMyString& other)
{
    cout << "CMyString Copy Constructor!!!!" << endl;
    // 释放旧数据
    //Destroy();    // 这里不能释放,因为没有初始化

    CopyData(other.m_pszData);
}

//赋值操作符
CMyString& CMyString::operator=(const CMyString& other)
{
    cout << "CMyString Assignment Operator!!!!" << endl;

#if 0   // 初级程序员!!!!
    if (this != &other)
    {
        Destroy();
        CopyData(other.m_pszData);
    }

#else 
    //高级程序员 需要考虑异常 --> 内存不足,导致new char 抛出异常
    // 实现异常安全性:
    // 1.先new分配新内容在使用delete释放旧内容 --> 确保抛出异常时原来的数据不会被改变!!!
    // 2.先创建一个临时实例,再交换临时实例和原来的内容  --> 推荐这种方法!!!!
    if (this != &other)
    {
        // 调用拷贝构造函数创建临时实例
        CMyString strTmp(other);
        char * pTmp = strTmp.m_pszData;
        strTmp.m_pszData = m_pszData;   // strTmp调用析构函数时,会释放原来实例中的m_pszData!!!!
        m_pszData = pTmp;
    }

#endif
    return *this;
}

//析构函数
CMyString::~CMyString()
{
    Destroy();
}

void MyStringTestFunc()
{
    cout << "\n\n --------------- MyStringTestFunc Start -------------->" << endl;

    CMyString str1;
    str1.SetString("Hello World!");
    str1.Print();

    CMyString str2(str1);   // 调用拷贝构造函数
    str2.Print();

    CMyString str3 = str1;  // 调用拷贝构造函数 等同于CMyString str3(str1)
    str3.Print();

    CMyString str4;
    str4 = str1;            // 赋值操作符
    str4.Print();


    cout << "\n\n --------------- MyStringTestFunc End -------------->" << endl;

}

转载于:https://www.cnblogs.com/yzdai/p/11258583.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用C++实现有向图的邻接矩阵,以及可达矩阵的计算算法。 请完成Project05.cpp中DirectedGraph类的成员函数,具体要求如下: DirectedGraph类: 用来表示一个有向图。 成员变量: m_AdjMat:邻接矩阵 m_ReachabilityMat:可达矩阵 成员函数: DirectedGraph():默认构造函数,构造一个空图。 ~DirectedGraph():析构函数 DirectedGraph(string filepath):解析文件filepath,构造一个DirectedGraph对象。 filepath文件格式与项目四相同,但本项目的图为有向图。 DirectedGraph(const Graph & graph):复制构造函数 operator=(const Graph & graph):赋值运算符 ClearGraph():清空图的邻接矩阵和可达矩阵。 OutputGraph():输出图的邻接矩阵 operator*(const DirectedGraph & graph): 乘法运算符,用于实现可达矩阵运算中的矩阵逻辑乘 DirectedGraph Pow(int power):邻接矩阵的整数次幂。 用法如下: DirectedGraph a; a = a.Pow(5); 即a的5次幂,相当于a = a * a * a * a * a; 注意要考虑0次幂的情况。 该函数适合以递归实现。 DirectedGraph MatOr(DirectedGraph graph):矩阵逐元素的逻辑或运算。 例如: 1 0 0 1 与 0 1 1 0 运算后的结果为 1 1 1 1 void CalcReachabilityMat():计算可达矩阵,要求该函数基于*运算符和Pow函数实现 void OutputReachabilityMat():输出可达矩阵 IsConnected(int src, int dst):基于可达矩阵判断从节点src与dst之间是否存在通路,如存在返回真,否则返回假
05-30

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值