메소드 선언 후 const 수정자는 무엇을 의미합니까? - 페이지 6

 
상수 메서드
상수 메서드는 클래스 필드의 값을 변경하지 않는다는 점에서 다릅니다. CONSTFU라는 예제를 사용하여 이것을 고려하십시오.
// constfu.cpp
// применение константных методов
class aClass
{
private:
    int alpha;
public:
    void nonFunc()    // неконстантный метод
    { 
        alpha = 99;
    }      // корректно
    void conFunc()const   // константный метод
    { 
        alpha = 99;
    }    // ошибка: нельзя изменить значение поля
};

일반 nonFunc() 메서드는 알파 필드의 값을 변경할 수 있지만 상수 conFunc() 메서드는 변경할 수 없습니다. 후자가 알파 필드를 변경하려고 시도하면 컴파일러는 오류 메시지 를 발행합니다.
함수를 const로 만들려면 함수 프로토타입 뒤에 있지만 함수 본문이 시작되기 전에 const 키워드를 지정해야 합니다. 함수의 선언과 정의가 분리된 경우 const 수정자는 함수를 선언할 때와 정의할 때 모두 두 번 지정해야 합니다. 클래스 필드에서만 데이터를 읽는 메서드는 클래스 개체의 필드 값을 변경할 필요가 없기 때문에 상수로 만드는 것이 좋습니다.

const 함수를 사용하면 컴파일러가 오류를 감지하는 데 도움이 되며 목록의 독자에게 함수가 개체 필드의 값을 변경하지 않는다는 것을 나타냅니다. const 함수를 사용하면 나중에 살펴보겠지만 const 개체를 만들고 사용할 수 있습니다.

거리 클래스 예

하나의 프로그램에 많은 혁신을 포함하지 않기 위해 우리는 우리의 예에서 아직 일정한 방법을 사용하지 않았습니다. 그러나 상수 메서드를 사용하면 매우 유용한 상황이 많이 있습니다. 예를 들어, 예제에서 반복적으로 나타난 Distance 클래스의 showdist() 메서드는 호출 대상 객체의 필드가 변경되지 않고 변경되어서도 안 되기 때문에 일정하게 유지되어야 합니다. 현재 필드 값을 화면에 표시하기 위한 용도로만 사용됩니다 .

...

250페이지에서 가져옴, Laforet R. - C++의 객체 지향 프로그래밍(4판) 2004

 
Dmitry Fedoseev :

이것이 의미하는 바입니다. 이 컨텍스트에서는 유형이 논의되지 않기 때문입니다. "자체 클래스" - 해당 인스턴스(즉, 개체)가 분명합니다.

_x 멤버는 bar 메서드와 같은 클래스에 속합니다.

C obj._x - 여기서 _x 멤버는 obj 외부 클래스에 있습니다.

_x는 우리가 작성 중인 클래스를 참조하고 obj.x는 처리 중인 외부인을 참조하는 것이 분명하기 때문에 인스턴스가 아닌 클래스에 대해 이야기하는 것이 합리적으로 보입니다.

OOP 용어에 대해 이야기하면 모든 용어는 약간(또는 많이)입니다.

드미트리, 그렇게 말하면 OOP를 처음 접하는 사람들이 그런 용어에 미쳐 버릴 줄 알아!?

이것이 의미하는 바입니다. 이 컨텍스트에서는 유형이 논의되지 않기 때문입니다. "자신의 클래스" - 해당 인스턴스(즉, 개체)가 분명합니다.

이것은 아마도 당신에게 분명합니다. 나는 당신이 말한 것처럼 클래스가 명령, 추상화 인 경우 멤버 _x가 클래스에 속할 수있는 방법을 읽고 생각하고 있습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

메소드 선언 후 const 수정자는 무엇을 의미합니까?

드미트리 페도세프 , 2016.02.01 19:06

객체가 어떻게 메소드를 호출할 수 있습니까? 메서드는 함수 또는 다른 메서드에서 호출할 수 있습니다.

클래스 메서드만 호출되는 것이 아니라 특정 개체의 메서드가 호출됩니다. 클래스 자체는 추상화입니다.

C obj._x - 여기서 _x 멤버는 obj 외부 클래스에 있습니다.

클래스와 클래스 인스턴스의 차이점을 심각하게 이해하지 못하시나요!? 어떤 경우에도 그렇게 말할 수는 없습니다. 독자는 두뇌 폭발을 일으킬 것이고, 그는 메서드를 호출한 개체와 obj 개체가 동일한 인스턴스이지만 다른 클래스의 인스턴스라고 생각할 것이기 때문입니다. 클래스 (당신이 준 예에서).

OOP 용어에 대해 이야기하면 모든 용어는 약간(또는 많이)입니다.

용어는 당신이 무엇을 다루고 있는지 이해하지 못할 때 "약간"입니다. 클래스(명령어)가 무엇인지, 클래스의 객체(인스턴스)가 무엇인지 명확하게 이해하면 됩니다. 그러면 많은 문제가 저절로 사라질 것입니다. 분명히 나는 당신을 설득할 수 없을 것이므로 이 주제를 더 이상 논의할 의미가 없습니다. 매우 죄송합니다.
 
unreal :
상수 메서드
상수 메서드는 클래스 필드의 값을 변경하지 않는다는 점에서 다릅니다. CONSTFU라는 예제를 사용하여 이것을 고려하십시오.
// constfu.cpp
// применение константных методов
class aClass
{
private:
    int alpha;
public:
    void nonFunc()    // неконстантный метод
    { 
        alpha = 99;
    }      // корректно
    void conFunc()const   // константный метод
    { 
        alpha = 99;
    }    // ошибка: нельзя изменить значение поля
};

일반 nonFunc() 메서드는 알파 필드의 값을 변경할 수 있지만 상수 conFunc() 메서드는 변경할 수 없습니다. 후자가 알파 필드를 변경하려고 시도하면 컴파일러는 오류 메시지 를 발행합니다.
함수를 const로 만들려면 함수 프로토타입 뒤에 있지만 함수 본문이 시작되기 전에 const 키워드를 지정해야 합니다. 함수의 선언과 정의가 분리된 경우 const 수정자는 함수를 선언할 때와 정의할 때 모두 두 번 지정해야 합니다. 클래스 필드에서만 데이터를 읽는 메서드는 클래스 개체의 필드 값을 변경할 필요가 없기 때문에 상수로 만드는 것이 좋습니다.

const 함수를 사용하면 컴파일러가 오류를 감지하는 데 도움이 되며 목록의 독자에게 함수가 개체 필드의 값을 변경하지 않는다는 것을 나타냅니다. const 함수를 사용하면 나중에 살펴보겠지만 const 개체를 만들고 사용할 수 있습니다.

거리 클래스 예

하나의 프로그램에 많은 혁신을 포함하지 않기 위해 우리는 우리의 예에서 아직 일정한 방법을 사용하지 않았습니다. 그러나 상수 메서드를 사용하면 매우 유용한 상황이 많이 있습니다. 예를 들어, 예제에서 반복적으로 나타난 Distance 클래스의 showdist() 메서드는 호출 대상 객체의 필드가 변경되지 않고 변경되어서도 안 되기 때문에 일정하게 유지되어야 합니다. 현재 필드 값을 화면에 표시하기 위한 용도로만 사용됩니다 .

...

250페이지에서 가져옴, Laforet R. - C++의 객체 지향 프로그래밍(4판) 2004

뭐, 머리로는 어떤 순서로 나올지 모르지만, OOP에 관한 책에 써있다고 해도 옳지 않다. 번역의 문제일 수도 있지만.
 
Alexey Kozitsyn :

드미트리, 그렇게 말하면 OOP를 처음 접하는 사람들이 그런 용어에 미쳐 버릴 줄 알아!?

이것은 아마도 당신에게 분명합니다. 나는 당신이 말한 것처럼 클래스가 명령, 추상화 인 경우 멤버 _x가 클래스에 속할 수있는 방법을 읽고 생각하고 있습니다.

클래스와 클래스 인스턴스의 차이점을 심각하게 이해하지 못하시나요!? 어떤 경우에도 그렇게 말할 수는 없습니다. 독자는 두뇌 폭발을 일으킬 것이고, 그는 메서드를 호출한 개체와 obj 개체가 동일한 인스턴스이지만 다른 클래스의 인스턴스라고 생각할 것이기 때문입니다. 클래스 (당신이 준 예에서).

용어는 당신이 무엇을 다루고 있는지 이해하지 못할 때 "약간"입니다. 클래스(명령어)가 무엇인지, 클래스의 객체(인스턴스)가 무엇인지 명확하게 이해하면 됩니다. 그러면 많은 문제가 저절로 사라질 것입니다. 분명히 나는 당신을 설득할 수 없을 것이므로 이 주제를 더 이상 논의할 의미가 없습니다. 매우 죄송합니다.

왜 나를 설득하려고 합니까? 설득할 것이 정확히 무엇입니까? 난 괜찮아. 저에게는 충돌 없는 완전한 이해를 위해 이 주제의 첫 번째 게시물로 충분했습니다.

또한 참조가 이해에 충분할 것이라고 작성했습니다. 따라서 일반적으로 당신이 논쟁하는 내용이 명확하지 않습니까?

추신. 당신 자신의 많은 망상을 나에게 돌리지 마십시오.

 
George Merts :

개인적으로 저는 항상 클래스 변수를 변경할 수 없는 메서드를 const 메서드로 이해했습니다.

나는 그것을 매우 드물게 사용했습니다. 메소드를 재정의할 때 무언가를 변경해야 하고 기본 메소드가 상수인 상황에 두 번 이상 부딪쳤기 때문 입니다(여기에서 이미 언급했습니다).

나는 정적 방법을 광범위하고 두껍게 사용합니다. 실제로 어떤 어려운 수업이든. 일반적으로 이들은 클래스 변수에 대한 액세스가 필요하지 않은 "서비스" 추가 메서드입니다.

또한 "하루의 초"와 같은 상수의 경우 #define이 아닌 정적 const 구성을 사용하려고 합니다. 동시에 이러한 상수의 선언과 초기화는 다른 위치에 있지만 다른 한편으로 유형 제어가 발생하여 두 번 이상 도움이 되었습니다.

동일 - 거의 사용하지 않습니다. 사실, 이 포럼의 참가자 중 한 명이 개인적인 메시지로 왜 그들이 필요한지 물었기 때문에 이 주제를 시작했습니다.
 
George Merts :

개인적으로 저는 항상 클래스 변수를 변경할 수 없는 메서드를 const 메서드로 이해했습니다.

나는 그것을 매우 드물게 사용했습니다 . 메소드를 재정의할 때 무언가를 변경해야 하고 기본 메소드가 상수인 상황에 두 번 이상 부딪쳤기 때문입니다(여기에서 이미 언급했습니다).

이러한 이유로 당신은 그것들을 사용하지 않으며, 이러한 이유로 나는 그것들을 사용합니다:

zaskok3 :

나를 위해 const와 static을 사용하면 내 코드의 가독성/이해가 크게 향상됩니다. 또한 구현 초기 단계에서 자체 아키텍처의 버그나 결함을 자주 포착할 수 있습니다 .


나는 나 자신을 위해 모든 것을 씁니다. 그리고 내가 해서는 안 되는 데이터를 변경하지 않을 것 같습니다. 그러나 자신의 어리석음으로부터 자신을 보호하려는 욕구는 OOP 아키텍처를 변경에 사용할 수 있는 것만 사용할 수 있는 방식으로 리벳을 박도록 강요합니다. 나머지 - 아니요. 그리고 여기서 const + 유형의 상속이 많은 도움이 됩니다. 추천하다.
 

친절한 사람들이 고문의 편집을 도와줍니다. 저는 프로그래밍에 약하지 않습니다.

다음은 'delete'에서 발생하는 오류입니다. 컴파일할 때 예상되는 이름이 표시됩니다.

빨간색으로 강조 표시된 코드 오류

무효 삭제(int 유형){

if(OrdersTotal()>0){

for(i=OrdersTotal()-1;i>=0;i--){

주문 선택(i,SELECT_BY_POS, MODE_TRADES );

if(유형!=6 && 유형!=7 && 유형!=8)if(OrderSymbol()==Symbol() && OrderMagicNumber()==매직 && OrderType()==유형)OrderDelete(OrderTicket());

if(유형==6)if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP || OrderType()==OP_BUYLIMIT || 주문 유형 ()==OP_SELLLIMIT)OrderDelete(OrderTicket());

if(유형==7)if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT)OrderDelete(OrderTicket());

if(유형==8)if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT)OrderDelete(OrderTicket());

}

}

}


여기에 또 다른 오류 '(' - 개체 포인터가 필요합니다.

if(oppositedelete){delete(OP_SELLSTOP);delete(OP_SELLLIMIT);}

그리고 여기 '}' - 모든 제어 경로가 값을 반환하는 것은 아닙니다.

정수 카운트 글로벌(){

정수 cnt=0;

if(OrdersTotal()>0){

for(i=OrdersTotal()-1;i>=0;i--){

주문 선택(i,SELECT_BY_POS,MODE_TRADES);

cnt++;

}

리턴(cnt);

}

}

 
zaskok3 :

이러한 이유로 당신은 그것들을 사용하지 않으며, 이러한 이유로 나는 그것들을 사용합니다:

나는 const 지정자가 오래 전에 작성된 함수를 읽고 이해할 때 유용하다는 데 동의합니다. 그러나 다른 private-protected-public 섹션에서 변수를 선언하여 변수에 대한 액세스를 제한 하는 것이 더 합리적인 것 같습니다(저는 개인적으로 변수를 public으로 선언하지 않고 메서드만 사용합니다).

자손에서 내부 클래스 변수를 수정하지 않아도 되는 상황을 생각하기가 어렵습니다.

 
Anton Razmyslov :

친절한 사람들이 고문의 편집을 도와줍니다. 저는 프로그래밍에 약하지 않습니다.

그리고 논리로? 왜 그런 질문으로 완전히 비핵심적인 주제를 어지럽히는가?
 

그건 그렇고, 아무도 Const 수정자가 클래스 내부의 데이터를 변경하는 것을 허용하지 않을 뿐만 아니라 비 const 메소드에 액세스하는 것을 허용하지 않는다고 썼습니다. 간단한 예: 직위 클래스가 있습니다. 수익을 기준으로 직위 목록을 정렬해야 합니다. 이익은 요청 시 계산됩니다.

 class CPosition : public CObject
{
private :
   double m_profit;
   void CalculateProfit()
   {
      m_profit = 31337 ;
   }
public :
   CPosition( void ) : m_profit( 0.0 )
   {
   }
   double Profit( void ) const
   {
       if (m_profit == 0.0 )
         CalculateProfit(); // <- Константный метод вызывает блок рассчета и вызывает ошибку
       return m_profit;
   }
   virtual int Compare( const CObject *node, const int mode= 0 ) const
   {
       const CPosition* pos = node;
       if (pos.Profit() > Profit())
         return 1 ;
       else if (pos.Profit() < Profit())
         return - 1 ;
       return 0 ;
   }
};

이 코드는 오류를 발생시킬 것입니다. 왜냐하면 Profit 메서드는 일정하지만 아직 이익이 계산되지 않은 경우 일정하지 않은 CalcultaeProfit 메서드를 참조하기 때문입니다.

Profit 메서드 자체는 절대적으로 안전합니다. 반환된 값이 비어 있지 않음을 보장합니다. 그러나 상수 방법을 사용 하려면 배후에서 계산을 포기하고 코드의 높은 보안을 유지해야 하며, 무엇을, 왜 제한하는지 이해하지 못하는 일부 유형의 구조가 필요합니다.