1. 程式人生 > >C++學習記錄二

C++學習記錄二

強制型別轉化

C中:char *ptr;                    C++中:double num = 5;

         int *p = (int *)ptr;                      int count =static_cast<int>num;

指標型別間轉化:reinterpret_cast<T>expr

Const int p = 5;

int num = const_cast<int>p;//去掉const屬性

面向物件的優點:

       可維護,複用,擴充套件,靈活(活字印刷術)

面向物件的三大特點:封裝(維護)、繼承(複用)、多型(擴充套件)、[抽象也是特點]

類的宣告:

class Test

{

       public:

              intx_;//能在類外訪問

       protected:

              inty_;//類外不能訪問

       private:

              intz_;//類外不能訪問                                                                                                                                                                                                                                                                    } 

int main()

{

       Test t;

       t.x_= 5;//public可能在類外進行訪問

       cout<< “t.x_ = ” << t.x_ << endl;

       return0;

                     =>t.x_= 5

       t.y_= 6;//成員Test::y_不可訪問

       t.z_= 7;//同上

}

不能在類內直接初始化

命名規範:

1、 類的命名:第一個字母大寫

2、 類內成員:名字_,如x_、y_、z_

3、 函式:駝峰命名,第一個單詞以小寫字母開始,每第二個單詞的首字母大寫或每個單詞首字母均大寫

類是一種使用者自定義的型別,宣告形式:

class 類名稱

{

       public:

              公有成員(外部介面)類與外部的介面,任何外部函式都可以訪問公有型別資料和函式

       private:

              私有成員 只允許本類中的函式訪問

       protected:

              保護成員 與private類似,差別:繼承與派生時對派生類的影響不同

};

*struct與class

1、用struct宣告類,如果對其成員不作private或public的宣告,系統將其預設為public(公用的);

2、用class定義的類,如果不作private或public宣告,系統將其預設為private(私有的);

3、結構體也支援限定,不能繼承,類可繼承

#include <iostream>

using namespace std;

Class Test

{

public:

       intx_;

       voidsetX(int x)

       {

              x_= x;

}

void setY(int y)

{

       y_ = y;

}

void setZ(int z)

{

       z_ = z;

}

int getx()

{

       return x_;

}

int gety()

{

       return y_;

}

int getz()

{

       return z_;

}

}

int main()

{

       Testt;

       t.setX(5);

       t.setY(6);

       t.setZ(7);

       cout<< “t.x_” << t.getX() <<endl;

       cout<< “t.y_” << t.getY() << endl;

       cout<< “t.z_” << t.getZ() << endl;

       return0;

}

結果:

t.x_ = 5

t.y_ = 6

t.z_ = 7

類內定義的成員函式,編譯器預設為inline

類內成員函式可互相呼叫

成員函式定義在類外

Test.h Test.cpp  Main.cpp      g++ Main.cpp  Test.cpp  -o Main

Test.h

#ifndef _TEST_H

#define _TEST_H_

class Test

{

         int x_;

         int y_;

         int z_;

public:

         voidinitXYZ(int x, inty, int z);

         voiddisplayXYZ();

};

#endif

Test.cpp

#include <iostream>

#include "Test.h"

 using namespace std;

 void Test::initXYZ(intx, int y, intz)

{

  x_ = x;

         y_ = y;

         z_ = z;

}

 void Test::displayXYZ()

{

         cout << "t.x_= " << x_ << endl;

         cout << "t.y_= " << y_ << endl;

         cout << "t.z_= " << z_ << endl;

}

Main.cpp

#include <iostream>

#include "Test.h"

int main()

{

         Test t;

         t.initXYZ(1,2,3);

         t.displayXYZ();

         return0;

}

結果:

t.x_ = 1

t.y_ = 2

t.z_ = 3

成員函式可類內實現(預設inline)也可類外實現(一般採用類外)

封裝特點:保護成員屬性

Test* t1 = new Test();

t1->initXYZ(1,2,4);

物件的儲存模型

*物件的大小隻與成員屬性有關,與類中的方法無關       Test t1;

與結構體一樣的對齊方式。物件的大小有成員決定            Test t2;


方法共享在同一段空間

不同的物件使用的是同一個函式程式碼段,利用This指標來指向不同的物件

this指標:

保留呼叫物件地址,自動傳參

傳參時間:呼叫方法的時候,動態的呼叫完消失

前向宣告:

       當一個類中要呼叫另一個類時

       ①包括標頭檔案(代價較大)

       ②前向宣告不能含有物件的實體,即前向宣告的類不能例項化。一定要是物件的指標或引用。


A.h

#ifndef _A_H_

#define _A_H_

 #include "B.h"//加標頭檔案

 class A

{

public:

       A();

       ~A();

private: //加標頭檔案

       B b; //加標頭檔案

};

 #endif

B.h

#ifndef _B_H_

#define _B_H_

 class A;//前向宣告

 class B

{

public:

       B();

       ~B();

private: //前向宣告

       A *a; //前向宣告

};

 #endif


A.cpp

#include <iostream>

#include "A.h"

 using namespace std;

 A::A()

{

       cout << "initA!"<< endl;

}

 A::~A()

{

       cout << "destoryA!" << endl;

}

B.cpp

#include <iostream>

#include "B.h"

 using namespace std;

B::B()

{

       cout << "initB!" << endl;

}

B::~B()

{

       cout << "destoryB!" << endl;

}


 Main.cpp

#include <iostream>

#include "A.h"

#include "B.h"

 int main()

{

       return 0;

}