C++の匿名クラスとは?特徴と使い方をサンプルコードで解説
匿名(anonymous)とは、名前を持たずに定義されたあらゆる存在を指します。名前が付けられていないクラスは、C++では匿名クラス(anonymous class)と呼ばれます。匿名クラスには、次のような特別な性質があります。
クラスに名前が存在しないため、コンストラクタは割り当てられません。ただし、メモリブロックを解放するためのデストラクタは用意されています。
関数の要素として利用することはできません。すなわち、引数として渡したり、関数から返される値を受け取ったりすることはできません。
こうした性質から、匿名クラスは「一度だけインスタンス化したい」「ごく限られた範囲でしか使わない」ようなケースに向いています。
C++で匿名クラスを定義する構文
匿名クラスは、クラス名を省略して定義します。基本的な構文は以下の通りです。
class {
// データメンバ
// メンバ関数
} オブジェクト名;重要なのは、クラス定義の直後にオブジェクトを宣言しなければならないという点です。名前がない以上、後からこのクラス型の変数を新しく作ることはできません。
匿名クラスのサンプルプログラム
ここからは、実際のコードを使って匿名クラスの動作を確認していきましょう。
例1:匿名クラスの作成と単一オブジェクトの使用
まずは、匿名クラスを定義し、そのオブジェクトを1つ宣言してメンバを利用する例です。
#include <iostream>
using namespace std;
class{
int value;
public:
void setData(int i){
this->value = i;
}
void printvalues(){
cout<<"Value : "<<this->value<<endl;
}
}
obj1;
int main(){
obj1.setData(10);
obj1.printvalues();
return 0;
}実行結果:
Value : 10
クラス定義の直後に obj1 を宣言している点に注目してください。匿名クラスは、定義と同時にオブジェクトを作成する必要があります。
例2:匿名クラスの複数オブジェクトの使用
匿名クラスであっても、複数のオブジェクトを持たせることは可能です。次のプログラムでは、2つのオブジェクトを作成して利用しています。
#include <iostream>
using namespace std;
class{
int value;
public:
void setData(int i){
this->value = i;
}
void print(){
cout<<"Value : "<<this->value<<endl;
}
}
obj1,obj2;
int main(){
cout<<"Object 1 \n";
obj1.setData(10);
obj1.print();
cout<<"Object 2 \n";
obj2.setData(12);
obj2.print();
return 0;
}実行結果:
Object 1 Value : 10 Object 2 Value : 12
この例では、obj1 と obj2 という2つのオブジェクトが、同じ匿名クラスから生成されています。それぞれが独立したデータメンバを持ち、個別に値を設定・出力できることが分かります。
まとめ
匿名クラスとは、名前を持たずに定義されたクラスのことです。
名前がないためコンストラクタは持たず、デストラクタのみが用意されています。
関数の引数や戻り値として利用することはできません。
定義時にオブジェクトを宣言する必要があり、後から新しいインスタンスを追加することはできません。
-
PHPの匿名クラス(無名クラス)完全解説!基本構文から継承・ネスト・内部名まで
はじめに匿名クラス(無名クラス)とは、その名のとおり「名前を持たないクラス」のことです。一度きりの使用を目的としており、その場でクラスを定義したい場合に便利な機能です。PHPでは、PHP 7以降のバージョンから匿名クラスが利用できるようになりました。匿名クラスは式の中で定義され、その式の評価結果として、そのクラスのオブジェクトが返されます。定義にはnew classという構文を使用します。基本的な構文最もシンプルな匿名クラスの書き方は以下のとおりです。<?php $obj = new class { public function sayhello() { ech
-
PHP 7の匿名クラス(Anonymous Class)とは?基本構文と活用メリットを解説
PHP 7の匿名クラスとは PHP 7で導入された匿名クラス(Anonymous Class)は、new classという構文を使って、名前を持たないクラスをその場で定義できる機能です。通常のクラス定義のように事前に宣言しておく必要がなく、インスタンス化と同時にクラスを定義できるため、一時的なオブジェクトが必要な場面で非常に便利です。 また、匿名クラスは完全なクラス定義の代わりとしても利用できます。継承・インターフェースの実装・トレイトの利用といった、通常のクラスと同じ機能をすべて備えています。 匿名クラスを使うメリット モックによるテストが簡単に行える:テスト専用の一時的なクラスを、わざ