MQL5で学び、共に書く - ページ 32

 

というようなコードが書かれているのですが、どうなんでしょう?

std::string s = "";

少なくとも、叱られるのは当然でしょう。

繰り返しになりますが、これは生成時に正しい初期化が必要な複雑な型 です、もし文字列の初期化が必要なら、それは間違いなくMT5(4)のバグです。

配列のサイズは、作成後すぐにゼロにすべきなのかもしれません。

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
TheXpert:

どうでしょう :) うちの会社では、こんなコードを書くと罰金を取られますよ。

少なくとも、叱責されるでしょうし、当然だと思います。

変数を使用する前に、その変数に値を代 入する(明示的に初期化する)必要があります。それとも、そう思わない?

明示的な初期化は、宣言の時点でその必要性を意味するものではありません。しかし、初期化されていない変数の値が何らかの計算で使われた場合、その結果は予測不可能になります。

 

お言葉ですが、ラシードさん、怖いです。

クラスにはコンストラクタがあり、オブジェクトの初期化を行い、論理的であればデフォルト値を設定することも含まれます。

初期化が行われない場合、オブジェクトが適切な状態であるかどうかを知る方法が必要である。文字列の場合、デフォルト値を設定する方がはるかに理にかなっています。

std::string s = "";

このような表記はパラノイアであり、パラノイアの人は先験的に正常なコードを書けません。

では、文字列は初期化されないのですか?

 
TheXpert:
では、文字列は初期化されていないのですか?
もちろん、初期化されますが、空文字列 "" ではなく、NULLになります。
 
TheXpert:

お言葉ですが、ラシードさん、怖いです。

クラスにはコンストラクタがあり、ここでオブジェクトの初期化が行われ、論理的であればデフォルト値の設定も含まれます。

初期化が行われない場合、オブジェクトが適切な状態であるかどうかを知る方法が必要である。文字列の場合、デフォルト値を設定する方がはるかに理にかなっています。

このような表記はパラノイアであり、パラノイアの人は先験的に正常なコードを書けません。

では、文字列は初期化されないのですか?

ヘルプを読む -https://www.mql5.com/ru/docs/basis/types/classes。

構造体が文字列 型変数や動的配列オブジェクトを 含む場合、コンパイラはその構造体に暗黙のコンストラクタを割り当て 文字列型構造体のすべてのメンバーがゼロに れ、動的配列オブジェクトに対して正しい初期化が 行われるようにします。

...

コンストラクタとデストラクタ

コンストラクタは、構造体オブジェクトやクラスを作成する際に自動的に呼び出される特殊な関数で、通常、クラスのメンバを初期化 するために使用されます。以下の説明では、クラスについてのみ述べますが、特に断りのない限り、上記は構造体にも適用されます。コンストラクタ名はクラス名と一致させる必要があります。コンストラクタは戻り値の型を持ちません(void 型は指定できます)。

文字列動的配列、初期化が必要なオブジェクトなど、特定のクラスメンバは、コンストラクタの存在にかかわらず、いずれにせよ初期化されます。

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

それは残念・・・。少なくとも私は知っている。

構造体もNULLになるのでしょうか?

 
TheXpert:

それは残念・・・。少なくとも私は知っています。

構造物でもNULLになるのでしょうか?

NULLと比較すればすべてがわかる -void型と定数NULL

定義済み定数変数 NULLvoid であり、他の基本的な型の変数に変換せずに代 入することができます。また、基本型の変数を NULLと比較 することも可能である。

//--- 文字列が初期化されていない場合、あらかじめ定義された値を代入する
if(some_string==NULL) some_string="empty";

NULLは new演算子 で作成されたオブジェクトへのポインタとも比較できる。

 
Rosh:

変数を使用する前に、その変数に値を割り 当てる(明示的に初期化する)必要があります。それとも、そう思わない?

明示的な初期化は、宣言した瞬間にその必要性を暗示しているわけではありません。しかし、初期化されていない変数の値が、その後に何らかの計算で使われた場合、その結果は予測不可能になります。

鳥といえば。

//Struct StrMQL4_Deal
struct StrMQL4_Deal
{
//----------------------------------------------------------------------------//
double TP = 0;
double SL = 0;
//----------------------------------------------------------------------------//
};

また、コンパイラはどのように対応するのでしょうか?そして、次のように答えます。 '=' - 不正な代入の使用

//Class CMqlExpert
class CMqlExpert
//Purpose: Main class of trade system. 
{
//----------------------------------------------------------------------------//
protected:
//****************************************************************************//
//                    Protected declarations of the class                     //
//****************************************************************************//
bool TradeMonday    = true; //Trade in monday
bool TradeTuesday   = true; //Trade in tuesday
bool TradeWednesday = true; //Trade in wednesday
bool TradeThursday  = true; //Trade in thursday
bool TradeFriday    = true; //Trade in friday
//----------------------------------------------------------------------------//
public:

コンパイラは曲がっていなかった-。 '=' - 不正な代入の使用。

プログラマ(この場合、私)が変数を使う前に初期化しなかった場合(コンパイラが要求する方法で行い、コンストラクタでこの瞬間を省略する)、どうなるのでしょうか?


 
Interesting:

プログラマ(この場合は私)が、変数を 使う前に初期化する ことをしなかった場合(コンパイラが要求するように行い、コンストラクタでこの点を見逃した場合)、どうなるのでしょうか?

初心者の方からの質問ですが...。
 
sergeev:
新参者の質問みたいだが...。

まあ、当時はそう思っていたのですが(ずいぶん前のことなので、思い当たる節があります)、その場のノリでアプリケーションを書きたくなったんです。:)

でも、なぜコンパイラーレベルで変数の初期化が禁止されているのか、いまだに理解できません。

理由: