首页 > 后端开发 > C++ > 正文

C++中的运算符重载有哪些限制 常用运算符重载示例演示

P粉602998670
发布: 2025-08-18 16:06:02
原创
568人浏览过
<p><a style="color:#f60; text-decoration:underline;" title="c++" href="https://www.php.cn/zt/17603.html" target="_blank">c++</a>++中运算符重载的常见限制包括:1. 不能重载的运算符有.、::、?:、sizeof、typeid;2. 不能创建新运算符,必须保持原有操作数个数;3. 某些运算符如逗号运算符虽可重载但不建议使用。应考虑重载的情况包括类需支持自然操作语义、简化比较或赋值、输入输出流操作等。选择成员函数还是友元函数取决于是否需要访问私有数据及操作数位置,同时要保持运算符原有语义以避免代码难以维护。</p> <p><img src="https://img.php.cn/upload/article/000/969/633/175550436393600.png" alt="C++中的运算符重载有哪些限制 常用运算符重载示例演示"></p> <p>在C++中,运算符重载是实现类对象像内置类型一样进行操作的重要手段,但它的使用并不是完全自由的。理解这些限制和常见用法,有助于写出更清晰、高效的代码。</p> <img src="https://img.php.cn/upload/article/000/969/633/175550436350027.png" alt="C++中的运算符重载有哪些限制 常用运算符重载示例演示"><h2>有哪些常见的限制?</h2> <p>首先,<strong>不能重载的运算符</strong>有以下几种:</p> <img src="https://img.php.cn/upload/article/000/969/633/175550436490660.png" alt="C++中的运算符重载有哪些限制 常用运算符重载示例演示"><ul> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">.</pre>
登录后复制
</div> 成员访问运算符</li> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">::</pre>
登录后复制
</div> <a style="color:#f60; text-decoration:underline;" title="作用域" href="https://www.php.cn/zt/35787.html" target="_blank">作用域</a>解析运算符</li> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">?:</pre>
登录后复制
</div> 条件运算符</li> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">sizeof</pre>
登录后复制
</div> 获取大小运算符</li> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">typeid</pre>
登录后复制
</div> 类型信息运算符</li> </ul> <p>这些运算符的行为是语言层面定义的,不允许自定义逻辑。</p> <p><span>立即学习</span>“<a href="https://pan.quark.cn/s/6e7abc4abb9f" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">C++免费学习笔记(深入)</a>”;</p> <p>其次,<strong>不能创建新的运算符</strong>。只能使用已有的运算符,且必须保持其原有的操作数个数。例如,一元运算符(如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">!</pre>
登录后复制
</div>)只能有一个操作数,二元运算符(如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">+</pre>
登录后复制
</div>)必须有两个。</p> <img src="https://img.php.cn/upload/article/000/969/633/175550436579234.png" alt="C++中的运算符重载有哪些限制 常用运算符重载示例演示"><p>另外,<strong>有些运算符不建议重载</strong>,比如逗号运算符(<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">,</pre>
登录后复制
</div>),虽然语法上可以重载,但容易造成<a style="max-width:90%" title="代码可读性" href="https://www.php.cn/zt/55554.html" target="_blank">代码可读性</a>下降。</p> <div class="aritcle_card"> <a class="aritcle_card_img" href="/ai/1154"> <img src="https://img.php.cn/upload/ai_manual/000/000/000/175680126049574.png" alt="Motiff"> </a> <div class="aritcle_card_info"> <a href="/ai/1154">Motiff</a> <p>Motiff是由猿辅导旗下的一款界面设计工具,定位为“AI时代设计工具”</p> <div class=""> <img src="/static/images/card_xiazai.png" alt="Motiff"> <span>148</span> </div> </div> <a href="/ai/1154" class="aritcle_card_btn"> <span>查看详情</span> <img src="/static/images/cardxiayige-3.png" alt="Motiff"> </a> </div> <h2>哪些情况下应该考虑重载运算符?</h2> <ol> <li> <strong>类的设计需要支持自然的操作语义</strong>,比如复数类支持加减乘除。</li> <li> <strong>希望简化类对象之间的比较或赋值操作</strong>,比如自定义结构体作为键值时,可能需要重载<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">==</pre>
登录后复制
</div>或<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><</pre>
登录后复制
</div>。</li> <li> <strong>输入输出流操作</strong>,比如希望直接用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">cout << obj</pre>
登录后复制
</div>来打印对象内容。</li> </ol> <p>举个例子,一个简单的复数类:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:cpp;toolbar:false;'>class Complex { public: double real, imag; Complex(double r = 0, double i = 0) : real(r), imag(i) {} // 重载 + 运算符 Complex operator+(const Complex& other) const { return Complex(real + other.real, imag + other.imag); } };</pre>
登录后复制
</div><p>这样就可以写:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:cpp;toolbar:false;'>Complex a(1, 2), b(3, 4); Complex c = a + b; // 更直观</pre>
登录后复制
</div><h2>如何选择成员函数还是友元函数?</h2> <p>通常,<strong>如果操作需要访问私有成员,并且不是成员函数的一部分</strong>,可以选择友元函数。例如,重载<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><<</pre>
登录后复制
</div>用于输出时:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:cpp;toolbar:false;'>ostream& operator<<(ostream& os, const Complex& c) { os << c.real << "+" << c.imag << "i"; return os; }</pre>
登录后复制
</div><p>而像<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">+=</pre>
登录后复制
</div>这样的运算符,更适合定义为成员函数,因为它通常修改当前对象的状态。</p> <p>如果你不确定该用哪一种方式,记住这个原则:</p> <ul> <li>如果左边的操作数是该类的对象,并且你想让操作符看起来像是“对象 + 对象”的形式,可以用成员函数。</li> <li>如果你想让操作符支持左操作数不是该类的对象(比如 int + Complex),那就得用友元函数或者普通函数。</li> </ul> <h2>总结一下关键点</h2> <ul> <li>有些运算符不能重载,有些不适合重载。</li> <li>重载是为了提升代码可读性和使用便利性。</li> <li>选择成员函数还是非成员函数取决于是否需要访问私有数据以及操作数的位置。</li> <li>注意保持运算符原有语义,避免过度重载导致代码难以维护。</li> </ul> <p>基本上就这些。运算符重载本身不复杂,但在实际应用中要注意设计合理性和一致性。</p>

以上就是C++中的运算符重载有哪些限制 常用运算符重载示例演示的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号