C++學習

來源:互聯網
上載者:User

標籤:getch   運算子   它的   strong   ring   div   cte   傳回值   程式員   

http://blog.chinaunix.net/uid-20465760-id-1944082.html

建構函式:

建構函式的作用:初始化對象的資料成員。

複製建構函式解釋舉例:

class Complex{         private :    double m_real;    double m_imag;public:    // 複製建構函式(也稱為拷貝建構函式)    // 複製建構函式參數為類對象本身的引用,用於根據一個已存在的對象複製出一個新的該類的對象,一般在函數中會將已存在對象的資料成員的值複製一份到新建立的對象中    // 若沒有顯示的寫複製建構函式,則系統會預設建立一個複製建構函式,但當類中有指標成員時,由系統預設建立該複製建構函式會存在風險,具體原因請查詢有關 “淺拷貝” 、“深拷貝”的文章論述    Complex(const Complex & c)    {        // 將對象c中的資料成員值複製過來        m_real = c.m_real;        m_img  = c.m_img;    }  };       

C++中多重繼承建構函式調用的先後順序:

多重繼承與單繼承類似,也是先執行基類建構函式,按照衍生類別的聲明從左至右依次執行

http://www.cnblogs.com/hu983/p/5524682.html

http://blog.csdn.net/u012954083/article/details/23253749  

#include <cstdio>#include <iostream>using namespace std;
class A{ public: A(){ cout<<"A"<<endl; }};class B{ public: B(){ cout<<"B"<<endl; }};class C:public B,public A{ public: A a; C(){ cout<<"C"<<endl; }};int main(){ C c; return 0;}
輸出:B AAC先按照衍生類別聲明時從左至右先執行類B的建構函式,再執行類A的建構函式,所以輸出B、A,之後由於類C中A a;這個語句執行個體化類A,所以執行類A的建構函式輸出A,最後執行類C的建構函式輸出C

 

C中的結構體和C++中結構體的不同之處:

在C中的結構體只能自訂資料類型,結構體中不允許有函數,而C++中的結構體可以加入成員函數。

C中的結構體只涉及到資料結構,而不涉及到演算法,C++中的結構體和類體現了資料結構和演算法的結合。

 

C++中的結構體和類的異同:

一、相同之處:

結構體中可以包含函數;也可以定義public、private、protected資料成員;定義了結構體之後,可以用結構體名來建立對象。

也就是說在C++當中,結構體中也可以有成員變數,可以有成員函數,可以從別的類繼承,也可以被別的類繼承,可以有虛函數。

二、不同之處:

結構體定義中預設情況下的成員是public,而類定義中的預設情況下的成員是private的。類中的非static成員函數有this指標,(而struct中沒有是錯誤的,一直被誤導啊,經過測試struct的成員函數一樣具有this指標),類的關鍵字class能作為template模板的關鍵字 即template<class T> class A{}; 而struct不可以。

 

類類型轉換:

#include <iostream>#include <string>using namespace std; // 使用命名空間 // 調整聲明位置class Teacher{public:    friend class Student; // 設定友元,除非你用某種途徑得到name,sex什麼的    friend ostream& operator<<(ostream& output, Teacher  t);private:    long num;    string name;    string sex;};class Student{public:    Student(long num, string name, string sex) :num(num), name(name), sex(sex) {}    // 轉換應該是在Student裡面,定義Teacher類型轉換運算子函數    operator Teacher() { Teacher t; t.num = num; t.name = name; t.sex = sex; return t; }private:    long num;    string name;    string sex;};ostream& operator<<(ostream& output, Teacher  t){    output << "I‘m a teacher" << t.name << t.num << t.sex;    return output;}int main(int argc, char* argv[]){    Student s(123, "xiaoming", "man");    cout << Teacher(s); // 強制轉換直接輸出    return 0;}

 

 

類模板:

    如同函數模板一樣,使用類模板使使用者可以為類定義一種模式,使得類中的某些資料成員、某些成員函數的參數、某些成員函數的傳回值能取任意類型。類模板是對一批僅僅成員資料類型不同的類的抽象,程式員只要為這一批類所組成的整個類家族建立一個類模板,給出一套程式碼,就可以用來產生多種具體的類,(這類可以看作是類模板的執行個體),從而大大提高編程的效率。

 定義類模板的一般形式是:
 template <類型名 參數名1,類型名參數名2,…>
 class 類名
 {
  類聲明體
 };
 例如,template <class T>
 class Smemory
 {…
  public:
  void mput(T x);
  …
 }

 表示定義一個名為Smemory的類模板,其中帶型別參數T。

    在類模板的外部定義類成員函數的一般形式是:
 template <類型名 參數名1,類型名參數名2,…>
 函數傳回值類型 類名<參數名 1 參數名 2,…>::成員函數名(形參表)
 {
  函數體
 }
 例如:template <class T>
  void Smemory<T>::mput(T x)
  {…}

  表示定義一個類模板Smemory的成員函數,函數名為mput,形參x的類型是T,函數無傳回值。
  類模板是一個類家族的抽象,它只是對類的描述,編譯器不為類模板(包括成員函數定義)建立程式碼,但是通過對類模板的執行個體化可以產生一個具體的類以及該具體類的對象。

    與函數模板不同的是:函數模板的執行個體化是由編譯器在處理函數調用時自動完成的,而類模板的執行個體化必須由程式員在程式中顯式地指定,
其執行個體化的一般形式是:
  類名 <資料類型 1(或資料),資料類型 2(或資料)…> 對象名
 例如,Smemory<int> mol;
  表示將類模板Smemory的型別參數T全部替換成int 型,從而建立一個具體的類,並產生該具體類的一個對象mol。

  #include <iostream.h> #include <conio.h> const int SIZE=8; template <class T> class Smemory { //定義類模板Smemory    T data[SIZE]; //類型為T,長度為SIZE的數組data[]為資料成員    int count;    public:    Smemory( ){ count=0; }    void mput(T x); //mput()函數的參數x的類型是T    T mget( ); //聲明傳回值類型為T的成員函數mget()   }; template <class T> void Smemory<T>::mput(T x) //定義成員函數mput(),函數的參數類型為T,該函數用於為資料成員 data數組的各個元素賦值 {    if(count==8) { cout<<"Memory is full"; return; }    data[count]=x;    count++; } template <class T> T Smemory<T>::mget( )  //定義成員函數mget(),函數的傳回型別為T,該函數用於取出資料成員 data數組的各個元素 {    if(count==0) { cout<<"Memory is empty"; return 0; }    count--;    return data[count]; }  void main( ) {    Smemory<int> mo1;     int i; char ch=‘A‘;//將Smemory執行個體化,並建立對象mo1   Smemory<char> mo2; //將Smemory執行個體化,並建立對象mo2   for(i=0; i<8;i++)   {    mo1.mput(i);          //調用成員函數mput()    mo2.mput(ch); ch++; //調用成員函數mput()   }   cout<<"Get mo1 => ";   for(i=0;i<8;i++)   cout<<mo1.mget( );        //調用成員函數mget()   cout<<"\nGet mo2 => ";   for(i=0;i<8;i++)   cout<<mo2.mget( ); //調用成員函數mget()   getch(); }  程式的運行結果是: Get mo1=> 76543210 Get mo2=> HGFEDCBA

       類模板和模板類:

       類模板的重點是模板。表示的是一個模板,專門用於產生類的模子。例子:  

1 template <typename T>2 class Vector3 {4     ...5 };

       模板類是類模板執行個體化後的一個產物,說個具體點的例子吧,我們把類模板比作是一個做餅乾的模子,而模板類就是用這個模子做出來的餅乾,至於這個餅乾是什麼味道的就要看你自己在執行個體化時用的是什麼材料了,你可以做巧克力餅乾,也可以做牛奶餅乾,這些餅乾出了材料不一樣外,其它的東西都是一樣的了。

       在C++的Template中很多地方都用到了typename與class這兩個關鍵字,有時候這兩者可以替換,那麼這兩個關鍵字是否完全一樣呢?

  事實上class用於定義類,在模板引入c++後,最初定義模板的方法為:template<class T>,這裡class關鍵字表明T是一個類型,後來為了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字,它的作用同class一樣表明後面的符號為一個類型,這樣在定義模板的時候可以使用下面的方式了:

  template<typename T>.在模板定義文法中關鍵字class與typename的作用完全一樣。

C++學習

聯繫我們

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