2009-08-05 4 views
0

나에게 관심이 내 게시물 중 하나에 대한 코멘트 :컴파일러는 어떤 멤버 함수가 변경되는지 어떻게 결정합니까?

Me too. 또한 접근 자/변형 자에게 같은 이름을 지정합니다. 난 항상 대신 같은 일이라는 뮤 테이터의 setBar(int bar)을 사용했기 때문에

나는 이것에 대해 궁금 해서요. 내가 알고 싶은 : 컴파일러는 const 식별자를 기반으로 런타임에 변이를 판별 할 수 있습니까? 아니면 매개 변수를 가지고 있기 때문에 동일한 함수 이름을 사용할 수 있습니까?

class Foo 
{ 
    int bar_; 

    public: 
     int bar() { return bar_; } 
     void bar(int bar) { bar_ = bar; } 
} 

을 또는 내가 (난 그냥이 나와 함께 실행, 나는 어쨌든이 일을해야 실현)이 작업을 수행해야합니까 :

이 잘 컴파일

int bar() const { return bar_; } 

I 돈을 어느 것이 어떤 것인지 알지 못한다. Const의 정확성은 중요합니다. 그래서 컴파일러가 하나의 변이를 일으키고 하나가 변하기 때문에 과부화에 반대하고 싶습니다.

왜 이런 방식으로 작동합니까?

+0

코드가 잘못되었습니다. int bar()와 같아야합니다. const {return bar_; } 내 생각 엔. 반환 형식은 코드에서 손실됩니다. –

+0

내 전체 게시물을 보니, 아니면 그냥 나를 끌어 내려고하려는거야? = ( – jkeys

답변

4

컴파일러가 가장 먼저 주목해야 할 것은 함수에 전달할 매개 변수의 수와 유형입니다. 이는 심지어 의 오버로드를 해결하기 전에 심지어 const -ness를 봐야합니다.

당신이 constbar()를 표시하지 않을 경우, 컴파일러는 객체의 const 인스턴스 bar()를 호출하려고이 처음으로 알려줍니다.

+0

OK, 매개 변수가됩니다. 감사합니다! – jkeys

2

컴파일러는 실제로 개체를 변형시키지 않는 비 const 멤버 함수를 작성할 수 있습니다. 이는 const-correctness에 위배되는 것이 아니며 const 참조를 통해 객체가 변형되지 않도록합니다. 여기서의 원칙은 const가 함수가 돌연변이되지 않을 수 있고, const가 아닌 경우 함수가 원하는 경우 돌연변이가 자유 롭다는 것을 말합니다. 변종을 약속 할 수있는 방법이 없으며 컴파일러가 다음과 같이 시행하도록해야합니다. 이것은 호출자에게 사용하기에는 너무 애매한 것이라고 생각합니다.

그렉 (Greg)이 말한 것처럼 컴파일러는 const 객체에서 비 const 멤버 함수를 호출하려고 할 때 객체가됩니다 (다시 말해 실제로 변경되는지 여부는 관계가 없습니다. 단지 중요한 것은 const로 선언되었는지 여부입니다).

0

쉽게 이해할 수 있도록 컴파일러에서는 해당 개체에 대해 const가 아닌 메서드가 호출 될 경우 개체가 변경된다고 가정합니다.

const 메서드에서 데이터 멤버 중 하나 또는 클래스의 다른 const가 아닌 메서드 중 하나에 대해 const가 아닌 메서드를 호출하면 컴파일러에서 오류를 알립니다.

연산자를 메서드로 간주 할 수도 있습니다 (일부 연산자는 메서드가 아닌 friend 함수로 정의 할 수 있지만 단순화 ...). 예를 들어, 대입 연산자 (operator =)는 기본적으로 비 const입니다. 당신이 컴파일러는 당신이 CONST 방법은 const를 목적 내부 classMember의 할당 연산자라는 것을 고려할 것

void MyClass::MyConstMethod() const 
{ 
    classMember = value; 
} 

뭔가를 할 경우 그 의미한다. operator =가 const가 아니기 때문에 컴파일러 오류가보고됩니다.