スニペット 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;
}
output : 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;
}
output : 非 const コピー コンストラクターが呼び出されました
スニペット 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;
}
出力: エラー: コピー コンストラクターは最初の引数を参照渡しする必要があります
私はとても混乱しています:
- スニペット 2 の場合、ここの非 const コピー コンストラクターが有効なのはなぜですか? const ではなく、非 const コピー コンストラクターが呼び出された理由。
- スニペット 3 については、無限再帰を避けるために、コピー コンストラクターが const 参照を使用する必要があることを知っています。しかし、クラス C には があり
C(const C& c)
、C(C c)
無限再帰は発生しません。なぜそれでも機能しないのでしょうか?