operator =注意事项

重载操作符,遵循的规则是 A& operator =(const A& rhs);在重载=时,1、要考虑证同情况即自我赋值,即A a; a=a;
2、考虑异常安全的情况,避免内存分配失败,例如:

A& operator =(const A& rhs)
{
    if(this ==  &rhs) return this;//证同
    delete pb;//pb是A中的一个成员变量BitMap*,BitMap是一个类
    pb = new BitMap(*rhs.pb);//*rhs.pb表示pb所指向的数据
    return *this;
}

如果new 失败,抛出异常,则返回的A的引用中成员变量pb将指向一个已经被删除的内存,这就导致异常出现的不安全.
解决办法一:只需要注意在复制pb所指的东西之前别删除pb,如下:

A& operator =(const A& rhs)
{
    BitMap *porg = pb;//记住原先的pb
    pb = new BitMap(*rhs.pb);//令pb指向*pb的一个副本
    delete porg ;//删除原先的pb
    return *this;
}

这样,如果new异常,pb仍保持原状,这仍然能进行自我赋值,因为new BitMap(*rhs.pb)就是将自己的数据进行了一份拷贝,然后再赋值给自己。只是不是太高效。
解决办法二:

A& operator =(const A& rhs)
{
    if(this !=  &rhs) //证同
    {
        A temp(rhs);
        BitMap *ptemp = temp.pb;
        temp.pb = pb;
        pb = ptemp ;
    }
    return *this;
}

先创建一个临时实例,接着让实例中的成员变量pb和自身的pb进行交换,这样就没有删除pb,只是把pb的地址改了。而临时实例只要出了if就会自动调用析构函数,把实例所指向的原来的内存给释放了。所以这个方法最高效.如果在创建临时实例的时候,new失败,则我们还没有修改原来的实例状态,就退出。这样实例的状态还是有效的,就保证了异常安全。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是关于哈夫曼树在C++中的注意事项: 1. 哈夫曼树是一种二叉树,因此需要定义一个二叉树的结构体或***类。 3. 在构造哈夫曼树时,需要将节点按照权值从小到大排序,因此需要定义一个比较函数或者重载运算符来实现排序。 4. 在构造哈夫曼树时,需要使用递归的方法来构造树,因此需要定义一个递归函数来实现。 5. 在编码和解码时,需要使用哈希表来存储字符和对应的编码,因此需要定义一个哈希表的结构体或类来实现。 以下是一个简单的C++代码示例,用于构造哈夫曼树和进行编码和解码: ```c++ #include <iostream> #include <queue> #include <unordered_map> using namespace std; // 定义哈夫曼树节点结构体 struct HuffmanNode { char ch; // 字符 int freq; // 权值 HuffmanNode *left, *right; // 左右子节点 HuffmanNode(char c, int f) : ch(c), freq(f), left(nullptr), right(nullptr) {} }; // 定义最小堆的比较函数 struct Compare { bool operator()(HuffmanNode* a, HuffmanNode* b) { return a->freq > b->freq; } }; // 构造哈夫曼树 HuffmanNode* buildHuffmanTree(string s) { // 统计字符出现的频率 unordered_map<char, int> freq; for (char c : s) { freq[c]++; } // 将字符和对应的频率存储到优先队列中 priority_queue<HuffmanNode*, vector<HuffmanNode*>, Compare> pq; for (auto p : freq) { pq.push(new HuffmanNode(p.first, p.second)); } // 构造哈夫曼树 while (pq.size() > 1) { HuffmanNode* left = pq.top(); pq.pop(); HuffmanNode* right = pq.top(); pq.pop(); HuffmanNode* parent = new HuffmanNode('$', left->freq + right->freq); parent->left = left; parent->right = right; pq.push(parent); } return pq.top(); } // 递归编码 void encode(HuffmanNode* root, string code, unordered_map<char, string>& table) { if (!root) { return; } if (root->ch != '$') { table[root->ch] = code; } encode(root->left, code + "0", table); encode(root->right, code + "1", table); } // 哈夫曼编码 string huffmanEncode(string s) { // 构造哈夫曼树 HuffmanNode* root = buildHuffmanTree(s); // 递归编码 unordered_map<char, string> table; encode(root, "", table); // 将字符串编码为二进制串 string res = ""; for (char c : s) { res += table[c]; } return res; } // 哈夫曼解码 string huffmanDecode(string s, HuffmanNode* root) { string res = ""; HuffmanNode* cur = root; for (char c : s) { if (c == '0') { cur = cur->left; } else { cur = cur->right; } if (cur->ch != '$') { res += cur->ch; cur = root; } } return res; } int main() { string s = "hello world"; string encoded = huffmanEncode(s); cout << "Encoded string: " << encoded << endl; HuffmanNode* root = buildHuffmanTree(s); string decoded = huffmanDecode(encoded, root); cout << "Decoded string: " << decoded << endl; return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值