15、C++ Primer 4th 筆記,類和資料抽象,友元

weixin_34391854發表於2011-03-22

1、成員可以是資料,函式或型別別名(typedef定義的)

2const必須同時出現在宣告和定義中

3、過載的成員函式和普通函式應用相同的規則:兩個過載成員的形引數量和型別不能完全相同。也可以根據const來定義。

T& display(std::ostream &os)
{
...
}
const T& display(std::ostream &os) const
{
...
}

4inline在宣告和定義處指定都是合法的。

5、可以宣告一個類而不定義它,這個宣告有時稱為前向宣告(forward declaration),宣告的類是一個不完全型別(incompete type)

不完全型別只能以有限方式使用。不能定義該型別的物件。不完全型別只能用於定義指向該型別的指標及引用;或者用於宣告(而不是定義)使用該型別作為形參型別或返回型別的函式。

一般用於編寫相互依賴的類。

6、為只有當類定義體完成後才能定義類,因此類不能具有自身型別的資料成員。然而,只要類名一出現就可以認為該類已宣告。因此,類的資料成員可以是指向自身型別的指標或引用。

7、成員函式不能定義this形參,由編譯器隱含指定。成員函式的函式體可以顯式使用this指標,但不是必須這麼做。

有一種情況必須使用:當我們需要一個物件作為整體引用而不是引用物件的一個成員時,如一個函式返回撥用該函式的物件的引用。

class1& class1::set(char c)
{
...
return *this;
}

8、在非const成員函式中,this的型別是一個指向類型別的const指標。在const成員函式中,this的型別是一個指向const類型別物件的const指標。不能從const成員函式返回指向類物件的普通引用,只能返回*this作為一個const引用。

const物件只能使用const成員,非const物件可以使用任一成員。

9、我們希望類的資料成員(包括const成員函式)可以修改,可以把它們宣告為mutable

10、一般的資料或函式成員必須通過物件來訪問。定義型別的成員,則使用作用域操作符來訪問。

11、形參表和函式體處於類作用域中;函式返回型別不一定在類作用域中,如果函式在類定義體之外定義,則用於返回型別的名字在類作用域之外。如果返回型別使用由類定義的型別,則必須使用完全限定名。

12、名字必須在使用之前進行定義。而且一旦一個名字被用作型別名,該名字就不能被重複定義,與定義區域性變數內層變數名覆蓋外層變數名不同。

13、友元以friend宣告,它只能出現在類定義的內部。一般把它放在類定義的開始或結尾是個好主意。

必須先定義包含成員函式的類,才能將成員函式設為友元。不必預先宣告類和非成員函式來將它們設為友元。

14、類必須將過載函式集中每一個希望設為友元的函式都宣告為友元。

(1) 友元的關係是單向的而不是雙向的。

(2) 友元的關係不能傳遞。(AB的朋友,BC的朋友,但不一定AC的朋友)。

(3) 但是友元可以繼承(這是我在VS編譯器中測試的結果,在C++ Primier中說其不可以繼承)。

示例

#include <iostream>
using namespace std;

class Data;
class Time
{
public:
Time(int,int,int);
void display(Data&);
private:
int hour;
int minute;
int sec;
};

class Data
{
public:
Data(int,int,int);
friend void Time::display(Data&);
private:
int month;
int day;
int year;
};

class Date1:public Data
{
public:
Date1(int m1, int m2, int m3):Data(m1,m2,m3)
{
cout << "In Date1" << endl;
}
};

Time::Time(int h,int m,int s)
{
hour=h;
minute=m;
sec=s;
}
void Time::display(Data& d)
{
cout<<d.month<<"/"<<d.year<<endl;
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
Data::Data(int m,int d,int y)
{
month=m;
day=d;
year=y;
}
int main()
{
Time t1(10,13,56);
Data d1(12,25,56);
t1.display(d1);
Date1 dd1(1,2,3);
t1.display(dd1);
return 1;
}

參考

[1] 友元

http://blog.163.com/zhoumhan_0351/blog/static/39954227201002621251123/

[2] 繼承

http://blog.163.com/zhoumhan_0351/blog/static/3995422720100284731826/

相關文章