1. 程式人生 > >初學類與物件總結

初學類與物件總結

類與物件初學總結

一:知識點總結:

1:在面向物件程式設計中,程式的基本單位是類。類是使用者定義的資料和操作這些資料的函式的封裝。

2c++中,類定義的說明語句一般形式:

Class <類名>

{public: 公有段資料成員和成員函式;

Protected:保護段資料成員和成員函式;

Private:私有制資料成員和成員函式;

};(“;”一定不要忘記)

3private 用於宣告私有成員,私有成員只能在類中可見,不能再類外使用。(如果私有成員放在第一段,通常省略 private

4public 宣告公有成員,公有成員是類的介面,類內類外都可見。

5:返回函式     類名::函式名(引數表)  (作用域區分符由兩個冒號構成,用於標識屬於什麼類的成員)

6:成員函式有兩個作用:一  操作資料成員,包括訪問和修改資料成員。  二 協同不同的物件操作,傳遞訊息。

7:訪問物件成員時一般用.->”訪問物件成員。(->  用於指標訪問物件)

8c++中為成員函式提供了this的隱含指標引數,物件的地址被傳遞給this指標,this指標指向該物件。this函式不能顯式說明,但可以在成員函式中顯式使用。

9:建構函式與類名相同,建構函式可以有任意型別的引數,但不能有返回型別。

解構函式在類名之前加一個~”,解構函式沒有引數,也沒有返回型別,解構函式在類物件作用域結束時自動呼叫。

建構函式

 類名::類名(引數表);

解構函式   類名::~類名();
10:建構函式與普通函式一樣,允許過載。如果Date類具有多個建構函式,建立函式時,將根據引數匹配呼叫其中的一個。

11:複製建構函式要求有一個類型別的引用引數:  類名::類名(const 類名&引用名,……);

12:行內函數
⑴行內函數作用減少頻繁呼叫小子程式的執行的時間開銷
⑵行內函數機制編譯器在編譯時,將行內函數的呼叫以相應程式碼代替。
⑶行內函數宣告
     inline  函式原型
行內函數注意:
①行內函數僅在函式原型做一次宣告。


②適用於只有1~5行的小函式。
③不能含有複雜結構控制語句,不能遞迴呼叫。
13:複製建構函式
語法形式:
類名::類名(conest 類名 & 引用名 ,…);
①:複製建構函式名與類名相同,並且也沒有返回值型別。
②:複製建構函式可寫在類中,也可以寫在類外。
③:複製建構函式要求有一個類型別的引用引數。
④:如果沒有顯式引用複製建構函式,系統自動生成一個預設形式的複製建構函式。

14:淺複製:
①:在用一個物件初始化另一個物件時,只複製了資料成員,而沒有複製資源,使兩個物件同時指向了同一資源的複製方式稱為淺複製。(即:對於複雜型別的資料成員只複製了儲存地址而沒有複製儲存內容。
②:預設複製建構函式所進行的時簡單資料複製,即淺複製。
15:深複製:
①:通過一個物件初始化另一個物件時,不僅複製了資料成員,也複製了資源的複製方式稱為深複製。
②:自定義複製建構函式所進行的複製是複製。

16:常資料成員只讀不寫。

17:常資料成員可以在建構函式中直接用常量進行初始化。

18:靜態成員函式在類外定義時不用static字首。

19:靜態成員函式主要用來訪問同一類中的靜態資料成員。

20:私有靜態成員函式不能在類外部或用物件訪問。

21:可以在建立物件之前處理靜態資料成員。

22:編譯系統將靜態成員函式限定為內部連線(在其他檔案中不可見)

23:靜態成員函式中是沒有this指標的。

24:靜態成員函式不訪問類中的非靜態資料成員。如有需要,只能通過物件名(或指向物件的指標)訪問該物件的非靜態成員。

 

二:典型程式碼:

1:學生資訊類:

#include<bits/stdc++.h>

#include<string>

using namespace std;

class student

{

    public://公有段

    student(int id,string na,int x,int y,int z)

    {

        name=na;//姓名

        no=id;//學號

        score[0]=x;//數學

        score[1]=y;//英語

        score[2]=z;//c++

        order=1;//名詞

        average=(score[0]+score[1]+score[2])/3;//平均分

 

    }

    student()//無參函式

    {

        score[0]=score[1]=score[2]=0;

        order=1;

        average=0;

    }

    int getNo() {return no;}

    int getAverage() {return average;}

    int setAverage(int avg) {average=avg;}

    int getOrder() {return order;}

    int setOrder(int x) {order=x;}

    string getName()  {return name;}

    string setName(string na) {return name=na;}

    void display();

 

 

    private://私有段

    int no;

    string name;

    int score[3];

    float average;

    int order;

 

};

void student::display()//顯示

{

    cout<<name<<"\t"<<no<<"\t"<<score[0]<<"\t"<<score[1]<<"\t"<<score[2]<<"\t"<<average<<"\t\t"<<order<<endl;

}

int main()

{

    student s(20171819,"long",66,77,88);

    s.setName("tian");//換名字為“tian”

    s.getName();

    s.getAverage();

    s.getOrder();

    s.display();

    return 0;

}

2:操作類:

#include<iostream>

#include<string>

#include<algorithm>

using namespace std;

class student

{

    private:

    string name;

    int no;

    int score[3];

    float average;

    int order;

    public :

    student (int id,string na,int x,int y,int z)//:

    //name(na),no(id)

    {

        name=na;no=id;

        score[0]=x,score[1]=y,score[2]=z;

        order=1,average=(score[0]+score[1]+score[2])/3;

    }

    student()

    {

        score[0]=score[1]=score[2]=0;

        order=1,average=0;

    }

    int getNo(){return no;}

    int getAverage() {return average;}

    void setAverage(int avg) {average=avg;}

    void setOrder (int x) {order=x;}

    int getOrder() {return average;}

    string getName() {return name;}

    void setName(string name){this->name=name;}

    void display();

};

void student::display()

{

    cout<<name<<"\t"<<no<<"\t"<<score[0]<<"\t"<<score[1]<<"\t"<<score[2]<<"\t"<<average<<"\t\t"<<order<<endl;

}

bool cmp1(student stu1,student stu2)

{

    if (stu1.getAverage()-stu2.getAverage()>=1e-9)return 1;

    else return 0;

}

bool cmp2(student stu1,student stu2)

{

    return stu1.getNo()<stu2.getNo();

}

class student_list

{

    student list[60];

    int n;

    public :

    student_list():n(0){};

    void add();

    void deleteStu();

    void query();

    void change();

    void display(int flge);

    void menu();

    int search(int no);

    void sortList();

};

void student_list::add()

{

    int no,x,y,z;

    string name;

    system("cls");

    cout<<"按學號,姓名,數學,英語,c++順序輸入學生資訊,學號輸-1表示結束"<<endl;

    while ((cin>>no)&&no!=-1)

    {

        cin>>name>>x>>y>>z;

        student s(no ,name ,x,y,z);

        list[n++]=s;

        sortList();

    }

}

void student_list::sortList(){

sort(list,list+n,cmp1);

int i;

for (int i=0;i<n;i++)

list[i].setOrder(i+1);

}

void student_list::display(int flag)

{

    if (flag) sort(list,list+n,cmp2);

    else

    sort(list,list+n,cmp1);

    cout<<"姓名"<<"\t"<<"學號"<<"\t"<<"數學"<<"\t"<<"英語"<<"\t"<<"c++"<<"\t"<<"平均成績"<<"\t"<<"名次"<<endl;

    for (int i=0;i<n;i++)

    list[i].display();

}

int student_list::search(int no)

{

    int i;

    for (i=0;i<n;i++)

    if (list[i].getNo()==no)

    return i;

    return -1;

}

void student_list::query()

{

    int no,i;

    system("cls");

    cout<<"請輸入要查詢同學的學號,按-1結束查詢";

    while(cin>>no&&no!=-1)

    {

        i=search(no);

        if (i!=-1)

        {cout<<"姓名"<<"\t"<<"學號"<<"\t"<<"數學"<<"\t"<<"英語"<<"\t"<<"c++"<<"\t"<<"平均成績"<<"\t"<<"名次"<<endl;

        list[i].display();

        cout<<"請輸入要查詢同學的學號,按-1結束查詢:";}

        else

        cout<<"學號輸入有誤,請重輸,輸入-1結束查詢"<<endl;

    }

}

void student_list::change()

{

 

}

void student_list::deleteStu()

{

 

}

int main()

{

    student s(1,"ff",66,77,88);

    s.display();

    cout<<s.getAverage()<<endl;

    s.setName("方法");

    s.display();

    student_list c;

    c.add();

    c.display(1);

    c.query();

    c.display(0);

    return 0;

 

}

三:學習心得:

通過初步學習類與物件可以讓我學會簡單的系統程式設計。通過簡單的運用一些小程式時整個系統更加完善,完成更多的操作,同時通過學習類的操作可以做一些簡單的系統,是c++學習中的一個過度階段,也希望在以後的學習中能更清楚的掌握好類的知識,爭取做出更加優秀的系統。