고려 : 나는 컴파일러가 접두사와 접미사 사업자에게 전화를 확장하는 방법을 결정하기 위해 실험을했다C++ 컴파일러는 접두사와 접미사 연산자 ++()를 어떻게 확장합니까?
class Example
{
private:
int m_i;
public:
Example(int i) : m_i{i} {}
//Post-fix
Example operator++(int) {m_i++; return *this;}
//Pre-fix
Example& operator++() {m_i++; return *this;}
void print() const {std::cout << m_i << '\n'}
};
.
Example e = 1;
e++;
내가 "e.operator ++ (INT)", 또는 한 단계 더 복용 같은 것으로 확대를 예상, 내가
예상
: 나는 이런 식으로 뭔가를 쓰기 예를 들어
,
e++(2);
"e.operator ++ (2)."와 같이 확장해야하지만 대신 컴파일러에서 " '(Example) (int)'에 대한 호출과 일치하지 않습니다."
다음으로 "++ e"가 "e.operator ++()"로 어떻게 신비하게 확장되어 있는지, 즉 참조를 반환하는 방법에 대해 궁금합니다.
좀 더 주위를 재생, 내가 함께 결국 : 다음 2를 인쇄하고,
Example e = 1;
++e++;
e.print();
:
3.
내가 이해 인쇄
Example e = 1;
(++e)++;
e.print();
(++ 전자가)는 객체에 대한 참조를 반환합니다.이 참조는 이후에 1 씩 증가됩니다. 나는 또한 "++ e ++"가 postfix 연산자 우선 순위를 (다른 게시물에서 읽었을 때) 여기에서주고 있다고 생각합니다. 그래서 이것은 postfix 연산자에 의해 리턴 된 임시 변수를 증가시킵니다. 이것 역시 의미가 있습니다. 이로 인해
++++e
++e++++
++++e++
++++e++++
과 같은 표현식이 어떻게 확장되는지 (모두 컴파일되어 예상 된 결과와 함께 실행 됨) 궁금해졌습니다.
내부에서 도대체 무슨 일이 벌어지고 있고, 컴파일러는 어떤 연산자 ++()를 호출해야하는지, 그리고이 표현식을 어떻게 확장합니까 (특히 접두사의 경우)? "연산자 ++ (int)"에서 자리 표시 자 변수의 용도는 무엇입니까?
자리 표시자는 과부하 해결 중에 두 연산자가 구분되도록 허용하기위한 것입니다. 인수는 지정되지 않았으며 사용되지 않은 상태로 있어야합니다. –
위의 링크를 읽으십시오. 끝에있는 모든 인위적인 예제에는 시퀀스 포인트가 없습니다. – CoryKramer
후위 연산자가 의도대로 동작하도록하려면 다음과 같이 변경하십시오 :'Example operator ++ (int) {return Example (m_i ++); } ' –