运算符重载加号登录C++
operator overloading of plus sign in C++
我正在尝试理解加号的运算符重载。我看到 2 个原型:
Box operator+(const Box& b) { ... }
Box operator+(const Box& left, const Box& right) { ... }
哪一个是对的?如果区别只是第一个是成员函数,第二个是非成员函数,那么假设我定义了两种方式,那么将调用哪一种方式?
Box a, b;
Box c = a + b;
什么是"正确"或"更好"取决于您的应用程序。成员版本可以访问Box
的所有私有属性和方法,非成员版本不会,除非它被声明为Box
的friend
。但是,非成员可以被模板化并使其应用于各种类型。
编译器通常不首选成员而不是非成员,反之亦然。相反C++应用重载解析规则来选择一个或另一个。
Box Box::operator+(const Box& b)
被视为需要两个参数:Box&
引用用于调用成员函数的对象 (*this
),以及const Box& b
。
在您的示例中,a
和b
都是非常量。
为了调用Box Box::operator+(const Box& b)
,b
需要转换为常量引用。
为了调用Box operator+(const Box& left, const Box& right)
,a
和b
都需要转换为常量引用。
因此,选择成员运算符是因为它是更好的匹配(需要较少的转换)。
如果你的成员operator+
被声明为const
,你会得到一个编译器错误,因为调用会变得不明确。
相关文章:
- 密码登录程序将永远循环并显示不正确的结果
- 如何检查cURL是否成功登录?c ++
- 在 Tizen 中登录特定文件?
- 如何在 c++ 中将密码和用户名保存到 .txt 文件中.如果用户尝试登录,我仍然希望能够检索它们
- Win7 C++ - 从以用户身份登录的服务启动可执行文件的问题
- 在主窗口之前显示登录对话框并隐藏主窗口按钮
- 如何使用 libcurl 登录本网站?(C++)
- 如何使用 Apache C 模块登录到文件
- 用户注销/登录后,创建托盘图标时出现罕见错误
- 将正在运行的程序的用户名与登录到Windows的用户名进行比较
- 使用二进制文件的用户名和登录系统
- C++登录面板以查看 cout
- 从C++ Windows 服务中获取当前登录的用户名
- 是否有任何 C 函数或 API 来获取当前登录用户下运行的进程列表
- 不会在登录名中读取C++我的文件
- 尝试制作登录程序
- QT MySql 数据库检查登录名和密码以登录
- 与远程登录客户端协商回声
- 如何使用 cURL 防止在解析服务器中进行多次登录
- 如何从远程计算机中获取当前登录的用户名