要回国了,写个简单的总结吧。

一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投
内推多家公司面试
坐标湾区
Games Startup
招聘游戏开发工程师
游戏初创公司招聘工程师、UIUX Designer和游戏策划
把贵司招聘信息放这里
查看: 676|回复: 5
收起左侧

无人车相关c++问题

[复制链接] |试试Instant~ |关注本帖
foreverzad 发表于 2017-12-4 15:29:44 | 显示全部楼层 |阅读模式

2017(10-12月) 码农类General 博士 全职@无人车相关 - 网上海投 - 技术电面  | Other | 在职跳槽

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?Sign Up 注册获取更多干货

x
请问哪位大神解释下这个为什么 reference 是float 或者double 输出不一样。。。面试的时候直接敲出来了,但不懂
int main(int argc, const char * argv[]) . 一亩-三分-地,独家发布
{  
   double foo = 4.0;. 留学申请论坛-一亩三分地
    const float& bar = foo;
    foo += 2.1234;
    cout << bar << endl;
    cout << foo << endl;
}

评分

1

查看全部评分


上一篇:领英昂赛
下一篇:领英电面
magicsets 发表于 2017-12-5 04:36:50 | 显示全部楼层
楼上说的已经回答了问题... 我稍微补充一点例子

(1) 考虑这么一个程序:
  1. int main(int argc, const char * argv[]) {
  2.   double foo = 4.0;
  3.   const float& float_bar = foo;
  4.   const double& double_bar = foo;

  5. 来源一亩.三分地论坛.
  6.   cout << "foo addr = " << &foo << "\n";. Waral 博客有更多文章,
  7.   cout << "float bar addr = " << &float_bar << "\n";
  8.   cout << "double bar addr = " << &double_bar << "\n";
  9. .1point3acres网
  10.   foo += 2.1234;. 围观我们@1point 3 acres
  11. }
复制代码
. 一亩-三分-地,独家发布
. visit 1point3acres for more.
那么输出会像这样:
  1. foo addr = 0x7ffeefbff668
  2. float bar addr = 0x7ffeefbff65c
    . 1point 3acres 论坛
  3. double bar addr = 0x7ffeefbff668
复制代码


也就是foo和double_bar的地址是一样的,而float_bar是另一个地址。

这涉及到C++的一个特性(不知道算不算坑,我感觉挺好用的):常量左值引用可以绑定到右值

在上面的例子中,double_bar绑定的是左值引用,而float_bar由于要做implicit conversion所以绑定到了conversion后的右值——也就是一个新地址上。. 一亩-三分-地,独家发布
.1point3acres网
(2). visit 1point3acres for more.
更多一点的关于左值右值的例子:. more info on 1point3acres
. from: 1point3acres
  1. int main(int argc, const char * argv[]) {
  2.   double foo = 4.0;

  3.   // float& float_lvalue_bar = foo;                         // 编译错误
    -google 1point3acres
  4.   const float& const_float_lvalue_bar = foo;                // OK
  5.   float&& float_rvalue_bar = foo;                           // OK
  6.   const float&& const_float_rvalue_bar = foo;               // OK

  7.   double& double_lvalue_bar = foo;                          // OK
  8.   const double& const_double_lvalue_bar = foo;              // OK. more info on 1point3acres
  9.   // double&& double_rvalue_bar = foo;                      // 编译错误. 留学申请论坛-一亩三分地
  10.   double&& double_rvalue_bar = std::move(foo);              // 编译错误.本文原创自1point3acres论坛
  11.   // const double&& const_double_rvalue_bar = foo;          // 编译错误
  12.   const double&& const_double_rvalue_bar = std::move(foo);  // OK.本文原创自1point3acres论坛

  13.   foo += 2.1234;

  14.   cout << "const_float_lvalue_bar = " << const_float_lvalue_bar << endl;. more info on 1point3acres
  15.   cout << "float_rvalue_bar = " << float_rvalue_bar << endl;
  16.   cout << "const_float_rvalue_bar = " << const_float_rvalue_bar << endl;. 牛人云集,一亩三分地
  17.   cout << endl;

  18.   cout << "double_lvalue_bar = " << double_lvalue_bar << endl;
    .留学论坛-一亩-三分地
  19.   cout << "const_double_lvalue_bar = " << const_double_lvalue_bar << endl;
  20.   cout << "double_rvalue_bar = " << double_rvalue_bar << endl;. more info on 1point3acres
  21.   cout << "const_double_rvalue_bar = " << const_double_rvalue_bar << endl;
  22. }
复制代码


输出:
  1. const_float_lvalue_bar = 4
  2. float_rvalue_bar = 4
  3. const_float_rvalue_bar = 4
  4. . 牛人云集,一亩三分地
  5. double_lvalue_bar = 6.1234
  6. const_double_lvalue_bar = 6.1234
  7. double_rvalue_bar = 6.1234. 牛人云集,一亩三分地
  8. const_double_rvalue_bar = 6.1234
复制代码
.留学论坛-一亩-三分地
补充内容 (2017-12-5 04:39):
注释掉的代码才是编译错误,有一行笔误没注释但标注了编译错误... 应该是标注OK
回复 支持 2 反对 0

使用道具 举报

helloterran 发表于 2017-12-4 15:48:52 | 显示全部楼层
http://en.cppreference.com/w/cpp/language/reference_initialization

If object is an lvalue expression, and its type is implicitly convertible to a type that is either T or derived from T, equally or less cv-qualified, then the non-explicit conversion functions of the source type and its base classes that return lvalue references are considered and the best one is selected by overload resolution. The reference is then bound to the object identified by the lvalue returned by the conversion function (or to its base class subobject)

你的bar和foo不是一个type,所以bar绑定给了double->float implicit conversion生成的float 右值。也所以bar必须是const
回复 支持 反对

使用道具 举报

davidpy 发表于 2017-12-5 04:59:17 | 显示全部楼层
请问这是zoox的店面题吗,lz又后续吗
回复 支持 反对

使用道具 举报

 楼主| foreverzad 发表于 2017-12-5 05:20:50 | 显示全部楼层
davidpy 发表于 2017-12-5 04:59
请问这是zoox的店面题吗,lz又后续吗
. 1point 3acres 论坛
不是,我已经挂了.
回复 支持 反对

使用道具 举报

 楼主| foreverzad 发表于 2017-12-5 05:23:13 | 显示全部楼层
谢谢大神们的讲解和例子~~总算看懂了
回复 支持 反对

使用道具 举报

本版积分规则

提醒:发帖可以选择内容隐藏,部分板块支持匿名发帖。请认真读完以下全部说明:

■隐藏内容方法: [hide=200]你想要隐藏的内容比如面经[/hide]
■意思是:用户积分低于200则看不到被隐藏的内容
■可以自行设置积分值,不建议太高(200以上太多人看不到),也不建议太低(那就没必要隐藏了)
■建议只隐藏关键内容,比如具体的面试题目、涉及隐私的信息,大部分内容没必要隐藏。
■微信/QQ/电子邮件等,为防止将来被骚扰甚至人肉,以论坛私信方式发给对方最安全。
■匿名发帖的板块和方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2018-5-27 11:42

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表