學習C++必須掌握的概念

來源:互聯網
上載者:User
 

一、指標的概念 

char str[] = "ABCDEFG";
char *pc = str; //pc是指向string str的指標
short x = 33;  
short *ppx = &x; //px是指向short x的指標
cout << *pc << endl; //這條語句將列印字元‘A’
pc += 4; //指標向右移動4指向第5個字元
cout << *pc << endl; //這時這條語句將列印字元‘E’
pc--; //向左移動指標
cout << *pc << endl; //這時這條語句將列印字元‘D’
cout << *ppx + 3 << endl; //這條語句列印36因為=33+3

在 C 程式中,假設我們已定義了以下的幾個變數及函數: int k, tem, *P1, *P2, a[5], f(), *P3(); 以下的設定敘述(Assignment statements)中, 那些有文法上的錯誤? 並請說明其原因

1.P1 = &k;
2.P2 = a;
3.P3 = f;
4.P1 = &a[3];
5.P1 = P2;

答案:
(1) P1 = &k; P1是指標變數, 因此P1表位址,而k表示一般變數,&k表示取出k的位址,故正確.
(2) P2 = a; a是數組名稱,此時可代表數組存放在記憶體中的起始位址,而P2為指標變數,故正確.
(3) P3 = f; f代表函數的名稱,此時代表呼叫函數f,因此含有傳回值,而P3為指標變數,故此式有錯誤.
(4) P1 = &a[3];P1表指標變數,代表位址,而&a[3]表取出索引(index)為3的數組元素的位址,故正確.
(5) P1 = P2; P1,P2皆為指標變數代表位址,此敘述是指將P2的位址指定給P1,故正確.

結構的概念
結構是一種類型,它的成員預設是public.

struct Student //定義一個結構Student用來存放學生的資料

int id; //編號
char name[30]; //名字
}
Student s = {555, “Davis, Samuel”}; //初始化Student的執行個體s
cout << s.id << “ “ << s.name << endl; //這條將列印“ 555 Davis,Samuel”

類的概念我想大家都應該很清楚了,我就不廢話了。

類的繼承的概念
class base
{
private:
int a;
protected:
int b;
public:
int c;
};
class sub1:public base {…};
class sub2:private base{…};

說明在base,sub1,sub2中所能取用的data members各為何.並指出這些data members的access mode(private, protected或public).
Ans:
class data members access mode
base a private
b protected
c public
sub1
b protected
c public
sub2
b private
c private

虛函數和抽象類別

多態 (polymorphism)
物件導向程設計的核心觀念之一就是多態--它使一群類似的行為的同名稱的方法, 但各對象可依適合自己所需的方式建構此同名動作的實行細節, C++多態的關鍵在於所謂的虛函數這一類的函數。

虛函數(virtual function)
透過虛擬函數, 衍生類可重新定義基類的成員函數, 若想在C++程式中建立虛擬函數(然後才能實行多態), 只需利用virtual關鍵字聲明函數即可(如下所示)
virtual void Display();
虛函數的用處
針對共用相同基類的那些對象, 可有較一致的使用態度, 例如, 你可能定義一個名為Shape且帶有一 個Draw虛擬成員函數的基類, 然後從它派生了Circle類和Square類, 而且它們各內建有自己的Draw成員函數.從這些類派生建立的每個對象都可呼叫Draw成員函數; 但是編譯程式可確保各自應呼叫那個版本的Draw 函數.是基類的還是衍生類別的。

一個例子

重要觀念: 指向父類的指標也可用來指向子類別

#include <iostream.h>
class BaseClass
{
public:
virtual void Display( ) { cout << 100 << "\n"; }
};
class DerivedClass: public BaseClass
{
public:
virtual void Display( ) { cout << 200 << "\n"; }
};
void Print(BaseClass* pbc)
{ pbc->Display( ); }
int main( )
{ BaseClass* pbc = new BaseClass;
DerivedClass* pdc = new DerivedClass;
Print(pbc);//顯示 100
Print(pdc);//顯示 200
return 0;
}

V-table (Virtual function table)
當C++程式呼叫非虛函數, 採用與C程式呼叫函數所用方式一樣的靜態繫結來呼叫函數. 但是C++程式 若是透過指向類別的指標來呼叫虛函數時, 編譯程式則採用所謂的晚期綁定(late binding)或靜態繫結 (static binding)技術來呼叫函數.
而C++虛函數用虛函數表(virtual function table), 或稱V-表來實作動態綁定, 所謂的V-表是一 個函數指標的陣列, 這是編譯器替每個使用虛函數的類所建制的。

純虛函數 (pure virtual function)
一個不僅可被重新定義, 而且必須被重新定義的成員函數就稱為純虛函數, 你只要指定函數一個零值 (更有效說法是一個null 指標),就可將虛成員函數轉為純虛成員函數,如以下所示
virtual void PrintData() = 0;

抽象類別 (abstract class)
當一個類含有至少一個純虛函數時, 此類就稱為抽象類別,而你無法以此類來衍生建立對象.

C++ template classes

一般的聲明及使用 
class Collection
{ …
int A[10]; 
}
Collection object; 
模板的聲明及使用
template <class T> //注意這裡
class Collection
{ …
T A[10]; }// generic declaration
Collection<int> object; //注意這裡
Collection<char> object; //注意這裡

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.