找回密码
 立即注册
收起左侧

C++老鸟日记030 让A=B成立有哪些办法?

2
回复
6284
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-9-23 11:51:36 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 baizy77 于 2018-10-1 20:59 编辑

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白 (白振勇)
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------
本套课程属于:《C++跨平台开发干货》系列课程。
-----------------------------------------------------------------------------


引言:
----------------------------------------------------------------------------
       今天从网上看到一个视频,讲的是a与b属于不同的类型,给出让a=b等式成立的一种方法,我联想起几年前看到的一则面试题,也是这个题目。我们来看一下都有哪些办法能让A=B成立。

正文:
----------------------------------------------------------------------------
       不卖关子了,直接给答案。
       方法1,这个方法不太通用,说的是基本数据类型,比如a是float,b是int。 编译器会自动做隐式类型转换。我们不做过多讨论。


      方法2,class B从classA派生。

  1.   // class.h
  2. class A {
  3. };
  4. class B : public class A {
  5. };
复制代码

       这里利用的是A、B的派生关系。父类对象可以指向子类。


       方法3,class A重载operator=操作符。

  1. // class.h
  2. class B{
  3. };

  4. class A {
  5. public:
  6.     A& operator= (constB&);
  7. };
复制代码

       这里利用的是重载赋值操作符(operator=),用的是隐式。


      方法4,class A提供拷贝构造函数A(constB&):
  1. // class.h
  2. class B{
  3. };

  4. class A {
  5. public:
  6.     A(const B&);
  7. };
复制代码

              这里利用的是A的拷贝构造函数,是隐式转换。插个题外话,如果不希望a=b成立,那么可以把拷贝构造函数前面加上explicit限定符,写成这样:
              explicit A(const B&);
       这样,编译器就会强制要求使用显示拷贝构造,啥意思呢?就是要写成这样:
             a= A(b);
       请注意,这里可不是强制类型转换哦,是调用A的拷贝构造函数。


      方法5,class B重载operator A()接口:
  1. // class.h
  2. class A {
  3. };
  4. class B {
  5. public:
  6.     operator A() const;       // 相当于B提供一个接口,可以把自己转换成A。
  7. };
  8. B::operator A() const {
  9.     A a;
  10.     // 省略了为a赋值的代码。
  11.     return a;
  12. }
复制代码

结语:
----------------------------------------------------------------------------
       仔细想想,这个问题还真是有不少办法可以解决。所以,当我们碰到难题的时候,一定要充分发掘一下自己的大脑,动用自己的全部C++知识来应对。呵呵,说的有点过了。希望本节能够为大家开阔一下解决问题的思路。

回复

使用道具 举报

累计签到:50 天
连续签到:1 天
2018-9-24 12:22:21 显示全部楼层
老师对于方法5.    operator不是重载操作运算符么。   这里的operator 没有重载操作运算符 ,   谢谢解答。
回复 支持 反对

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-9-24 15:56:34 显示全部楼层
本帖最后由 baizy77 于 2018-9-24 15:58 编辑
tan 发表于 2018-9-24 12:22
老师对于方法5.    operator不是重载操作运算符么。   这里的operator 没有重载操作运算符 ,   谢谢解答。 ...
operator除了重载运算符功能,还有一个功能是隐式类型转换,详见附件。
C:\Users\baizy\Pictures\捕获.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了