mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 215

 

그런데 배열을 선언하면 static X x[n]; X에 토러스가 있는 경우 먼저 그 안의 모든 요소 필드가 0으로 설정되고 개인 필드인 경우에만 토러스가 호출됩니다. 따라서 private 필드가 무효화된다는 점에서 OOP 패러다임에 위배되지 않습니다.

그러나 디자이너가 해결하지 못한 것은 잼입니다.

 
mktr8591 # :

그런데 배열을 선언하면 static X x[n]; X에 토러스가 있는 경우 먼저 그 안의 모든 요소 필드가 0으로 설정되고 개인 필드인 경우에만 토러스가 호출됩니다. 따라서 private 필드가 무효화된다는 점에서 OOP 패러다임에 위배되지 않습니다.

괜찮은. 제로화는 생성자보다 먼저 진행되므로 모든 것이 정확하다는 것이 밝혀졌습니다. 고맙습니다!

 
Igor Makanu # :

MQL5에 대한 내 연구를 살펴보면 더 나쁠 수 있습니다. 심지어 여러 기간 동안 지표의 기록을 펌핑합니다.

for 문에 쓸 수 있는 것들이 많이 있습니다)))

for 문에서 void 함수에 대한 호출을 본 적이 없습니다. 나머지 옵션은 매우 일반적입니다.

 
mktr8591 # :
클래스에 중요하지 않은 필드(객체)가 있는 경우 전체 객체를 0으로 초기화한 후 해당 필드에 대해 기본 c-tor가 호출된다는 점을 추가하는 것을 잊었습니다.

독서:

값 초기화의 효과는 다음과 같습니다.

하나)   T 가 기본 생성자 가 없거나 사용자가 제공하거나 삭제된 기본 생성자 가 있는 클래스 유형이면 객체는 기본적으로 초기화 됩니다.
2)   만약    사용자가 제공하거나 삭제되지 않은 기본 생성자가 있는 클래스 유형입니다(즉, 암시적으로 정의되거나 기본 생성자가 있는 클래스일 수 있음). 객체는 다음과 같습니다.   제로 초기화   기본 초기화에 대한 의미론적 제약이 확인되고,    중요하지 않은 기본 생성자가 있고 객체는   기본 초기화 ;
삼)   T가 배열 유형이면 배열의 각 요소는 값으로 초기화됩니다.
4)   그렇지 않으면 객체는   제로 초기화 .


기본 초기화에 대해 읽어보세요.

  • 만약    (아마도 이력서 자격이 있음)   비 POD   (C++11까지)   클래스 유형, 생성자는 고려되고 적용됩니다.   과부하 해결   빈 인수 목록에 대해. 선택한 생성자(다음 중 하나입니다.   기본 생성자 ) 새 객체의 초기 값을 제공하기 위해 호출됩니다.
  • 만약    는 배열 유형이고 배열의 모든 요소는 기본적으로 초기화됩니다.
  • 그렇지 않으면 초기화가 수행되지 않습니다. 자동 저장 기간이 있는 개체(및 해당 하위 개체)에는 불확실한 값이 포함됩니다.

유!

컴파일러가 0으로 초기화한다는 사실은 아무 의미가 없습니다. 오늘과 내일 다음 업데이트 이후에 초기화됩니다.

 
Vladimir Simakov # :

독서:

값 초기화의 효과는 다음과 같습니다.

하나)   T 가 기본 생성자 가 없거나 사용자가 제공하거나 삭제된 기본 생성자 가 있는 클래스 유형이면 객체는 기본적으로 초기화 됩니다.
2)   만약    사용자가 제공하거나 삭제되지 않은 기본 생성자가 있는 클래스 유형입니다(즉, 암시적으로 정의되거나 기본 생성자가 있는 클래스일 수 있음). 객체는 다음과 같습니다.   제로 초기화   기본 초기화에 대한 의미론적 제약이 확인되고,    중요하지 않은 기본 생성자가 있고 객체는   기본 초기화 ;
삼)   T가 배열 유형이면 배열의 각 요소는 값으로 초기화됩니다.
4)   그렇지 않으면 객체는   제로 초기화 .


기본 초기화에 대해 읽어보세요.

  • 만약    (아마도 이력서 자격이 있음)   비 POD   (C++11까지)   클래스 유형, 생성자는 고려되고 적용됩니다.   과부하 해결   빈 인수 목록에 대해. 선택한 생성자(다음 중 하나입니다.   기본 생성자 ) 새 객체의 초기 값을 제공하기 위해 호출됩니다.
  • 만약    는 배열 유형이고 배열의 모든 요소는 기본적으로 초기화됩니다.
  • 그렇지 않으면 초기화가 수행되지 않습니다. 자동 저장 기간이 있는 개체(및 해당 하위 개체)에는 불확실한 값이 포함됩니다.

유!

컴파일러가 0으로 초기화한다는 사실은 아무 의미가 없습니다. 오늘과 내일 다음 업데이트 이후에 초기화됩니다.

내 게시물 "Forgot to add ...."는 이전 게시물에 추가로 작성되었습니다.

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

mql5 언어의 특징, 미묘함 및 작업 방법

mktr8591 , 2021.11.18 18:15

@A100




mql이 C++에서 파생되었다는 것을 기억한다면 이 클래스에는 생성자가 없기 때문에(즉, 암시적 생성자가 있기 때문에) 이 두 예제(그 유사체)가 모두 거기에서 잘 작동합니다.

  • ClassX 선언 x[n]={}; 결과적 으로 각 배열 요소의 값 초기화가 발생합니다.
  • ClassX에 사용자 정의 생성자가 없는 경우(그러나 삭제되지 않은 기본 생성자가 있는 경우) 개인 필드의 존재 여부에 관계없이 클래스 객체의 제로 초기화가 수행됩니다.
  • 그러나 const 필드가 있으면 기본 토르가 암시적으로 제거되므로 컴파일러 오류가 발생합니다.

C++의 예:

#include <iostream>
using namespace std;

class X
{
     int a;
     public :
     int get (){ return a;}

     //X(){}   //так массив x не обнуляется
     //а если нет конструктора - то обнуляется
};

int main()
{
    X x[ 10 ]={};
     for ( int i= 0 ; i< 10 ;i++)   cout<<x[i]. get ()<<endl;
}

따라서 구조체/클래스에 const 필드가 없으면 작업 논리가 정확합니다.


클래스에 사용자 정의 생성자가 없고 삭제되지 않은 암시적 생성자가 있는 경우와 같은 특정 상황을 처리했습니다. 이 경우 귀하가 인용한 제1항은 적용되지 않습니다.

단락 " 2) 적용   만약    사용자가 제공하거나 삭제되지 않은 기본 생성자가 있는 클래스 유형입니다(즉, 암시적으로 정의되거나 기본 생성자가 있는 클래스일 수 있음). 객체는 다음과 같습니다.   제로 초기화   기본 초기화에 대한 의미론적 제약이 확인되고,    중요하지 않은 기본 생성자가 있고 객체는   기본 초기화 ;""


그래서 모든 것이 맞습니다.

 
Vladimir Simakov # :

독서:

값 초기화의 효과는 다음과 같습니다.

하나)   T 가 기본 생성자 가 없거나 사용자가 제공하거나 삭제된 기본 생성자 가 있는 클래스 유형이면 객체는 기본적으로 초기화 됩니다.
2)   만약    사용자가 제공하거나 삭제되지 않은 기본 생성자가 있는 클래스 유형입니다(즉, 암시적으로 정의되거나 기본 생성자가 있는 클래스일 수 있음). 객체는 다음과 같습니다.   제로 초기화   기본 초기화에 대한 의미론적 제약이 확인되고,    중요하지 않은 기본 생성자가 있고 객체는   기본 초기화 ;
삼)   T가 배열 유형이면 배열의 각 요소는 값으로 초기화됩니다.
4)   그렇지 않으면 객체는   제로 초기화 .


기본 초기화에 대해 읽어보세요.

  • 만약    (아마도 이력서 자격이 있음)   비 POD   (C++11까지)   클래스 유형, 생성자는 고려되고 적용됩니다.   과부하 해결   빈 인수 목록에 대해. 선택한 생성자(다음 중 하나입니다.   기본 생성자 ) 새 객체의 초기 값을 제공하기 위해 호출됩니다.
  • 만약    는 배열 유형이고 배열의 모든 요소는 기본적으로 초기화됩니다.
  • 그렇지 않으면 초기화가 수행되지 않습니다. 자동 저장 기간이 있는 개체(및 해당 하위 개체)에는 불확실한 값이 포함됩니다.

유!

컴파일러가 0으로 초기화한다는 사실은 아무 의미가 없습니다. 오늘과 내일 다음 업데이트 이후에 초기화됩니다.

죄송합니다. 제대로 읽지 않았습니다. 이 경우:

2)   만약        사용자가 제공하거나 삭제되지 않은 기본 생성자가 있는 클래스 유형(즉, 암시적으로 정의되거나 기본 생성자가 있는 클래스일 수 있음), 객체는 0으로 초기화 되고 기본 초기화에 대한 의미론적 제약 조건 확인되고 만약        중요하지 않은 기본 생성자가 있고 객체는   기본 초기화 ;
 
fxsaber # :

괜찮은. 제로화는 생성자보다 먼저 진행되므로 모든 것이 정확하다는 것이 밝혀졌습니다. 고맙습니다!

만일의 경우를 대비하여 명확히 하겠습니다. 이것은 정적에만 해당됩니다(모두 C ++에 관한 것입니다). 지역 변수의 경우 사용자 정의 토러스가 있으면 nulling이 없습니다.
 
fxsaber # :

for 문에서 void 함수에 대한 호출을 본 적이 없습니다. 나머지 옵션은 매우 일반적입니다.

for 연산자의 세 번째 매개변수에서 원하는 대로 작성할 수 있습니다. 사실 for 연산자는 if() 연산자를 {.....}로 대체할 수 있습니다.

추신: 다음 형식의 매크로도 보았습니다.

 do
{
.....
} while ( 0 )
 
Igor Makanu # :

for 연산자의 세 번째 매개변수에서 원하는 대로 작성할 수 있습니다. 사실 for 연산자는 if() 연산자를 {.....}로 대체할 수 있습니다.

추신: 다음 형식의 매크로도 보았습니다.

세미콜론을 제거하십시오. 그렇지 않으면 전체 의미가 손실됩니다)))

 
Vladimir Simakov # :

세미콜론을 제거하십시오. 그렇지 않으면 전체 의미가 손실됩니다)))

네, 맞습니다. 이 예제는 매크로에 있습니다. 매크로를 호출할 때 설정, 매크로를 약간 사용합니다. 연습이 없습니다.