1. 程式人生 > 程式設計 >C++語言基礎 this和static關鍵字

C++語言基礎 this和static關鍵字

一.this關鍵字

this是一個指標,可用其訪問成員變數或成員函式

下面是使用this的一個完整示例:

#include <iostream>
using namespace std;

class Student{
public:
  void setname(char *name);
  void setage(int age);
  void setscore(float score);
  void show();
private:
  char *name;
  int age;
  float score;
};

void Student::setname(char *name){
  this->name = name;
}
void Student::setage(int age){
  this->age = age;
}
void Student::setscore(float score){
  this->score = score;
}
void Student::show(){
  cout<<this->name<<"的年齡是"<<this->age<<",成績是"<<this->score<<endl;
}

int main(){
  Student *pstu = new Student;
  pstu -> setname("李華");
  pstu -> setage(16);
  pstu -> setscore(96.5);
  pstu -> show();

  return 0;
}

執行結果:

李華的年齡是16,成績是96.5

this 只能用在類的內部,通過 this 可以訪問類的所有成員,包括 private、protected、public 屬性的。

本例中成員函式的引數和成員變數重名,只能通過 this 區分。以成員函式setname(char *name)為例,它的形參是name,和成員變數name重名,如果寫作name = name;這樣的語句,就是給形參name賦值,而不是給成員變數name賦值。而寫作this -> name = name;後,=左邊的name就是成員變數,右邊的name就是形參,一目瞭然。

二.static 關鍵字

2.1 static 靜態成員變數

類似於java,C++中也有static靜態成員變數,用法如下:

#include <iostream>

using namespace std;

class Student {
public:
  Student(char *name,int age,float score);
  void show();
public:
  static int m_total; // 靜態成員變數
private:
  char *m_name;
  int m_age;
  float m_score;
};

int Student::m_total = 0; // 初始化靜態成員變數時不需要加static


Student::Student(char *name,float score) {

}
void Student::show() {

}


int main()
{
  Student::m_total = 10; // 可以直接由類名訪問
  // 棧區
  Student stu("Jack",15,92.5f);
  stu.m_total = 20;   // 也可以直接由物件名訪問
  // 堆區
  Student *pstu = new Student("Tom",16,96);
  pstu->m_total = 20;  // 也可以直接由物件名訪問

  delete pstu;
  return 0;

}

注意:

1) 一個類中可以有一個或多個靜態成員變數,所有的物件都共享這些靜態成員變數,都可以引用它。

2) static 成員變數和普通 static 變數一樣,都在記憶體分割槽中的全域性資料區分配記憶體,到程式結束時才釋放。這就意味著,static 成員變數不隨物件的建立而分配記憶體,也不隨物件的銷燬而釋放記憶體。而普通成員變數在物件建立時分配記憶體,在物件銷燬時釋放記憶體。

3) 靜態成員變數必須初始化,而且只能在類體外進行。例如:

int Student::m_total = 0; // 初始化靜態成員變數時不需要加static

初始化時可以賦初值,也可以不賦值。如果不賦值,那麼會被預設初始化為 0。全域性資料區的變數都有預設的初始值 0,而動態資料區(堆區、棧區)變數的預設值是不確定的,一般認為是垃圾值。

4) 靜態成員變數既可以通過物件名訪問,也可以通過類名訪問,但要遵循 private、protected 和 public 關鍵字的訪問許可權限制。當通過物件名訪問時,對於不同的物件,訪問的是同一份記憶體。

2.2 static 靜態成員函式

下面演示static 靜態成員函式的用法:

#include <iostream>
using namespace std;

class Student{
public:
  Student(char *name,float score);
  void show();
public: //宣告靜態成員函式
  static int getTotal();
  static float getPoints();
private:
  static int m_total; //總人數
  static float m_points; //總成績
private:
  char *m_name;
  int m_age;
  float m_score;
};

int Student::m_total = 0;
float Student::m_points = 0.0;

Student::Student(char *name,float score): m_name(name),m_age(age),m_score(score){
  m_total++;
  m_points += score;
}
void Student::show(){
  cout<<m_name<<"的年齡是"<<m_age<<",成績是"<<m_score<<endl;
}
//定義靜態成員函式
int Student::getTotal(){
  return m_total;
}
float Student::getPoints(){
  return m_points;
}

int main(){
  (new Student("小明",90.6)) -> show();
  (new Student("李磊",80.5)) -> show();
  (new Student("張華",99.0)) -> show();
  (new Student("王康",14,60.8)) -> show();

  int total = Student::getTotal();
  float points = Student::getPoints();
  cout<<"當前共有"<<total<<"名學生,總成績是"<<points<<",平均分是"<<points/total<<endl;

  return 0;
}

注意:

1) 靜態成員函式與普通成員函式的根本區別在於:普通成員函式有 this 指標,可以訪問類中的任意成員;而靜態成員函式沒有 this 指標,只能訪問靜態成員(包括靜態成員變數和靜態成員函式)。

2) 上例中的getTotal()、getPoints() 也可以宣告為普通成員函式,但是它們都只對靜態成員進行操作,加上 static 語義更加明確。

3) 和靜態成員變數類似,靜態成員函式在宣告時要加 static,在定義時不能加 static。靜態成員函式可以通過類來呼叫(一般都是這樣做),但也可以通過物件來呼叫。