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

來源:互聯網
上載者:User

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

2、const必須同時出現在聲明和定義中。

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

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

4、inline在聲明和定義處指定都是合法的。

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) 友元的關係不能傳遞。(A是B的朋友,B是C的朋友,但不一定A是C的朋友)。

(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/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.