如果C ++类同时包含const引用和非const引用副本构造函数,该怎么办?

出口商

片段1:

#include<iostream>
using namespace std;

class C{
public:
    C(){}
    C(const C& c){
        cout<<"const copy constructor called"<<endl;
    }
};
int main(){
    C c1;
    C c2 = c1;
    return 0;
}

输出:const复制构造函数称为


片段2:

#include<iostream>
using namespace std;

class C{
public:
    C(){}
    C(const C& c){
        cout<<"const copy constructor called"<<endl;
    }
    C(C& c){
        cout<<"non-const copy constructor called.\t "<<endl;
    }
};
int main(){
    C c1;
    C c2 = c1;
    return 0;
}

输出:非常量复制构造函数称为


片段3:

#include<iostream>
using namespace std;

class C{
public:
    C(){}
    C(const C& c){
        cout<<"const copy constructor called"<<endl;
    }
    C(C c){
        cout<<"non-const copy constructor called.\t "<<endl;
    }
};
int main(){
    C c1;
    C c2 = c1;
    return 0;
}

输出:错误:复制构造函数必须通过引用传递其第一个参数


我很困惑:

  1. 对于代码段2,为什么此处的非const复制构造函数有效?为什么要调用非const复制构造函数,而不是const一个。
  2. 对于代码段3,我知道复制构造函数必须使用const引用以避免无限递归。但是这里C类已经有了C(const C& c)C(C c)不会导致无限递归,为什么它仍然不起作用?
阿克沙伊(Akshay Arora)

片段1:一个带有的标准副本构造函数const T&快乐的世界。

片段2

有效完成的工作是使复制构造函数重载-一个使用引用T&,而另一个使用常量引用const T&

请注意:类T的任何构造函数具有一个类型为T &const T &也可以具有其他默认参数)强制类型的复制构造函数。

因此,对于编译器来说,一切都归结为找到最适合过载解析的方法,它的完成方式如下:

在以下情况下,标准转换序列S1比标准转换序列S2是更好的转换序列:

  • ....
  • S1和S2是引用绑定(8.5.3),除了顶级cv限定符之外,引用所引用的类型是相同的类型,并且由S2初始化的引用所引用的类型比cv限定的类型更多。 S1初始化的引用所引用的类型。

所以写

C c1;
C c2 = c1;

会调用非const复制构造函数,因为它是更好的匹配,但是,

写作,

const C c1;
C c2 = c1;

将调用const复制构造函数(您可以检查),因为现在带有const的复制构造函数是唯一可行的匹配项。

片段3对于编译器来说是完全错误的。

C(C c){
        cout<<"non-const copy constructor called.\t "<<endl;
    }

您不能使用带有签名的方法C(C c)编译器认为您正在尝试编写一个复制构造函数,而错过了编写的过程&,因此报告了错误。删除它,它工作正常。

@除非有充分的理由,否则永远不要将其C(C& c)用于副本构造函数。不要跳过,const因为要更改要从中复制对象的对象没有多大意义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP:如果构造函数是在同一类中用__construct和classname定义的,该怎么办?

来自分类Dev

如果构造不需要括号,该怎么办?

来自分类Dev

在C#中对com dll的引用如果未注册COM怎么办

来自分类Dev

如果HTTP标头中同时包含If-Modified-Since和If-None-Match怎么办

来自分类Dev

const和非const引用成员的C ++类重写

来自分类Dev

我应该担心找不到引用的* .js文件吗?如果是这样,我该怎么办?

来自分类Dev

如果我通过一个临时引用并将其存储为类成员,该怎么办?

来自分类Dev

如果AsyncTask被取消,该怎么办?

来自分类Dev

如果AsyncTask被取消,该怎么办?

来自分类Dev

C ++将Const对象引用传递给构造函数

来自分类Dev

如果<iostream>函数失败怎么办?

来自分类Dev

如果deque :: size在C ++中溢出怎么办?

来自分类Dev

如果两个接口包含相同的默认方法,该怎么办?

来自分类Dev

如果Google的App Engine文本属性包含大量文本,该怎么办?

来自分类Dev

如果可以创建不可为空的引用类型怎么办?

来自分类Dev

如果不小心删除了对 Xcode 中文件的引用怎么办?

来自分类Dev

如果我在Excel单元格公式中看到对工作簿中看不到的工作表的引用,该怎么办?

来自分类Dev

如果->运算符不返回引用,例如dot,该怎么办?操作员?也会停止重载->运算符吗?

来自分类Dev

如果同时定义了onsubmit事件和onsubmit属性怎么办?

来自分类Dev

C ++项目构想。该怎么办?

来自分类Dev

如果我不必多次调用ngAfterContentChecked()和ngAfterViewChecked()调用该怎么办

来自分类Dev

C ++ getter函数:const和非const

来自分类Dev

我可以使用C ++中的函数来初始化类成员变量吗?如果可以,该怎么办?

来自分类Dev

BDD结果:如果遇到错误该怎么办

来自分类Dev

如果不等待任务该怎么办?

来自分类Dev

如果isAvailableForServiceType方法返回NO,该怎么办

来自分类常见问题

如果我的发行证书过期,该怎么办?

来自分类Dev

如果MIDL无法创建tlb,您该怎么办?

来自分类Dev

如果我有几个重叠的QTimer,该怎么办

Related 相关文章

  1. 1

    PHP:如果构造函数是在同一类中用__construct和classname定义的,该怎么办?

  2. 2

    如果构造不需要括号,该怎么办?

  3. 3

    在C#中对com dll的引用如果未注册COM怎么办

  4. 4

    如果HTTP标头中同时包含If-Modified-Since和If-None-Match怎么办

  5. 5

    const和非const引用成员的C ++类重写

  6. 6

    我应该担心找不到引用的* .js文件吗?如果是这样,我该怎么办?

  7. 7

    如果我通过一个临时引用并将其存储为类成员,该怎么办?

  8. 8

    如果AsyncTask被取消,该怎么办?

  9. 9

    如果AsyncTask被取消,该怎么办?

  10. 10

    C ++将Const对象引用传递给构造函数

  11. 11

    如果<iostream>函数失败怎么办?

  12. 12

    如果deque :: size在C ++中溢出怎么办?

  13. 13

    如果两个接口包含相同的默认方法,该怎么办?

  14. 14

    如果Google的App Engine文本属性包含大量文本,该怎么办?

  15. 15

    如果可以创建不可为空的引用类型怎么办?

  16. 16

    如果不小心删除了对 Xcode 中文件的引用怎么办?

  17. 17

    如果我在Excel单元格公式中看到对工作簿中看不到的工作表的引用,该怎么办?

  18. 18

    如果->运算符不返回引用,例如dot,该怎么办?操作员?也会停止重载->运算符吗?

  19. 19

    如果同时定义了onsubmit事件和onsubmit属性怎么办?

  20. 20

    C ++项目构想。该怎么办?

  21. 21

    如果我不必多次调用ngAfterContentChecked()和ngAfterViewChecked()调用该怎么办

  22. 22

    C ++ getter函数:const和非const

  23. 23

    我可以使用C ++中的函数来初始化类成员变量吗?如果可以,该怎么办?

  24. 24

    BDD结果:如果遇到错误该怎么办

  25. 25

    如果不等待任务该怎么办?

  26. 26

    如果isAvailableForServiceType方法返回NO,该怎么办

  27. 27

    如果我的发行证书过期,该怎么办?

  28. 28

    如果MIDL无法创建tlb,您该怎么办?

  29. 29

    如果我有几个重叠的QTimer,该怎么办

热门标签

归档