私のC++クラスのこれら2つのステートメントの違いを理解していません。
class MyClass {
public:
private:
static const int var = 0; // Option 1
const static int var = 0; // Option 2
};
オプション1とオプション2の違いは何ですか?どちらもコンパイルします。
それらはまったく同じことを意味します。読みやすいと思う方を自由に選択できます。
Cでは、最初に配置する必要static
がありますが、まだ必須ではありません。この点でC++がCに続いているかどうかはわかりません。
6.11.5ストレージクラス指定子
1宣言内の宣言指定子の先頭以外にストレージクラス指定子を配置することは、廃止された機能です。
static
、const
(ここではとにかく)とタイプ(例int
)はすべて宣言指定子の一部です。 歴史的に、宣言指定子はキーワードとタイプ名の順序付けられていないリストでした。したがって、次のようになります。
static unsigned int const var;
static unsigned const int var;
static int unsigned const var;
static int const unsigned var;
static const unsigned int var;
static const int unsigned var;
unsigned static int const var;
unsigned static const int var;
unsigned int static const var;
unsigned int const static var;
unsigned const static int var;
unsigned const int static var;
int static unsigned const var;
int static const unsigned var;
int unsigned static const var;
int unsigned const static var;
int const static unsigned var;
int const unsigned static var;
const static unsigned int var;
const static int unsigned var;
const unsigned static int var;
const unsigned int static var;
const int static unsigned var;
const int unsigned static var;
すべて合法であり、すべて同じことを意味していました。
これはCとC++の両方に当てはまると思いますが、私が間違っていなければ、Cはストレージクラス指定子(static
)を最初以外の場所に配置することを非推奨にしました。いずれにせよ、これはほぼ普遍的な慣習であるため、通常はstatic
(およびextern
など)を先頭に置く必要があります。
順序付けされていないことは、宣言指定子にのみ適用されることにも注意してください。以下の宣言子の中で、cv-qualifier(s)はそれらが修飾するものに従わなければなりません。直交性の理由から、通常は常にcv-qualifiersを変更したもの(つまりint const
、ではなくconst int
)の後に配置する必要があります。
最後に、型の前に型修飾子を表示し、長さ修飾子(、または)の前に符号付き修飾子(signed
または
)を付けることは、広く行われている規則のようです。また、修飾子が存在する場合はドロップすることもかなり頻繁にあるため、人々は、ではなく、、および
ではなく、を記述します。ただし、これは普遍的ではありません。unsigned
short
long
long
long
int
unsigned
unsigned int
long
long int
これを考えると、上記の宣言を書く最初の方法が好まれますが、を削除することは非常に許容されますint
。
それらは同じです。しかし、キーワードがデータ型を定義するときに並置すると、キーワードconst
との適合性が向上するという単純な理由から、私は常にオプション1を選択します。int
一方、キーワードstatic
はその変数のアクセシビリティを定義します。
それらは同じです。このディスカッションを参照してください:http://bytes.com/topic/c/answers/140177-const-static-vs-static-const