一、類靜态成員(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);//調用第二個
}