天天看點

C++:09---類靜态成員、類常量成員

一、類靜态成員(static)

先介紹一下什麼是靜态變量、靜态函數

  • 靜态局部變量:存在域(全局資料區),作用域(塊作用域)
  • 靜态全局變量:存在域(全局資料區),作用域(整個檔案)
  • 靜态函數:存在域(全局資料區),作用域(整個檔案)

static int a=10;//全局靜态變量

static void add();//靜态函數

int main()

{

{

static int b=10;//局部靜态變量

}

}

  • 特點:
  • 靜态static修飾的變量、函數,隻需要初始化一次,下次再執行到static修飾的相同代碼時,自動跳過。
  • 靜态static修飾的變量、函數,從程式開始執行時生效,且隻在目前檔案(.c/cpp)有效,其他檔案不可用

靜态資料成員

  • 靜态成員不屬于某一個對象,而是屬于整個類(定義在資料段)
  • 靜态成員供所有對象共享,每個對象可以調用且修改。一個對象修改,其他對象也跟着變化
  • static成員變量可以在類型聲明并初始化。但是建議在類内定義、類外初始化
  • 可以直接通過類名直接通路
class Cperson
 
{
 
private:
 
static int age;
 
static int getAge();
 
}
 
//類外初始化
 
int Cperson::age = 18;
 


 
int Cperson::getAge()
 
{
 
return age;
 
}
 


 
int main()
 
{
 
Cperson person1;
 
person.age = 20;//調用并改變靜态成員
 


 
//直接通過類名就可調用
 
cout << Cperson::age; //20
 
Cperson::getAge();
 
}• 下面也是一個非常重要的示範案例,其動态的改變了靜态成員的值
#include <iostream>
 


 
using namespace std;
 


 
class widget
 
{
 
public:
 
widget()
 
{
 
count++;
 
}
 
~widget()
 
{
 
count--;
 
}
 
static int num()
 
{
 
return count;
 
}
 
private:
 
static int count;
 
};
 


 
int widget::count = 0;
 


 
int main()
 
{
 
widget x, y;
 
cout << "The Num.is " << widget::num() << endl;
 
if(widget::num() > 1)
 
{
 
widget x, y, z;
 
cout << "The Num.is " << widget::num() << endl;
 
}
 
widget z;
 
cout << "The Num.is " << widget::num() << endl;
 


 
return 0;
 
}      

類靜态函數

  • 因為靜态函數不屬于某一對象,是以函數内不存在this指針
  • 靜态成員函數不能被聲明為const類型(“靜态成員函數是屬于類的,而不是某個具體對象,在沒有具體對象的時候靜态成員就已經存在,靜态成員函數不會通路到非靜态成員,也不存在this指針。而成員函數的const就是修飾this指針的,既然靜态成員函數不會被傳遞this指針,那const自然就沒有必要了”)
  • 靜态函數内部隻能通路靜态成員(變量、函數),不能通路普通成員。原因:靜态函數在類定義時就已經開辟記憶體空間,而普通成員隻有當定義對象時開會開辟記憶體空間,是以調用普通成員會出錯
  • 普通函數内部可以調用靜态成員,也可以調用普通成員。原因:同上,普通函數調用時開辟記憶體空間,所有都可調用
class Cperson
 
{
 
private:
 
float height;
 
static int age;
 
static void setPerson();
 
}
 
int Cperson::age=18;
 
void Cperson::setPerson()
 
{
 
age=20;//正确,可調用靜态成員
 
height=178;//錯誤,不可調用普通成員
 
}      

二、類常量成員(const)

const資料成員

  • 特點:
  • const資料成員隻能在構造函數的初始化清單進行初始化
  • const資料成員在初始化之後,不允許再次修改值
class Cperson
 
{
 
private:
 
const int age;//常量資料成員
 
float height;
 
public:
 
Cperson(int age,float height);
 
};
 


 
Cperson::Cperson(int age,float height):age(age)
 
{
 
this->height=height;
 
}      

const函數成員

  • 特點
  • const函數成員的目的:函數内不準對類的成員資料進行更改
  • 可以改變函數的非const參數、以及函數内部的局部變量
  • const成員函數不可調用非const函數成員(本質:防止修改非const函數内的值)
  • 優點
class Cperson
 
{
 
private:
 
const int age;//常量資料成員
 
float height;
 
public:
 
int getAge()const;
 
void setHeight(float height);
 
};
 
int Cperson::getAge()const
 
{
 
//age++;//錯誤做法,不準對成員變量進行修改
 
return age;
 
}
 
void Cperson::setHeight(float height)
 
{
 
this->height=height;
 
}
 


 
int main()
 
{
 
Cperson person1;
 
person1.getAge();//正确
 
person1.setHeight(175.5);//正确
 


 
const Cperson person1;
 
//person1.setHeight(175.5);錯誤,const對象不能調用非const函數
 
person1.getAge();//正确
 
}基于const函數的重載      
  • const函數的重載,調用的時候,系統根據定義的類對象類型來調用對應的函數
calss Person
 
{
 
int age;
 
public:
 
Person& setAge(int age);//一
 
const Person& setAge(int age)const;//二
 
};
 
int main()
 
{
 
Person p1;
 
const Person p2;
 
p1.setAge(18);//調用第一個
 
p2.setAge(20);//調用第二個
 
}