2015-02-07 4 views
1
class Cents 
{ 
private: 
int m_nCents; 

public: 
Cents(int nCents) { m_nCents = nCents; } 

// Overload cCents + int 
friend Cents operator+(const Cents &cCents, int nCents); 
int GetCents() { return m_nCents; } 
}; 

// note: this function is not a member function! 
Cents operator+(const Cents &cCents, int nCents) 
{ 
return Cents(cCents.m_nCents + nCents); 
} 

int main() 
{ 
Cents c1 = Cents(4) + 6; 
std::cout << "I have " << c1.GetCents() << " cents." << std::endl; 

return 0; 
} 

그것은 나에게 평가 라인C++ 인스턴스화 "암시"Сlass 개체

Cents c1 = Cents(4) + 6; 

에서 어떻게 표현

Cents(4)+6 

분명하지 않다. 예, Cents와 int 유형의 피연산자에 대해 연산자 "+"가 오버로드되고 있음을 알고 있습니다.

저는 Censt (4)가 생성자라는 것을 알고 있습니다 만, 맞습니까? 그래서 언제

Cents operator+(const Cents &cCents, int nCents) 
{ 
return Cents(cCents.m_nCents + nCents); 
} 

라고하면 c 센트는 센트 (4)에 대한 참조가됩니까? 우리는 멤버 선택 연산자를 통해 액세스 m_nCents 때문에

return Cents(cCents.m_nCents + nCents); 

하나가 cCenst 추론 할 수있는 선에서

형 Censt의 목적이다 "." 그러나 Censt (4)는 클래스 객체가 아닌 생성자입니다.

cCenst가 Cents (4)에 대한 참조가 아닌 것은 나에게 의미가있는 것처럼 보입니다.

+0

여기에 태그 수를 줄이고 질문에 C++ 태그를 적용해야합니다 (이것이 C++ 인 경우). –

+0

이 질문이 연산자 오버로딩과 관련이 있는지는 알 수 없습니다. 왜 사용법 예제가'foo (Cents (4)) '인 임의의 함수'void foo (const Cents &)'와 관련되어 있기 때문에 그것을 놓을 수 없습니까? –

+0

그래, 내 예제는 연산자 오버로딩과 관련이 없지만 클래스 객체를 참조로 함수에 전달하는 것과 관련이 있음을 인정해야한다. 그러나 나는 코드를 편집하지 않고 연산자 오버로딩을 제거하지 않을 것입니다. 왜냐하면 나는 이해할 수있는 예를 생각해 낼 수 없기 때문입니다. 그러나 현명한 발언을 고려하여 나는 질문 제목을 바꿀 것이다. –

답변

2

저는 Censt (4)가 생성자라는 것을 알고 있습니다 만, 맞습니까?

아니오, 그렇지 않습니다. 절대이 구문을 사용하면 직접 생성자를 호출 할 수 있습니다.

여기서는 생성자 인수 4 인 임시 Censt을 생성합니다. 이상과 같이 그것의

생각해은 :

Censt x(4); // creates a `Censt` with name `x` from argument `4` 
Censt(4); // creates a `Censt` with no name from argument `4` 

이되지 함수 호출 입니다.

cCenst는 (4) 센트에 대한 참조가됩니까?

예.

그러나 Censt (4)는 클래스 개체가 아니라 생성자입니다.

다시, 아니오. 개체입니다.

+0

Cents (4)가 명명되지 않은 객체를 생성했다는 것을 알았으니 함수 매개 변수 "cCenst"가이 참조를 어떻게 참조하는지 이해합니다.감사합니다) –

+0

@MaxGreen : 문제 없어요 :) –

+0

더 정확하게 말하면'Cents (4)'는 rvalue 인 표현식입니다. 마찬가지로 '4'가 rvalue입니다. –

0

생성자가 개체를 생성하므로 개체와 int를 얻은 후에 개체를 가져옵니다. 정확히 참조가 아니므로 const 참조이므로 개체를 수정할 수 없으므로 이전에 만들 필요가 없습니다.

+0

아니요, 생성자는 아무것도 반환하지 않습니다. –

+0

예, 제가 쓰는 단어가 맞지 않았습니다. 나는 그것을 바꿨다. –

+0

생성자는 "객체 생성"도하지 않습니다. 적어도 전체가 아닙니다. 데이터 멤버를 초기화합니다. 메모리 할당 및 기타 사항은 언어별로 별도로 처리됩니다. 이것이 이것이 "생성자를 호출하는 것"이 ​​아닌 이유입니다. 실제로 생성자는 이름조차 없다 (12.1/1)! –

1

저는 Censt (4)가 생성자라는 것을 알고 있습니다 만, 맞습니까?

Cents(4)Cents 개체 (생성자를 호출 함)를 만드는 표현식입니다. 표현식을 평가 한 결과가 이렇게 만들어진 객체입니다.

그래서 [...]가 호출되면 cCenst가 Cents (4)에 대한 참조가됩니까?

Cents(4) 하위 표현식을 평가할 때 생성 된 개체에 대한 참조가됩니다. 우리는 멤버 선택 연산자 m_nCents 통해 액세스 한 이후 return Cents(cCents.m_nCents + nCents); 그 cCenst 추론 할 수있는 선에서

형 Censt의 목적이다 "."

cCents은 그것이 선언 된 방식이므로 const Cents &입니다.

그러나 Censt (4)는 클래스 개체가 아니라 생성자입니다.

Cents(4)은 표현식이다. 생성자가 아닙니다. 자세히 설명하자면, 표현식입니다. 평가할 생성자를 호출해야하며 결과는 Cents입니다. 발현

:

Cents c1 = Cents(4) + 6;

서브 표현식이 먼저 평가된다 (오퍼레이터 등의 우선 순위에 따라). 따라서 Cents(4)이 계산되어 Cents 개체가됩니다. 전체 표현식이 다음으로 간주 될 수있다 :

Cents c1 = <a-newly-created-Cents-object> + 6;

<a-newly-created-Cents-object> + 6 부분은 다음에 의해 평가되는 정의 + 오퍼레이터를 호출. 이 연산자 메서드에서 cCents 매개 변수는 <a-newly-created-Cents-object>에 대한 참조가됩니다.