3

내가 클래스 "MyClass에"이 가정하자 -는 다음과 같이C++ : 오버로드 된 생성자를 가진 클래스의 객체의 배열

class myclass 
{ 
public: 
    int n; 
    myclass(int n=0) 
    { 
     this->n=n; 
    } 
    myclass(myclass &a) 
    { 
     this->n=a.n; 
    } 
    ~myclass() 
    { 
     cout<<n<<"\n"; 
    } 
}; 

지금 난 "MyClass에"의 객체의 배열을 만들려면 : -

나는이 작업을 수행 할 때
int main() 
{ 
    myclass arr[]= {5}; // Only 1 element for simplicity... 
} 

는하지만, 나는 다음과 같은 오류를 얻을 : - 기능에서

'INT 주() :
| 47 | 오류 : 일치 쿵푸 호출에 nction 'MyClass에 :: MyClass에 (MyClass에)'
가 | 47 | 주 : 후보는 다음과 같습니다
| 36 | | 주 : MyClass에 :: MyClass에 (MyClass에 &)
| 36 | 주 : 인수에 대해 알려진 변환 1 'MyClass에'에서까지 'MyClass에 &'
| 32 | | 주 : MyClass에 :: MyClass에 (INT)
| 32 | | 주 : 'INT'에서 'MyClass에'

에서 인수 1 알려진 변환 하지만 복사 생성자 myclass(myclass &a)을 클래스에서 제거하면 오류가 발생하지 않고 모든 것이 잘 작동합니다.

그럼 내 질문은 - :

1)입니다. 왜 이런 일이 일어 납니까 ?? myclass(int n=0)이 여기에 복사 생성자보다 더 일치하지 않습니까 ??

2). 어떻게 성공적으로 그것을 컴파일, 둘 다, 복사 생성자뿐만 아니라 내 클래스의 정수 생성자를 고려 고려 ??

참고 : 나는 우분투 13.04에 GCC 버전 4.7.3을 사용하고 복사 생성자 수정의 참조 인수에이 문제를 const 추가

+1

복사 생성자가'const myclass & a'을 가져야하지 않습니까? – nvoigt

+0

@novigt 두 가지 모두 합법적이며 복사 생성자가 비 const 참조를 취하는 경우는 드뭅니다 (예 :'std :: auto_ptr').하지만 일반적으로 : 임시 참조 (const ref가 필요함)를 복사 할 수 있기를 원하고, 복사중인 객체를 수정하지 않습니다 (그래서 const ref를 사용할 수 있습니다). –

답변

2

이 경우 초기화 시맨틱은 복사 초기화입니다. 복사 초기화는 의 인수를 정식으로 변환 한 다음 복사합니다. 변환 된 인수는 왼쪽 값이 아니므로 복사 생성자 의 비 const 참조에 바인딩 할 수 없습니다. 복사 생성자를 정의하지 않으면 컴파일러에서 을 정의하고 const 참조를 사용합니다. 복사 생성자는 const 참조를 취해야합니다. 왜냐하면 인수가 수정되지 않기 때문입니다.

컴파일러는 구성을 최적화 할 수 있습니다. 그러나 프로그램이 합법적 일 경우에만 하지 않았습니다.

+0

나는 그것을 투표했을 지 모르지만 나는 충분한 평판을 얻지 못하고 있습니다. 내가 얻 자마자 투표를하겠습니다. 어쨌든 도움을 주셔서 감사합니다 .. !! –

2

How to successfully compile it , considering I want both , the copy constructor as well as the integer constructor in my class?

(그것이 어떤 관련이있는 경우.) :

myclass(const myclass &a) : n(a.n) {} 

Demo on ideone.

+0

오, 그래! "5"가 const 값이라는 사실을 잊어 버렸습니다. 고마워요! –

+1

@AnmolSinghJaggi'5'는'int const'가 아닌'int' 타입입니다; 그것은 rvalue이므로 cv 자격이 될 수 없습니다. 그리고'5'는'myclass (int)'의 인수로 사용됩니다. 복사 생성자가 비 const 참조를 취하는 경우 실패하는 myclass (int)에 의해 생성 된 임시 객체의 복사본입니다. –

+0

@JamesKanze 맞습니다! 그러나 "cv-qualified"가 정확히 무엇을 의미합니까? –