初學類與物件總結
類與物件初學總結:
一:知識點總結:
1:在面向物件程式設計中,程式的基本單位是類。類是使用者定義的資料和操作這些資料的函式的封裝。
2:c++中,類定義的說明語句一般形式:
Class <類名>
{public: 公有段資料成員和成員函式;
Protected:保護段資料成員和成員函式;
Private:私有制資料成員和成員函式;
};(“;”一定不要忘記)
3:private 用於宣告私有成員,私有成員只能在類中可見,不能再類外使用。(如果私有成員放在第一段,通常省略 private 。
4:public 宣告公有成員,公有成員是類的介面,類內類外都可見。
5:返回函式 類名::函式名(引數表) (作用域區分符由兩個冒號構成,用於標識屬於什麼類的成員)
6:成員函式有兩個作用:一 操作資料成員,包括訪問和修改資料成員。 二 協同不同的物件操作,傳遞訊息。
7:訪問物件成員時一般用”.”和“->”訪問物件成員。(-> 用於指標訪問物件)
8:c++中為成員函式提供了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++學習中的一個過度階段,也希望在以後的學習中能更清楚的掌握好類的知識,爭取做出更加優秀的系統。