题目1:赋值运算符函数

题目:为如下类型CMyString的声明,请为该类型添加赋值运算符函数。

class CMyString
{
    public:
        CMyString(char* pData = null);
        CMyString(const& CMyString str);
        ~CMyString(void);
    private:
        char* m_pData;
};

需要注意的点:

  • 函数返回值为该类的引用,如果不是则该函数不能用于连续赋值
  • 函数的参数要声明为常量引用,如果传入的不是引用而是实例则会在形参到实参复制时会调用一次赋值构造函数,造成不必要的浪费
  • 是否释放了实例本身已有的内存,如果没有释放在分配新内存的时候将会出现内存泄露
  • 判断传入的参数和实例自身是不是同一个,如果是同一个实例则会在释放内存的时候将自己释放掉

综上:

CMyString& CMyString::operator=(const CMyString& str)    //考点2
{
    if(this == &str)    //第4个考点
        return *this;
    
    delete []m_pData;    //考点3
    m_pData = nullptr;
    
    m_pData = new char[strlen(str.m_pData) + 1];
    strcp(m_pData, str.m_pData);
    
    return *this;    //考点1

考虑到安全性:

上面的例子中先删掉了m_pData然后再进行重新分配内存。考虑一点:如果在删除之后没有新的足够的内存供分配,此时会因为内存不足抛出异常。所以应该在删除前先new创建新的内存空间,如果内存不足也不会删去原有的内存。

改进版:

CMyString& CMyString::operator=(const CMyString& str)
{
    if(this != &str)
    {
        CMyString strTemp(str);    //调用复制构造函数
        
        char* pTemp = strTemp.m_pData;
        strTemp.m_pData = m_pData;
        m_pData = pTemp;
    }
    
    return *this;
}

这个例子在函数中创建一个临时实例strTemp,由于它是一个局部变量,在程序运行到函数外是就会将其释放掉。而且strTemp.m_pData指向的是原来实例中m_pData,这就相当于自动释放了内存。

  • 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
根据题目要求,以下是实现DirectedGraph类的代码。其中,可达矩阵的计算基于矩阵乘法和邻接矩阵的整数次幂运算。 ```cpp #include <iostream> #include <vector> #include <fstream> #include <sstream> using namespace std; class DirectedGraph { public: vector<vector<int>> m_AdjMat; // 邻接矩阵 vector<vector<int>> m_ReachabilityMat; // 可达矩阵 // 默认构造函数,构造一个空图 DirectedGraph() {} // 析构函数 ~DirectedGraph() {} // 解析文件filepath,构造一个DirectedGraph对象 DirectedGraph(string filepath) { ifstream infile(filepath); if (!infile.is_open()) { cout << "Error opening file " << filepath << endl; return; } string line; getline(infile, line); istringstream iss(line); iss >> m_VerticesCount >> m_EdgesCount; // 初始化邻接矩阵和可达矩阵 m_AdjMat.resize(m_VerticesCount); m_ReachabilityMat.resize(m_VerticesCount); for (int i = 0; i < m_VerticesCount; i++) { m_AdjMat[i].resize(m_VerticesCount); m_ReachabilityMat[i].resize(m_VerticesCount); } // 读入边 while (getline(infile, line)) { istringstream iss(line); int u, v; iss >> u >> v; m_AdjMat[u][v] = 1; } infile.close(); } // 复制构造函数 DirectedGraph(const DirectedGraph & graph) { m_VerticesCount = graph.m_VerticesCount; m_EdgesCount = graph.m_EdgesCount; m_AdjMat = graph.m_AdjMat; m_ReachabilityMat = graph.m_ReachabilityMat; } // 赋值运算符 DirectedGraph & operator=(const DirectedGraph & graph) { m_VerticesCount = graph.m_VerticesCount; m_EdgesCount = graph.m_EdgesCount; m_AdjMat = graph.m_AdjMat; m_ReachabilityMat = graph.m_ReachabilityMat; return *this; } // 清空图的邻接矩阵和可达矩阵 void ClearGraph() { m_VerticesCount = 0; m_EdgesCount = 0; m_AdjMat.clear(); m_ReachabilityMat.clear(); } // 输出图的邻接矩阵 void OutputGraph() const { for (int i = 0; i < m_VerticesCount; i++) { for (int j = 0; j < m_VerticesCount; j++) { cout << m_AdjMat[i][j] << " "; } cout << endl; } } // 矩阵乘法,用于实现可达矩阵运算中的矩阵逻辑乘 DirectedGraph operator*(const DirectedGraph & graph) const { DirectedGraph result; result.m_VerticesCount = m_VerticesCount; result.m_EdgesCount = m_EdgesCount; result.m_AdjMat.resize(m_VerticesCount); result.m_ReachabilityMat.resize(m_VerticesCount); for (int i = 0; i < m_VerticesCount; i++) { result.m_AdjMat[i].resize(m_VerticesCount); result.m_ReachabilityMat[i].resize(m_VerticesCount); for (int j = 0; j < m_VerticesCount; j++) { result.m_AdjMat[i][j] = m_AdjMat[i][j] && graph.m_AdjMat[i][j]; result.m_ReachabilityMat[i][j] = m_ReachabilityMat[i][j] || graph.m_ReachabilityMat[i][j]; } } return result; } // 邻接矩阵的整数次幂 DirectedGraph Pow(int power) const { DirectedGraph result(*this); if (power == 0) { // 返回单位矩阵 for (int i = 0; i < m_VerticesCount; i++) { for (int j = 0; j < m_VerticesCount; j++) { result.m_AdjMat[i][j] = (i == j ? 1 : 0); } } } else if (power > 1) { result = result.Pow(power / 2); result = result * result; if (power % 2 == 1) { result = result * (*this); } } return result; } // 矩阵逐元素的逻辑或运算 DirectedGraph MatOr(const DirectedGraph & graph) const { DirectedGraph result(*this); for (int i = 0; i < m_VerticesCount; i++) { for (int j = 0; j < m_VerticesCount; j++) { result.m_AdjMat[i][j] = m_AdjMat[i][j] || graph.m_AdjMat[i][j]; } } return result; } // 计算可达矩阵 void CalcReachabilityMat() { m_ReachabilityMat = m_AdjMat.Pow(m_VerticesCount); } // 输出可达矩阵 void OutputReachabilityMat() const { for (int i = 0; i < m_VerticesCount; i++) { for (int j = 0; j < m_VerticesCount; j++) { cout << m_ReachabilityMat[i][j] << " "; } cout << endl; } } // 基于可达矩阵判断从节点src与dst之间是否存在通路 bool IsConnected(int src, int dst) const { return m_ReachabilityMat[src][dst]; } private: int m_VerticesCount; // 节点数 int m_EdgesCount; // 边数 }; ``` 在上述代码中,我们定义了一个DirectedGraph类来表示有向图,其中包含了邻接矩阵和可达矩阵等成员变量,以及用于构造和操作有向图的各种成员函数。其中,CalcReachabilityMat函数基于矩阵乘法和邻接矩阵的整数次幂运算来计算可达矩阵,IsConnected函数基于可达矩阵判断从节点src与dst之间是否存在通路。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值