| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
大量收QQ微信精准粉/交友粉,非诚勿扰千里之行 始于足下
共有 223 人关注过本帖
标题:这道题为什么参数里加上const就对了?
只看楼主 加入收藏
青蝶
Rank: 2
等 级:论坛游民
帖 子:142
专家分:51
注 册:2018-2-4
结帖率:92.68%
  已结贴   问题点数:20  回复次数:5   
这道题为什么参数里加上const就对了?
#include <iostream>
using namespace std;
class Sample {
public:
    int v;
    Sample(int n=5){v=n;}
    Sample(const Sample &t){
        v=t.v+2;
    }
};
void PrintAndDouble(Sample o)
{
    cout << o.v;
    cout << endl;
}
int main()
{
    Sample a(5);
    Sample b = a;
    PrintAndDouble(b);
    Sample c = 20;   //上面红色那个const不加的话,这一句会报错,求大佬解释一下
    PrintAndDouble(c);
    Sample d;
    d = a;
    cout << d.v;
    return 0;
}



[此贴子已经被作者于2018-9-15 15:24编辑过]

2018-09-15 15:23
Jonny0201
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:23
帖 子:349
专家分:1687
注 册:2016-11-7
  得分:10 
Sample(int n=5);
相当于将一个 int 转换成了你写的 Sample 类型
Sample c = 20;
就相当于
Sample c = Sample(20);
这里用到了
Sample(const Sample &t);
复制建构函数
而 Sample(20) 是一个右值, 他是不可以被绑定到左值引用上的
没有 const 限定的函数 Sample(Sample &) 中的 Sample 是一个左值引用, 所以函数匹配失败, 出现编译错误
但是 C++ 中有一个例外的是, 为了延长右值的生命周期, 右值可以被绑定到被 const 限定的左值引用上, 所以你加上 const 就不会出错了
或者使用 C++ 11 的右值移动, 将其改成
Sample(Sample &&t);
或者在构造函数之前加上 explicit 声明禁止 int 被隐含地转换
2018-09-15 18:13
Jonny0201
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:23
帖 子:349
专家分:1687
注 册:2016-11-7
  得分:0 
不过 Clang 好像有特别的实现
我去掉 const 之后 Clang 仍然可以编译通过
@rjsp
2018-09-15 18:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:266
帖 子:5829
专家分:33315
注 册:2011-1-18
  得分:10 
回复 3楼 Jonny0201
Sample c = 20;
就相当于
Sample c = Sample(20);


接着,又相当于 Sample c(20);
C++(后来)规定了即使上述省略掉的步骤中存在“副作用”也应当视而不见地省略掉。
但没规定在上述省略掉的步骤中如果若存在语法错误怎么办?
gcc6及之前的版本,就报错;gcc7及之后,不管了,就通过。
2018-09-15 21:31
Jonny0201
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:23
帖 子:349
专家分:1687
注 册:2016-11-7
  得分:0 
回复 4楼 rjsp
thx
看起来学 C++ 还是免不了要看标准
2018-09-16 00:29
青蝶
Rank: 2
等 级:论坛游民
帖 子:142
专家分:51
注 册:2018-2-4
  得分:0 
谢谢~
2018-09-16 21:29







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019626 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved