首頁 > 軟體

C++範例講解friend static const關鍵字的用法

2022-06-17 14:03:49

一、友元函數

1.1過載operator<<

問題:現在我們嘗試去過載operator<<,然後發現我們沒辦法將operator<<過載成成員函數。因為cout的輸出流物件和隱含的this指標在搶佔第一個引數的位置。this指標預設是第一個引數也就是左運算元了。但是實際使用中cout需要是第一個形參物件,才能正常使用。所以我們要將operator<<過載成全域性函數。但是這樣的話,又會導致類外沒辦法存取成員,那麼這裡就需要友元來解決。operator>>同理。

class Date
{
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
ostream& operator<<(ostream& _cout)
{
_cout<<d._year<<"-"<<d._month<<"-"<<d._day;
return _cout;
}
prvate:
int _year;
int _month;
int _day
};
int main()
{
Date d(2017, 12, 24);
d<<cout;
return 0;
}

但"d<<cout"可讀性很低,所以我們嘗試需要在類外部過載operator<<

1.2友元函數

友元函數可以直接存取類的私有成員,它是定義在類外部的普通函數,不屬於任何類,但需要在類的內部宣告,宣告時需要加friend關鍵字。

class Date
{
friend ostream& operator<<(ostream& _cout, const Date& d);
friend istream& operator>>(istream& _cin, Date& d);
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)
{
_cout<<d._year<<"-"<<d._month<<"-"<<d._day;
return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{
_cin>>d._year;
_cin>>d._month;
_cin>>d._day;
return _cin;
}
int main()
{
Date d;
cin>>d;
cout<<d<<endl;
return 0;

1.友元函數可存取類的私有和保護成員,但不是類的成員函數

2.友元函數不能用const修飾

3.友元函數可以在類定義的任何地方宣告,不受類存取限定符限制

4.一個函數可以是多個類的友元函數

5.友元函數的呼叫與普通函數的呼叫和原理相同

1.3友元類

1.友元類的所有成員函數都可以是另一個類的友元函數,都可以存取另一個類中的非公有成員。

2.友元關係是單向的,不具有交換性。

比如上述Time類和Date類,在Time類中宣告Date類為其友元類,那麼可以在Date類中直接存取Time類的私有成員變數,但想在Time類中存取Date類中私有的成員變數則不行。

3.友元關係不能傳遞如果B是A的友元,C是B的友元,則不能說明C時A的友元。

class Date; // 前置宣告
class Time
{
friend class Date; // 宣告日期類為時間類的友元類,則在日期類中就直接存取Time類中的私有成
員變數
public:
Time(int hour, int minute, int second)
: _hour(hour)
, _minute(minute)
, _second(second)
{}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
: _year(year)
, _month(month)
, _day(day)
{}
void SetTimeOfDate(int hour, int minute, int second)
{
// 直接存取時間類私有的成員變數
_t._hour = hour;
_t._minute = minute;
_t.second = second;
}
private:
int _year;
int _month;
int _day;
Time _t;
};

二、關鍵字const

2.1const修飾類的成員函數

將const修飾的類成員函數稱之為const成員函數,const修飾類成員函數,實際修飾該成員函數隱含的this指標,表明在該成員函數中不能對類的任何成員進行修改。

總結:

1.const物件不能呼叫非cosnt成員函數(許可權放大:const Date* -> Date*)

2.非const物件可以呼叫const成員函數

3.const成員函數不能呼叫非cosnt成員函數(許可權放大)

4.非cosnt成員函數可以呼叫const成員函數

三、關鍵字static

3.1static類成員

概念:宣告為static的類成員稱為類的靜態成員,用static修飾的成員變數,稱之為靜態成員變數;用static修飾的成員函數,稱之為靜態成員函數。靜態的成員變數一定要在類外進行初始化

特性:

  • 靜態成員為所有類物件所共用,不屬於某個具體的範例
  • 靜態成員變數必須在類外定義,定義時不新增static關鍵字
  • 類靜態成員即可用類名::靜態成員或者物件.靜態成員來存取
  • 靜態成員函數沒有隱藏的this指標,不能存取任何非靜態成員
  • 靜態成員和類的普通成員一樣,也有public、protected、private3種存取級別,也可以具有返回值

3.2面試題

面試題:實現一個類,計算中程式中建立出了多少個類物件。

class A
{
public:
A() {++_scount;}
A(const A& t) {++_scount;}
static int GetACount() { return _scount;}
private:
static int _scount;
};
int A::_count = 0;
void TestA()
{
cout<<A::GetACount()<<endl;
A a1, a2;
A a3(a1);
cout<<A::GetACount()<<endl;
}

注意:

1.靜態成員函數不能呼叫非靜態成員函數

2.非靜態成員函數可以呼叫靜態成員函數

總結

以上就是關於C++關鍵字friend ,static,const 全部總結,感謝大家的閱讀觀看

到此這篇關於C++範例講解friend static const關鍵字的用法的文章就介紹到這了,更多相關C++ friend static const內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com