変数がデータ型のインスタンスであると言うのは正しいですか?


9

(プログラムの過程でその値を変更できます)

または、「何かのインスタンス」はクラスとオブジェクトに厳密に関連していますか?もしそうなら、C ++に関して「変数」の概念をどのように定義しますか?


C#とJavaは、2つの興味深い点でC ++と異なります。最初に、それらはプリミティブ型をオブジェクト(および構造体)型と統合しようとします(そのため、intのインスタンスについて話すことができます)が、C ++はそうしません。第2に、C#およびJavaでは、オブジェクトタイプの変数はヒープ内の(クラスの)インスタンスへの暗黙的な参照であり、オブジェクトへのポインターについては触れませんが、C ++では、@ coredumpの回答のように、オブジェクトタイプのローカル変数スタック上のインスタンスへのバインディングであり、オブジェクトとオブジェクトへのポインタを明示的に区別します。
Erik Eidt 2016年

回答:


8

私の知る限りでは、その型のプリミティブ型インスタンスの値を呼び出すことは正しいです (たとえば、Visual Studioのマニュアルの「C ++ Type System」を参照してください。ただし、別のソースを探しています)。この用語はオブジェクトを議論するときに主に使用されます。クラスCまたはそのサブクラスの1つで定義されたコンストラクターから作成されたオブジェクトは、クラスCのインスタンスです。

C ++の変数はランタイムの概念ではありません。これは、変数名と抽象(constでない場合は可変)位置との間の字句バインディングとしてコンパイラー内に存在します。プログラムがコンパイルされると、変数は存在しなくなります。代わりに、データはレジスタやメモリなどで読み書きされます。


2
プリミティブ型の値は通常、その型のインスタンスであるとは言われません。オブジェクトとクラスのために予約されています。」それはまったく真実ではありません。標準では、オブジェクトと見なされないプリミティブ型の値はどこにもありません。また、変数の定義は、それがユーザー定義のクラスであるかプリミティブ型であるかに応じて、いかなる方法でも変更されません。
Nicol

@NicolBolas C ++のコンテキストで整数を何かのインスタンスとして参照することを聞いたことがありません。標準で明示的に言及されていなくても、整数のインスタンスではないと言うのは間違いないと思います。そうでない場合、それらのインスタンスは何ですか?また、変数の定義がプリミティブ型とオブジェクトの間で変化するとこの回答が主張しているところもわかりません。「インスタンス」は単に変数の定義とは関係がないと主張しているようです(正しくはafaik)。
Ixrec 2016年

2
@Ixrec:「そうでない場合、それらのインスタンスは何ですか?」タイプint。C ++標準では、変数宣言の機能について説明するときに、プリミティブ型と非プリミティブ型を区別していません。そのT t;ため、たまたまTどんな型であっても、型のオブジェクトを宣言Tします。
Nicol Bolas

1
@Ixrec:リテラルは別の種類のものであることに注意してください。リテラルは一種の適切な値です。しかし、リテラル変数を作成することはできないので、それは別の議論です。
Nicol Bolas

5

または、「何かのインスタンス」はクラスとオブジェクトに厳密に関連していますか?もしそうなら、C ++に関して「変数」の概念をどのように定義しますか?

C ++で可能な限り簡潔にする

  • 変数は、ある名前のために(コードで)メモリ内の位置、実行時に決定されます。
  • インスタンスであるオブジェクトメモリに常駐実行時。

ただ明確にします:

  • すべてのメモリ領域にオブジェクトが含まれているわけではありません。たとえば、メモリの一部の領域に「ガベージ」値が含まれている場合があります。
  • オブジェクトを格納するすべてのメモリにコードで名前が付けられるわけではありません。オブジェクトは、配列内の位置などのメモリの名前のない領域、またはポインタによって参照されるヒープ上のどこかに存在する可能性があります。
  • メモリの領域にゴミが含まれている場合、その場所でオブジェクトが初期化されていないか、以前に存在していたオブジェクトが破棄されたことが原因です。

1
PODはC ++のオブジェクトです。すべてのメモリ領域がオブジェクトであるわけではありませんが、PODは単なるメモリ領域ではありません。
Nicol Bolas

1
NicolBolasの2番目です。PODはオブジェクトです。ただし、新しく作成されたmalloc()が、まだ初期化されていないバッファについて話すとき、あなたはポイントを持っています:それはまだオブジェクトではないメモリ領域です。同様に、明示的に破壊されたオブジェクト:これはオブジェクトではなくなったメモリ領域です。
cmaster-モニカを2016年

@NicolBolasの公正なコメント、その表現を少し変更しました
Ben Cottrell

1

さて、「正しい」とはどういう意味ですか?

それについて非常に厳密にしたい場合は、以下を区別する必要があります。

  • 構文側:表現 持って(静的)タイプ
  • セマンティクスの側:オブジェクトがあるインスタンスクラス

したがって、変数(式)は型を持ちます。その値(参照するオブジェクト)は、あるクラスのインスタンスになります。また、変数の型とオブジェクトのクラスは一般に同じものではないことに注意してください。変数の静的型はオブジェクトの実行時クラスに上限を設けるため、クラスは型に対応するクラスのサブタイプである必要があります。

あの大きな一口をずっと繰り返したいですか?嫌です。どの程度厳密に、または大まかに話したいかは、状況によって異なります。そのため、「変数はこのタイプのインスタンスである」と言っても、ほとんど問題はありません。ここで実際に起こっていることは、オブジェクトとそのランタイムクラスのスーパークラスを参照するために、変数と型を意味論的に使用していることです。


1

あなたが人生全体を純粋主義と洗練に費やしたくないのであれば...はい。

一意に識別される何かを保持するたびに、インスタンス化を行っている他の一意に識別可能なことを偽造するための使用。

  • 製品にインスタンス化するプロジェクト
  • 実行可能ファイルにインスタンス化するソース
  • テンプレートは型にインスタンス化します。
  • 型は変数にインスタンス化します。

それらのインスタンス化のいくつかはより正確な名前を持っているかもしれませんが、一般的にこれは機能します。


0

多くの人々は、クラスのインスタンスのために「インスタンス」を予約します。そうすると、C ++では、変数はクラスのインスタンス、インスタンスへの参照、インスタンスへのポインター、またはプリミティブ型になります(構造体をそのコンテキストでクラスとしてカウントする可能性がありますが、ほとんどの場合、まったく同じです)。JavaまたはObjective-Cでは、変数はインスタンスではなく、インスタンスへの参照になる可能性があります。

忘れました:しばらくの間、C ++ポインターは、コンストラクターが実行を開始する前の「this」などの生のメモリーへのポインターになることがあります。この時点では、* thisをまだインスタンスと呼んでいない可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.