1.static靜態(tài)成員(函數(shù))
1.1概念
聲明為 static 的類成員 稱為 類的靜態(tài)成員 ,用 static 修飾的 成員變量 ,稱之為 靜態(tài)成員變量 ;用static 修飾 的 成員函數(shù) ,稱之為 靜態(tài)成員函數(shù) 。 靜態(tài)成員變量一定要在類外進(jìn)行初始化
1.2特征
?靜態(tài)成員為所有類對(duì)象所共享,不屬于某個(gè)具體的對(duì)象,存放在靜態(tài)區(qū)
?靜態(tài)成員變量必須在類外定義,定義時(shí)不添加static關(guān)鍵字,類中只是聲明
靜態(tài)成員變量也不能給缺省值,因?yàn)槿笔≈凳墙o初始化列表的,而初始化列表是初始化某個(gè)對(duì)象的,靜態(tài)成員變量是屬于整個(gè)類的,不屬于某一個(gè)具體對(duì)象。
class A {
//靜態(tài)成員變量在類中聲明
public:
static int Count1;
private:
static int Count2;
};
//靜態(tài)成員變量在類外定義并且初始化,
//不需要static修飾,但需要類名::的形式指定類域
int A::Count1 = 1;
int A::Count2 = 2;
類靜態(tài)成員即可用 類名 :: 靜態(tài)成員 或者 對(duì)象 . 靜態(tài)成員 來(lái)訪問(wèn)靜態(tài)成員也是類的成員,受 public 、 protected 、 private 訪問(wèn)限定符的限制
class A {
public:
void abc1()
{
//A::public靜態(tài)成員變量可以在類內(nèi)表示
cout << A::Count1<<endl;
}
void abc2()
{
//A::private靜態(tài)成員變量可以在類內(nèi)表示
cout << A::Count2 << endl;
}
//靜態(tài)成員變量在類中聲明
public:
static int Count1;
private:
static int Count2;
};
//靜態(tài)成員變量在類外定義并且初始化,
//不需要static修飾,但需要類名::的形式指定類域
int A::Count1 = 1;
int A::Count2 = 2;
int main()
{
A aa;
aa.abc1();
//public修飾的成員變量可以在類外訪問(wèn)
cout << A::Count1 << endl;
cout << aa.Count1 << endl;
aa.abc2();
//private修飾的成員變量不能再類外訪問(wèn)
//cout << A::Count2 << endl;
//cout << aa.Count2 << endl;
return 0;
}
靜態(tài)成員函數(shù) 沒(méi)有 隱藏的 this 指針 ,不能訪問(wèn)任何非靜態(tài)成員
靜態(tài)成員函數(shù)不能調(diào)用非靜態(tài)成員函數(shù),因?yàn)?strong>沒(méi)有this指針
非靜態(tài)成員函數(shù)可以調(diào)用類的靜態(tài)成員函數(shù)
class A {
public:
static int abc1()
{
//A::public靜態(tài)成員變量可以在類內(nèi)表示
return Count1;
}
static int abc2()
{
//A::private靜態(tài)成員變量可以在類內(nèi)表示
return Count2;
}
//靜態(tài)成員變量在類中聲明
public:
static int Count1;
private:
static int Count2;
};
//靜態(tài)成員變量在類外定義并且初始化,
//不需要static修飾,但需要類名::的形式指定類域
int A::Count1 = 1;
int A::Count2 = 2;
int main()
{
A aa;
//靜態(tài)成員函數(shù)調(diào)用時(shí),突破類域就可以
cout << A::abc1() << endl;
cout << aa.abc1() << endl;
return 0;
}
1.3總結(jié)
靜態(tài)成員函數(shù)和靜態(tài)成員變量,本質(zhì)是受限制的全局變量和全局函數(shù),專屬這個(gè)類,受訪問(wèn)限定符和類域限制
2.explicit
2.1隱式類型轉(zhuǎn)換
class Date
{
public:
Date(int year = 2023, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date a1(2023,11,13);
Date a2;
Date a3;
//相當(dāng)于2024這個(gè)整形隱式類型轉(zhuǎn)換為了Date形
//用2024構(gòu)造一個(gè)臨時(shí)變量,類型為const Date,臨時(shí)變量再去賦值構(gòu)造a2;
a2 = 2024;
//c++11規(guī)定可以傳多個(gè)參數(shù)
a3 = { 2024,3,3 };
return 0;
}
需要注意的是,隱式類型轉(zhuǎn)換的臨時(shí)變量是const類型,需要考慮權(quán)限問(wèn)題
權(quán)限可以平移,可以縮小,但不能被放大?。?!
const可以傳給const(權(quán)限平移),const可以傳給非const(權(quán)限縮小)
非const成員函數(shù)?不能?傳給非const(權(quán)限放大),非const可以傳給const(權(quán)限平移)
2.2expilcit的作用
用 explicit 修飾構(gòu)造函數(shù),將會(huì)禁止構(gòu)造函數(shù)的隱式轉(zhuǎn)換 。但如果是顯示類型轉(zhuǎn)換,expilcit是禁止不了的
3.友元
3.1友元函數(shù)
友元函數(shù) 可以 直接訪問(wèn) 類的 私有 成員,它是 定義在類外部 的 普通函數(shù) ,不屬于任何類,但需要在類的內(nèi)部聲明,聲明時(shí)需要加friend 關(guān)鍵字
當(dāng)我們需要在一個(gè)全局函數(shù)中訪問(wèn)一個(gè)對(duì)象中的私有或者保護(hù)成員時(shí),需要在類中聲明友元函數(shù)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-756553.html
class Date
{
//聲明友元函數(shù),注意是聲明,不是定義?。?!
friend int add(Date aa);
public:
private:
int _year;
int _month;
int _day;
};
int add(Date aa)
{
//在全局函數(shù)中需要訪問(wèn)一個(gè)類的私有時(shí),需要在類中聲明友元函數(shù)
return aa._year + aa._month;
}
友元函數(shù) 可訪問(wèn)類的私有和保護(hù)成員,但 不是類的成員函數(shù)友元函數(shù) 不能用 const 修飾友元函數(shù) 可以在類定義的任何地方聲明, 不受類訪問(wèn)限定符限制一個(gè)函數(shù)可以是多個(gè)類的友元函數(shù)友元函數(shù)的調(diào)用與普通函數(shù)的調(diào)用原理相同
3.2友元類
友元類的所有成員函數(shù)都可以是另一個(gè)類的友元函數(shù),都可以訪問(wèn)另一個(gè)類中的非公有成員。友元關(guān)系是單向的,不具有交換性。如果C是B的友元, B是A的友元,則不能說(shuō)明C時(shí)A的友元。 文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-756553.html
class Date1
{
//聲明Date2是Date1的友元類,
//Date2可以訪問(wèn)Date1的私有或者保護(hù)成員
friend class Date2;
private:
int _year1;
int _month1;
int _day1;
};
class Date2
{
public:
//可以訪問(wèn)Date1中的私有或者保護(hù)成員
int add(Date1 d1)
{
return d1._year1;
}
private:
int _year2;
int _month2;
int _day2;
};
到了這里,關(guān)于c++中static靜態(tài)成員變量和靜態(tài)成員函數(shù)、explcit和隱式類型轉(zhuǎn)換、友元函數(shù)()詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!