C/C++静的クラスとthisポインタ
6372 ワード
1、静的クラス
C++の静的メンバーは,オブジェクトのみならずクラス名から直接アクセスできる.
静的メンバー変数
静的メンバーには、(1)静的データ・メンバーは現在のクラスのタイプであってもよく、他のデータ・メンバーは現在のクラスのポインタまたは適用タイプであってもよいことに注意してください.
(2)静的データメンバーは、他のメンバー関数のデフォルトパラメータとして使用できます(異なるデータ型はパラメータとして使用できません).
せいてきかんすう
(1)クラスの静的メンバー関数は静的データメンバーのみにアクセスでき、通常のデータメンバーにアクセスできません(thisポインタがないため).
(2)静的メンバー関数はconstメンバー関数として定義できない(すなわち静的メンバー関数の末尾にconstキーを付けられない)
(3)静的メンバ関数を定義する場合,関数の実装がクラス外にある場合,関数の実装部分でstaticキーワードを識別することはできない.
静的クラスについてまとめます.(1)クラスの静的メンバー関数はクラス全体ではなくクラス全体に属するオブジェクトであるため、thisポインタがなく、クラスの静的データと静的メンバー関数にのみアクセスできるようになります.
(2)静的メンバー関数を虚関数として定義することはできない.
2、this
C++
book 1とbook 2の2つのオブジェクトにはそれぞれのデータメンバーpagesがあり、outputPagesを呼び出すとそれぞれのメンバーデータが出力されますが、両者はどのように区別されますか?答えはthisポインタです.
各クラスのメンバー関数(非静的メンバー関数)には、現在のクラスのポインタタイプである呼び出されたオブジェクトを指すthisポインタが隠されています.
したがって、コンパイラは、上記のoutputPages()メソッドと同様に、次のように解釈します.
Java
ここでは、thisは現在のオブジェクトの参照を表し、thisはstaticメソッドでは使用できません.これは、静的関数でメンバー変数を呼び出すことができない理由です.
C++の静的メンバーは,オブジェクトのみならずクラス名から直接アクセスできる.
class CBook{
public:
static double price;//
}
int main(void){
CBook book;
book.price;//
CBook::price//
return 0;
}
静的メンバー変数
静的メンバーには、(1)静的データ・メンバーは現在のクラスのタイプであってもよく、他のデータ・メンバーは現在のクラスのポインタまたは適用タイプであってもよいことに注意してください.
class CBook{
public:
static double price;
CBook book;// ,
static CBook m_book;//
CBook *book;//
};
(2)静的データメンバーは、他のメンバー関数のデフォルトパラメータとして使用できます(異なるデータ型はパラメータとして使用できません).
class CBook{
public:
int pages;
static double price;
// ,
void outPutInfo(int data = price){
//
}
// ,
void outPutPage(int data = pages){
//
}
};
せいてきかんすう
static void outPut();
(1)クラスの静的メンバー関数は静的データメンバーのみにアクセスでき、通常のデータメンバーにアクセスできません(thisポインタがないため).
(2)静的メンバー関数はconstメンバー関数として定義できない(すなわち静的メンバー関数の末尾にconstキーを付けられない)
static void outPut() const;//
(3)静的メンバ関数を定義する場合,関数の実装がクラス外にある場合,関数の実装部分でstaticキーワードを識別することはできない.
//
static void CBook::outPutInfo(){
//
}
静的クラスについてまとめます.(1)クラスの静的メンバー関数はクラス全体ではなくクラス全体に属するオブジェクトであるため、thisポインタがなく、クラスの静的データと静的メンバー関数にのみアクセスできるようになります.
(2)静的メンバー関数を虚関数として定義することはできない.
2、this
C++
class CBook{
public:
int pages;
void outputPages(){
cout<int main(){
CBook book1,book2;
book1.pages = 10;
book2.pages = 20;
book1.outputPages();
book2.outputPages();
return 0;
}
book 1とbook 2の2つのオブジェクトにはそれぞれのデータメンバーpagesがあり、outputPagesを呼び出すとそれぞれのメンバーデータが出力されますが、両者はどのように区別されますか?答えはthisポインタです.
各クラスのメンバー関数(非静的メンバー関数)には、現在のクラスのポインタタイプである呼び出されたオブジェクトを指すthisポインタが隠されています.
したがって、コンパイラは、上記のoutputPages()メソッドと同様に、次のように解釈します.
//
book1.outputPages(&book1);
//
void outputPages(CBook *this){// this
cout<<this->pages<// this
}
Java
/**
* this !
*/
package test;
public class ThisTest {
private int i=0;
ThisTest(int i){
//(1)this.i i,i
this.i=i+1;
}
ThisTest(String s){
System.out.println("String constructor: "+s);
}
ThisTest(int i,String s){
//(2)this
this(s);
this.i=i++;
}
public ThisTest increment(){
this.i++;
//(3)
return this;
}
public static void main(String[] args){
ThisTest tt0=new ThisTest(10);
ThisTest tt1=new ThisTest("ok");
ThisTest tt2=new ThisTest(20,"ok again!");
System.out.println(tt0.increment().increment().increment().i);
}
}
ここでは、thisは現在のオブジェクトの参照を表し、thisはstaticメソッドでは使用できません.これは、静的関数でメンバー変数を呼び出すことができない理由です.