Categories: 未分類

C ++クラス

C++_classes

背景情報については、C ++および
クラス(コンピュータープログラミング)を参照してください クラスでのC ++は、あるユーザー定義型またはデータ構造で宣言されたキーワード classデータと機能(とも呼ばれる持っているメンバ変数とメンバ関数をアクセス3つのによって支配され、そのメンバーとして)アクセス指定子 プライベート、保護や公共。デフォルトでは、C ++クラスのメンバーへのアクセスはprivateです。プライベートメンバーはクラス外ではアクセスできません。それらは、クラスのメソッドを介してのみアクセスできます。パブリックメンバーはクラスへのインターフェイスを形成し、クラスの外部からアクセスできます。
クラスデータ型のインスタンスはオブジェクトと呼ばれ、メンバー変数、定数、メンバー関数、およびプログラマーによって定義されたオーバーロードされた演算子を含めることができます。

コンテンツ
1 C ++の構造体とクラスの違い
2 集約クラス
2.1 POD-構造体
2.1.1 Cの構造体とC ++のPOD構造体の間で共有されるプロパティ
3 宣言と使用法
3.1 グローバルクラスとローカルクラス 3.2 基本的な宣言とメンバー変数 3.3 メンバー関数 3.43.4 継承 3.5 オーバーロードされた演算子
3.5.1 バイナリのオーバーロード可能な演算子
3.5.2 単項オーバーロード可能な演算子
3.5.3 ブラケットのオーバーロード
3.6 コンストラクター 3.7 デフォルトのコンストラクタ 3.8 デストラクタ
4 コンストラクタとデストラクタの類似点
5 クラステンプレート
6 プロパティ
6.1 メモリ消費
6.1.1 ビットフィールド
6.2 参照による通過 6.3 このキーワード
7 も参照してください
8 参考文献

C ++の構造体とクラスの違い
C ++では、classキーワードで定義されたクラスには、デフォルトでプライベートメンバーと基本クラスが構造体は、structキーワードで定義されたクラスです。そのメンバーと基本クラスはデフォルトでパブリックです。実際には、構造体は通常、関数のないデータ用に予約されています。クラス/構造体から構造体を派生させる場合、基本クラス/構造体のデフォルトのアクセス指定子はパブリックです。また、クラスを派生させる場合、デフォルトのアクセス指定子はプライベートです。

集約クラス
集約クラスは、ユーザーが宣言したコンストラクター、プライベートまたは保護された非静的データメンバー、基本クラス、および仮想関数を持たないクラスです。このようなクラスは、中括弧で囲まれたコンマ区切りの初期化句のリストを使用して初期化できます。次のコードは、CとC ++の両方で同じセマンティクスを持っています。
構造体 C { int a ; ダブルb ; };構造体 D { int a ; ダブルb ;
C c ; };//初期化リストとタイプCのオブジェクトを初期化CをC = { 1 、2.0 }。 // Dはネストすることができイニシャライザ条項このような場合にタイプCのサブ集合体を有するDをD = { 10 、20.0 、{ 1 、2.0 }}。

POD-構造体
A POD-構造体(プレーン古いデータ構造)型非POD-構造体、非POD-組合(またはそのようなタイプのアレイ)または基準のない非静的データメンバを持たない集約クラスであり、およびNO USER-を有していません定義された代入演算子であり、ユーザー定義のデストラクタはありません。 POD構造体は、Cと同等のC ++であると言えstructます。ほとんどの場合、POD構造体は、Cで宣言された対応する構造体と同じメモリレイアウトになります。このため、POD構造体は口語的に「Cスタイルの構造体」と呼ばれることが

Cの構造体とC ++のPOD構造体の間で共有されるプロパティ
データメンバーは、アクセス指定子で区切られている場合を除いて、後のメンバーがオブジェクト内でより高いアドレスを持つように割り当てられます。
2つのPOD-structタイプは、同じ数の非静的データメンバーがあり、対応する非静的データメンバーが(順番に)レイアウト互換タイプである場合、レイアウト互換です。
POD構造体には、名前のないパディングが含まれる場合が
再解釈キャストを使用して適切に変換されたPOD-structオブジェクトへのポインターは、その初期メンバーを指し、その逆も同様です。これは、POD-structの先頭にパディングがないことを意味します。
POD-structは、offsetofマクロとともに使用できます。

宣言と使用法
C ++クラスには独自のメンバーがこれらのメンバーには、変数(他の構造体やクラスを含む)、メソッド、コンストラクター、デストラクタと呼ばれる関数(特定の識別子またはオーバーロードされた演算子)が含まれます。メンバーは、public:およびprivate:アクセス指定子をそれぞれ使用して、パブリックまたはプライベートにアクセス可能であると宣言されます。指定子の後に検出されたメンバーは、別の指定子が検出されるまで、関連付けられたアクセス権を持ちます。protected:指定子を利用できるクラス間の継承も

グローバルクラスとローカルクラス
すべてのメソッドの外部で定義されたクラスは、そのオブジェクトがプログラムのどこからでも作成できるため、グローバルクラスです。関数本体内で定義されている場合、そのようなクラスのオブジェクトは関数スコープに対してローカルであるため、ローカルクラスです。

基本的な宣言とメンバー変数
クラスはclassorstruct キーワードで宣言されます。メンバーの宣言は、この宣言内に配置されます。
struct Person { 文字列名; int年齢; };
クラス Person { パブリック: 文字列名; int年齢; };
上記の定義は機能的に同等です。いずれかのコードは、タイプのオブジェクトを定義するPerson2人のパブリックデータメンバーを有するものとして、nameおよびage。中括弧の後のセミコロンは必須です。
これらの宣言の1つ(両方でPersonはない)の後で、次のように使用して、Personデータ型の新しく定義された変数を作成できます。
#include #include struct Person { std ::文字列名; int年齢; };int main (){ 人a ; 人b ; A 。name = “Calvin” ; b 。name = “ホッブズ” ; A 。年齢= 30 ; b 。年齢= 20 ; std :: cout std :: cout カルバン:30ホッブズ:20

メンバー関数
C ++クラスと構造体の重要な機能は、メンバー関数です。各データ型には、データ型のすべての(パブリックおよびプライベート)メンバーにアクセスできる独自の組み込み関数(メソッドと呼ばれる)を含めることができます。これらの非静的メンバー関数の本体では、キーワードthisを使用して、関数が呼び出されるオブジェクトを参照できます。これは通常、オブジェクトのアドレスを暗黙の最初の引数として関数に渡すことによって実装されます。上記のPersonタイプをもう一度例として取り上げます。
#include クラス Person { パブリック: void Print ()const ; プライベート: std :: string name_ ; int age_ = 5 ; };void Person :: Print ()const { std :: coutの //「name_」と「age_」はメンバー変数です。「this」キーワードは//式であり、その値は//メンバーが呼び出されたオブジェクトのアドレスです。関数が// constとして宣言されているため、そのタイプは「constPerson *」です。}
上記の例では、Print関数はクラスの本体で宣言され、クラスの名前の後に::。を付けて修飾することで定義されています。name_とage_は両方ともプライベート(クラスのデフォルト)でありPrint、クラスの外部から使用する場合に必要なパブリックとして宣言されます。
メンバー関数を使用するとPrint、印刷を次のように簡略化できます。
A 。印刷();b 。印刷();
ここでa、およびb上記は送信者と呼ばれ、Print()関数が実行されるときに、それぞれが独自のメンバー変数を参照します。
クラスまたは構造体の宣言(そのインターフェースと呼ばれる)と定義(その実装と呼ばれる)を別々のユニットに分離するのが一般的な方法です。ユーザーが必要とするインターフェースはヘッダーに保持され、実装はソース形式またはコンパイル済み形式のいずれかで個別に保持されます。

継承
メモリ内の非PODクラスのレイアウトは、C ++標準では指定されたとえば、多くの一般的なC ++コンパイラは、親クラスフィールドと子クラスフィールドを連結することによって単一の継承を実装しますが、これは標準では必須ではありません。このレイアウトの選択により、親クラスタイプへのポインタを介して派生クラスを参照するのは簡単な操作になります。
たとえば、
構造体 P { int x ; };
構造体 C :P { int y ; };
インスタンスPを持つP* pことを指すが、メモリに次のようになります。+ —- +| P :: x |+ —- +↑p
インスタンスCとP* pそれへのポインティングは次のようになります。+ —- + —- +| P :: x | C :: y |+ —- + —- +↑p
したがって、Pオブジェクトのフィールドを操作するコードは、のフィールドの定義について何も考慮する必要なしにP、Cオブジェクト内のフィールドを操作できCます。適切に記述されたC ++プログラムは、どのような場合でも、継承されたフィールドのレイアウトについて何も想定してはなりません。static_castまたはdynamic_cast型変換演算子を使用すると、ポインターが1つの型から別の型に適切に変換されます。
多重継承はそれほど単純ではありません。もしクラスのD継承PとC、両方の両親のフィールドは、いくつかのために格納する必要がありますが、(最大で)親クラスの一つは、派生クラスの前に配置することができます。コンパイラがポインタをD型からPまたはのいずれかに変換する必要がある場合は常に、コンパイラCは派生クラスのアドレスから基本クラスフィールドのアドレスへの自動変換を提供します(通常、これは単純なオフセット計算です)。
多重継承の詳細については、仮想継承を参照して

オーバーロードされた演算子
CおよびC ++の演算子
C ++では、プログラマーのニーズに合わせて、などの演算子を+ – * /オーバーロードできます。これらの演算子は、オーバーロード可能な演算子と呼ばれます。
慣例により、オーバーロードされた事業者は、彼らがそうであるようにほぼ同じように動作しなければならないデータ型(ビルトインint、floatなど)が、これは必要とされInteger変数が実際に整数を格納するという構造体を宣言できますInteger * Integerが、積ではなく合計を呼び出すことで、整数が返される場合が
struct Integer { 整数()=デフォルト; 整数(int j ):i { j } {}
整数演算子* (const Integer &k )const {
戻り整数(I + K 。のI )。 } int i = 0 ; };
上記のコードは、コンストラクターを使用して戻り値を「構築」しました。より明確な表現のために(コンパイラーがステートメントを上記の同等のものに最適化できない場合、これはプログラムの効率を低下させる可能性がありますが)、上記のコードは次のように書き直すことができます。
整数演算子* (const Integer &k )const {
整数m ; m 。i = i + k 。私;
mを返す; }
プログラマーは、演算子のプロトタイプをstruct宣言に入れて、グローバルスコープで演算子の関数を定義することもできます。
struct Integer { 整数()=デフォルト; 整数(int j ):i { j } {}
整数演算子* (const Integer &k )const ;
int i = 0 ; }; 整数整数::演算子* (const Integer &k )const {
リターン整数(私は* kは。I ); }
i上記は送信者自身のメンバー変数をk.i表し、引数変数からのメンバー変数を表しますk。
constキーワードは、上記のコードで二回表示されます。最初に出現する引数const integer& kは、引数変数が関数によって変更されないことを示しています。宣言の最後の2番目のオカレンスは、関数の実行によって送信者が変更されないことをコンパイラーに約束します。
アンパサンド(&)「参照渡し」を意味します。関数が呼び出されると、変数の値ではなく、変数へのポインターが関数に渡されます。const integer& k
上記と同じオーバーロードプロパティがクラスにも適用されます。
演算子のアリティ、結合性、優先順位は変更できないことに注意して

バイナリのオーバーロード可能な演算子
二項演算子(2つの引数を持つ演算子)は、1つの引数を呼び出す「識別子」演算子(何か)で関数を宣言することによってオーバーロードされます。演算子の左側の変数は送信者であり、右側の変数は引数です。
整数i = 1 ; / * 最初の 引数のみを指定してコンストラクターを呼び出すかのように、この方法で構造体変数を初期化できます。* / 整数j = 3 ; / *変数名は 、構造体のメンバー変数の名前から独立しています。* /整数k = i * j ; std :: cout 「3」が出力されます。
以下は、バイナリのオーバーロード可能な演算子のリストです。
オペレーター 一般的な使用法+-* /% 算術計算
^&!>
ビット単位の計算
==!= = 論理比較
&& 論理積
!! 論理和= > = 複合代入
、 (一般的な使用法はありません)
同じ構造タイプの2つの変数間の「=」(代入)演算子は、デフォルトでオーバーロードされ、変数のコンテンツ全体を相互にコピーします。他のもので上書きすることができます。
演算子は1つずつオーバーロードする必要がつまり、オーバーロードは相互に関連付けられたとえば、。の反対ではありません。

単項オーバーロード可能な演算子
上で指定したように、一部の演算子は左側の送信者と右側の引数の2つの用語を取りますが、一部の演算子には1つの引数(送信者)しかなく、「単項」と呼ばれます。例としては、否定記号(左側に何も配置されていない場合)や「論理NOT」(感嘆符、!)が
単項演算子の送信者は、演算子の左側または右側に以下は、単項オーバーロード可能な演算子のリストです。
オペレーター 一般的な使用法 送信者の位置 +- 正/負の符号
正しい *& 間接参照
正しい !〜 論理/ビット単位ではありません 正しい ++-
プレインクリメント/デクリメント 正しい ++-
ポストインクリメント/デクリメント 左 送信者が右側にある単項演算子のオーバーロードの構文は次のとおりです。
return_type operator@ 送信者が左側にいる場合、宣言は次のとおりです。
return_type operator@ (int)
@上記は、オーバーロードされる演算子を表します。置き換えreturn_type戻り値のデータ型と(int、boolなどの構造)
このintパラメーターは、基本的に、送信者がオペレーターの左側にいることを示すための規則にすぎません。
const 該当する場合は、引数を宣言の最後に追加できます。

ブラケットのオーバーロード
このセクションの
C ++クラスで見つけることができます。
角括弧[]と丸括弧()は、C ++構造でオーバーロードできます。角括弧には引数を1つだけ含める必要がありますが、丸括弧には特定の数の引数を含めることも、引数を含めることもできません。
次の宣言は角括弧をオーバーロードします。
return_type operator[] (argument)
括弧内の内容はargumentパーツで指定されています。
丸括弧も同様の方法でオーバーロードされます。
return_type operator() (arg1, arg2, …)
オペレーター呼び出しの括弧の内容は、2番目の括弧で指定されます。
上記の演算子に加えて、矢印演算子(->)、スター付き矢印(->*)、newキーワード、およびdeleteキーワードもオーバーロードできます。これらのメモリまたはポインタ関連の演算子は、オーバーロード後にメモリ割り当て関数を処理する必要が代入(=)演算子と同様に、特定の宣言が行われない場合も、デフォルトでオーバーロードされます。

コンストラクター
このセクションの
C ++クラスで見つけることができます。
プログラマーは、宣言時に変数にデフォルト値または特定の値を使用させたい場合がこれは、コンストラクターを宣言することで実行できます。
Person :: Person (string name 、int age ){
name_ =名前; age_ =年齢; }
以下の例のように、メンバー変数は、コロンを使用して初期化子リストで初期化できます。これは、代入演算子を使用するのではなく、(コンストラクターを使用して)初期化するという点で上記とは異なります。これは、直接構築する必要があるだけなので、クラスタイプの場合はより効率的です。一方、割り当てでは、最初にデフォルトのコンストラクターを使用して初期化し、次に別の値を割り当てる必要がまた、一部の型(参照型やconst型など)は割り当てることができないため、初期化子リストで初期化する必要が
人(のstd ::文字列名、int型の年齢):名_ (名前)、age_ (年齢){}
空であっても、中括弧は省略できないことに注意して
デフォルト値を初期化するために、最後の引数にデフォルト値を指定できます。
人(のstd ::文字列名= “” 、int型の年齢= 0 ):名_ (名前)、age_ (年齢){}
上記の例でコンストラクターに引数が指定されていない場合、引数なしで次のコンストラクター(デフォルトのコンストラクター)を呼び出すのと同じです。
人物() :名_ (”” )、age_ (0 ){}
コンストラクターの宣言は、データ型と同じ名前の関数のように見えます。実際、コンストラクターの呼び出しは、関数呼び出しの形式をとることができます。その場合、初期化されたPerson型変数は戻り値と考えることができます。
int main (){ 人r =人(”ウェールズ” 、40 );
r 。印刷();}
上記の例と同じことを行う代替構文は次のとおりです。
int main (){ 人r (”ウェールズ” 、40 ); r 。印刷();}
変数に関連する場合と関連しない場合がある特定のプログラムアクションを、コンストラクターの一部として追加できます。
人(){ std :: cout 上記のコンストラクタで、「Hello!」デフォルトのPersonコンストラクターが呼び出されたときに出力されます。

デフォルトのコンストラクタ
クラスにコンストラクターが定義されていない場合、デフォルトのコンストラクターが呼び出されます。
構造体 A { int b ; };//括弧を使用して作成されたオブジェクト。A * a =新しいA (); //デフォルトのコンストラクターを呼び出し、bは「0」で初期化されます。//括弧を使用せずに作成されたオブジェクト。A * a =新しいA ; //メモリを割り当ててから、デフォルトのコンストラクタを呼び出します。bの値は「0」になります。//新規なしのオブジェクト作成。A a ; //スタック上のaのスペースを予約すると、bのガベージ値は不明になります。
ただし、ユーザー定義のコンストラクターがクラスに定義されている場合、上記の両方の宣言でこのユーザー定義のコンストラクターが呼び出され、その定義されたコードが実行されますが、変数bにデフォルト値は割り当てられません。

デストラクタ
このセクションの
C ++クラスで見つけることができます。
デストラクタはコンストラクタの逆です。これは、クラスのインスタンスが破棄されたときに呼び出されます。たとえば、ブロック内に作成されたクラスのオブジェクト(中括弧 “{}”のセット)が閉じ括弧の後に削除された場合、デストラクタが自動的に呼び出されます。変数を格納しているメモリ位置を空にすると呼び出されます。デストラクタは、そのクラスのインスタンスが破棄されたときに、ヒープに割り当てられたメモリや開いているファイルなどのリソースを解放するために使用できます。
デストラクタを宣言するための構文は、コンストラクタの構文に似ています。戻り値はなく、メソッドの名前はクラスの名前と同じで、前にチルダ(〜)が付いています。
〜人(){ std :: coutの }

コンストラクタとデストラクタの類似点
どちらも、宣言されているクラスと同じ名前です。
ユーザーによって宣言されていない場合、両方ともデフォルトでクラスで使用可能ですが、オブジェクトが宣言または削除されたときにのみ、クラスのオブジェクトからメモリを割り当ておよび割り当て解除できるようになりました。
派生クラスの場合:基本クラスコンストラクターの実行時に、派生クラスコンストラクターはまだ呼び出され基本クラスのデストラクタの実行中に、派生クラスのデストラクタがすでに呼び出されています。どちらの場合も、派生クラスのメンバー変数は無効な状態です。

クラステンプレート(プログラミング)
C ++では、クラス宣言はクラステンプレートから生成できます。このようなクラステンプレートは、クラスのファミリーを表します。実際のクラス宣言は、1つ以上のテンプレート引数を使用してテンプレートをインスタンス化することによって取得されます。特定の引数のセットでインスタンス化されたテンプレートは、テンプレート特殊化と呼ばれます。

プロパティ
C ++の構文は、構造のあらゆる側面を基本的なデータ型の側面のように見せようとします。したがって、オーバーロードされた演算子を使用すると、構造体を整数や浮動小数点数のように操作でき、構造体の配列を角括弧構文(some_structure variable_name)で宣言でき、構造体へのポインターを組み込みへのポインターと同じ方法で逆参照できます。データ型。

メモリ消費
構造体のメモリ消費量は、少なくとも構成変数のメモリサイズの合計です。TwoNums以下の構造を例として取り上げます。
struct TwoNums { int a ; int b ; };
構造は2つの整数で構成されています。多くの現在のC ++コンパイラでは、整数は32ビット整数によりデフォルトので、メンバ変数のそれぞれは、4バイトのメモリを消費します。したがって、構造全体は、次のように、少なくとも(または正確に)8バイトのメモリを消費します。+ —- + —- +| a | b |+ —- + —- +
ただし、コンパイラーは、変数間または構造体の最後にパディングを追加して、特定のコンピューターアーキテクチャーの適切なデータアライメントを確保する場合が多くの場合、変数は32ビットアライメントになります。たとえば、構造
struct BytesAndSuch { char c ;
char C ; char D ; short int s ; int i ; ダブルd ; };
次のように見える可能性があります+-+-+-+-+-+-+ —- + ——– +| c | C | D | X | s | XX | 私| d |+-+-+-+-+-+-+ —- + ——– +
メモリ内。ここで、
Xは4バイトの配置に基づくパディングされたバイトを表します。
構造体はポインタと配列を使用してそのメンバー変数を宣言および初期化する場合があるため、構造体のメモリ消費量は必ずしも一定ではありません。一定でないメモリサイズの別の例は、テンプレート構造です。

ビットフィールド
ビットフィールドは、整数型よりも少ないストレージを占有できるクラスメンバーを定義するために使用されます。このフィールドは、整数型(int、char、short、longなど)にのみ適用可能であり、floatまたはdoubleを除外します。
struct A { unsigned a :2 ; //可能な値0..3、int unsigned b :3の最初の2ビットを占有します; //可能な値0..7、int unsignedの次の3ビットを占有します:0 ; //次の整数型の最後に移動し、符号なしC :2 。署名なし:4 ; C&Dとの間に//パッド4ビットの符号なしD :1 。
符号なしe :3 ; };
メモリ構造
4バイト整数4バイト整数
ユニオンではビットフィールドは許可されこれは、キーワードstructまたはclassを使用して定義されたクラスにのみ適用されます。

参照による通過
評価戦略
多くのプログラマーは、構造体を含む関数の引数を宣言するためにアンパサンド(&)を使用することを好みます。これは、間接参照アンパーと1ワード(通常は32ビットマシンでは4バイト、64ビットマシンでは8バイト)のみを関数に渡す必要があるためです。つまり、変数のメモリ位置です。それ以外の場合、値渡しを使用すると、関数が呼び出されるたびに引数をコピーする必要がこれは、大きな構造ではコストがかかります。
参照渡しにより、関数によって変更される元の構造が公開されるため、意図constされていない場合は、キーワードを使用して、関数がパラメーターを変更しないことを保証する必要があります(const-correctnessを参照)。

このキーワード
これ(コンピュータサイエンス)
構造体がそれ自体を参照する機能を容易にするために、C ++thisはすべてのメンバー関数のキーワードを実装します。thisキーワードは、現在のオブジェクトへのポインタとして機能します。そのタイプは、現在のオブジェクトへのポインターのタイプです。
thisキーワードは、戻り値として構造自体とメンバ関数のために特に重要です。
Complex &operator + = (const Complex &c ){
real_part_ + = c 。real_part_ ; imag_part_ + = c 。imag_part_ ; return * this ; }
上記のように、thisはポインタであるため、アスタリスク(*)を使用して、返される参照に変換する必要が

も参照してください
アクセス修飾子
仮想継承
クラス(コンピュータプログラミング)
クラスベースプログラミング
オブジェクトコンポジション
型変換

参考文献
^ ISO / IEC(2003)。ISO / IEC 14882:2003(E):プログラミング言語-C ++ §9クラスパラ。4 ^ ISO / IEC(2003)。ISO / IEC 14882:2003(E):プログラミング言語-C ++ §8.5.1Aggregates[dcl.init.aggr] para。1 ^ ISO / IEC(2003)。ISO / IEC 14882:2003(E):プログラミング言語-C ++ §8.5.1Aggregates[dcl.init.aggr] para。2 ^ 「私がよく耳にするC ++のこの「POD」とは何ですか?」。コモーコンピューティング。
^ ヘンリクソン、マット; ナイキスト、エリック(1997)。産業用強度C ++。プレンティスホール。ISBN  0-13-120965-5。
^ ISO / IEC(2003)。ISO / IEC 14882:2003(E):プログラミング言語-C ++ §9.2クラスメンバーパラ。12 ^ ISO / IEC(2003)。ISO / IEC 14882:2003(E):プログラミング言語-C ++ §9.2クラスメンバーパラ。14 ^ ISO / IEC(2003)。ISO / IEC 14882:2003(E):プログラミング言語-C ++ §9.2クラスメンバーパラ。17 ^ ISO / IEC(2003)。ISO / IEC 14882:2003(E):プログラミング言語-C ++ §18.1タイプ[lib.support.types]パラ。5 ^ “thiscall(C ++)” 。
^ 「これ」。C ++リファレンス。
一般的な参考資料:
2006年1月にアクセスしたCplusplus.comチュートリアルレッスン5.2
2006年2月にアクセスしたCplusplus.comチュートリアルレッスン2.5

admin

Share
Published by
admin

Recent Posts

キャニオン–SRAM

Canyon%E2%80%93…

4週間 ago

キャニオン、ケノラ地区

Canyon,_Kenora_…

4週間 ago

Cantus Verkehrsgesellschaft

Cantus_Verkehrs…

4週間 ago

カントールキューブ

Cantor_cube 数学で…

4週間 ago

カントールの定理

Cantor's_theore…

4週間 ago

クレテイユ州

Cantons_of_Cr%C…

4週間 ago