void Data::init(int dd,int mm,int yy){}
(2)靜態成員之間能夠互相訪問,包括靜態成員函數訪問靜態數據成員和訪問靜態成員函數;ios
(3)非靜態成員函數能夠任意地訪問靜態成員函數和靜態數據成員;函數
(4)靜態成員函數不能訪問非靜態成員函數和非靜態數據成員;優化
(5)因爲沒有this指針的額外開銷,所以靜態成員函數與類的全局函數相比,速度上會有少量的增加;this
(6)調用靜態成員函數,能夠用成員訪問操做符(.)和(->)爲一個類的對象或指向類對象的指調用靜態成員函數。
url
Date &Date::add_year(int n){ if(d==29 && m==2 && ;leapyear(y+n)){ d=1; m=3; } y+=n; return *this; }
表達式中的 *this引用的就是找個函數的此次調用所針對的那個對象。大部分的this都是隱含的。對一個類中非靜態的成員的引用都要依靠隱式的使用this。格式:this->變量名。。spa
table ::table(const table & t){ p=new name(sz=t.sz); for(int i=0;i<sz;i++)p[i]=t.p[i]; } table &table::operator=(const table& t){ if(this!=&t){//小心自賦值 t=t; delete [] p; p=new Name[sz=t.sz]; for(int i=0;i<sz;i++)p[i]=t.p[i]; } return *this; }
#include<iostream> #include<vector> #include<stdio.h> using namespace std; class club{ string name; Table members; Table ooficers; Data founded; club(const string &n,Data fd); }; club::club(const string &n,Data fd):name(n),members(),ooficers(),founded(fd){ }
對於沒有默認構造函數的類的成員變量,或者是cosnt,引用類型的成員變量,咱們都要使用成員列表初始化的方式最好,它可以提升效率設計
void f(int i){ static table tal; if(i){ static table tbl2; } } int main(){ f(0); f(1); f(2); }
2.友元函數的使用指針
2.1友元函數的參數:code
由於友元函數沒有this指針,則參數要有三種狀況:對象
2.1.1 要訪問非static成員時,須要對象作參數;
2.1.2 要訪問static成員或全局變量時,則不須要對象作參數;
2.1.3 若是作參數的對象是全局對象,則不須要對象作參數;
2.2友元函數的位置
由於友元函數是類外的函數,因此它的聲明能夠放在類的私有段或公有段且沒有區別。
2.3友元函數的調用
能夠直接調用友元函數,不須要經過對象或指針
2.4友元函數的分類:
根據這個函數的來源不一樣,能夠分爲三種方法:
2.4.1普通函數友元函數
2.4.1.1目的:使普通函數可以訪問類的友元
2.4.1.2語法:
聲明: friend + 普通函數聲明
實現位置:能夠在類外或類中
實現代碼:與普通函數相同
調用:相似普通函數,直接調用
2.4.1.3代碼:
class INTEGER
{
friend void Print(const INTEGER& obj);//聲明友元函數
};
void Print(const INTEGER& obj)
{
//函數體
}
void main()
{
INTEGER obj;
Print(obj);//直接調用
}
2.4.2類Y的全部成員函數都爲類X友元函數—友元類
2.4.2.1目的:使用單個聲明使Y類的全部函數成爲類X的友元,它提供一種類之間合做的一種方式,使類Y的對象能夠具備類X和類Y的功能。
2.4.2.2語法:
聲明位置:公有私有都可,常寫爲私有(把類當作一個變量)
聲明: friend + 類名(不是對象哦)
2.4.2.3代碼:
class girl;
class boy
{
public:
void disp(girl &);
};
void boy::disp(girl &x) //函數disp()爲類boy的成員函數,也是類girl的友元函數
{
cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;//藉助友元,在boy的成員函數disp中,藉助girl的對象,直接訪問girl的私有變量
}
class girl
{
private:
char *name;
int age;
friend boy; //聲明類boy是類girl的友元
};
main函數就不寫了和普通調用時同樣的。
2.4.3類Y的一個成員函數爲類X的友元函數
2.4.3.1目的:使類Y的一個成員函數成爲類X的友元,具體而言:在類Y的這個成員函數中,藉助參數X,能夠直接以X的私有變量
2.4.3.2語法:
聲明位置:聲明在公有中 (自己爲函數)
聲明:friend + 成員函數的聲明
調用:先定義Y的對象y---使用y調用本身的成員函數---本身的成員函數中使用了友元機制
2.4.3.3代碼:
實現代碼和2.4.2.3中的實現及其類似只是設置友元的時候變爲friend void boy::disp(girl &);本身解決嘍……
小結:其實一些操做符的重載實現也是要在類外實現的,那麼一般這樣的話,聲明爲類的友元是必須滴。
4.友元函數和類的成員函數的區別
4.1 成員函數有this指針,而友元函數沒有this指針。
4.2 友元函數是不能被繼承的,就像父親的朋友未必是兒子的朋友。