2014-07-12 4 views
1

클래스 정의가 있습니다. 그리고 나는 어떤 생성자의 행동에 대해 혼란스러워합니다. 다음은 코드입니다.어떤 경우 생성자가 작동하지 않는 이유가 무엇인가요?

#include <iostream> 
#include <cstdlib> 

using namespace std; 

class A 
{ 
    int i; 
public: 
    void seti(int v) {cout << "Setting i\n"; i=v;} 
    void print() {cout << "i = " << i << endl;} 
    A(){}; 
    A(int v) {cout << "Setting i in par-ctor to " << v << "\n"; i=v;} 
    A(A& o) {cout << "In copy ctor, changing i to " << o.i << "\n";i=o.i;} 
    A& operator=(A o) {cout << "In assignment op\n"; this->i = o.i; return(*this);} 
}; 

int main() 
{ 
    A o1; 
    A o2(2); 
    A o3 = A(4); 
    A o4 = 35; 

    return(0); 
} 

내가이 코드는 컴파일되지 않는 이유를 알고 싶어하지 않는

a)에 정의 된 복사 생성자는 주석, 또는

b)에 정의 된 복사 생성자가 A& A(const A& o)에서 같은 'const' 규정이있다거나

c) o3 및 o4에 대한 개체 초기화가 제거됩니다. 생성자 A (INT)의 호출이 예상되는 (c)에 관해서

,

어떻게 생성자 (INT)와 매개 화와 실제 복사 생성자 정의 ( const없는 한) 충돌? 여기

답변

6

먼저 보면 :

A o3 = A(4); 

A(4) 임시 개체를 만듭니다. 이 표현식은 rvalue입니다. rvalue는 A&과 같이 const 왼쪽 값 참조에 바인딩 할 수 없으므로 복사 생성자를 선택할 수 없습니다. 더 나은 복사 생성자 선언은 const A&이므로 rvalues에서도 생성 할 수 있습니다. 그래서 당신의 (b) 수정이 효과가있는 것입니다.

같은 문제

여기 명단 :

(AN = 포함) 사본 - 초기화에서
A o4 = 35; 

, 개체의 임시을 구축 한 다음 선언하고있는 객체로 복사됩니다. 따라서 이것은 다음과 같습니다.

A o4 = A(35); 

따라서 위와 동일한 문제가 발생합니다.

+0

고마워요! 완전히 이해가됩니다. – anupamb

+0

@anupamb 그것이 옳다고 생각한다면 동의하는 것을 잊지 마십시오. –

관련 문제