クラスメンバーへのアクセス

C言語 / C++

以下の例は構造体、クラスで共通だが、メンバ関数に関してはC++のみ。

// メンバ変数
obj.field1

// メンバ関数
obj.method1(arg1, arg2)

// ポインタからメンバ変数へのアクセス
ptr->field1

// ポインタからメンバ関数へのアクセス
ptr->method1(arg1, arg2)

// 静的メンバ変数
FooClass::field1

// 静的メンバ関数
FooClass::method1(arg1, arg2)

構造体やクラスの変数名からはドット(.)で、ポインタからは -> で、クラス名から静的メンバには二重コロン(::)でアクセスする。

メンバ関数呼び出しは引数がなくても括弧が必要。

Java

// インスタンスフィールド
obj.field1;

// クラスフィールド (staticフィールド)
FooClass.staticField1;

// インスタンスメソッド
obj.method1(arg1, arg2);

// クラスメソッド (staticメソッド)
FooClass.method2(arg1, arg2);

メソッド呼び出しは引数がなくても括弧が必要。

JavaからScalaのコンパニオンオブジェクトのフィールドにアクセスするには

FooClass$.MODULE$.field1

のようにする。コンパニオンオブジェクトのクラス名は後ろに $ が付き、インスタンスは MODULE$ というstaticなフィールドに保存されている。

Scala

// フィールド
obj.field1;

// コンパニオンオブジェクトのフィールド
FooClass.field1;

// メソッド
obj.method1(arg1, arg2);

// 引数がないメソッド呼び出し
obj.method2;

// コンパニオンオブジェクトのメソッド
FooClass.method1(arg1, arg2);

メソッド呼び出しは引数がなければ括弧は不要。

PHP

// プロパティ
$obj->field1;

// クラスプロパティ
FooClass::$staticField1;

// クラスで定義されている定数
FooClass::BAR

// メソッド
$obj->method1($arg1, $arg2);

// クラスメソッド
FooClass::method1($arg1, $arg2);

メソッド呼び出しは引数がなくても括弧が必要。プロパティとメソッドのアクセスは括弧の有無で区別されるので名前空間が異なり、同じ名前のプロパティとメソッドが共存できる。

Ruby

Rubyでは外部からフィールドに直接アクセスすることはできず、アクセッサメソッドを利用する。

# アクセッサメソッドの定義の例
class FooClass

  # フィールドへの読み取り専用アクセッサ
  attr_reader :field1, :field2

  # フィールドへの読み書きアクセッサ
  attr_accessor :field3, :field4

end

# アクセッサメソッドでの読み取り
obj.field1

# アクセッサメソッドでの書き換え
obj.field1 = new_value

attr_reader では、単にフィールドの値を返すだけのメソッドがフィールドと同じ名前のメソッドが作られる。上記では field1, field2 という名前のメソッドが作られる。

attr_accessor では、読み取り用のメソッドと書き込み用のメソッドがそれぞれ作られる。上記では field3, field3=, field4, field4= という名前のメソッドが作られる。

これらは FooClass.instance_methods を呼び出すことで確認できる。

Perl

# インスタンスメソッド
$obj->method1($arg1, $arg2);

# クラスメソッド
FooClass->method1($arg1, $arg2);
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク