C++學習 18-11-23
阿新 • • 發佈:2018-12-06
C++學習 18-11-23
1.常量成員(const成員)
1.在公有屬性中定義一個 const int m_age;(常量成員),則一定需要在初始化列表中初始化。
class CPerson
{
private:
const int n_age; // 常量成員,一定要在初始化列表中初始化
int n_name;
public:
CPerson():n_age(123), n_name(100) // 初始化列表
{
}
};
2.常量函式(const函式)
1.不能修改類中的成員屬性
class CPerson
{
private:
const int n_age; // 常量成員,一定要在初始化列表中初始化
int n_name;
public:
CPerson():n_age(123), n_name(100) // 初始化列表
{
}
public:
void Show()
{
n_name++;
}
void ConstShow() const // 常函式,不能修改類中的成員屬性,因為this已經變為了const
{
n_name++;
}
};
3.常量物件(const物件)
1.只能使用常函式,普通函式不能呼叫。
class CPerson
{
private:
const int n_age; // 常量成員,一定要在初始化列表中初始化
int n_name;
public:
CPerson():n_age(123), n_name(100) // 初始化列表,常量成員必須在此處初始化,普通成員可以在此處,也可以在建構函式裡
{
}
public:
void Show()
{
n_name++;
}
void ConstShow() const // 常函式,不能修改類中的成員屬性,因為this已經變為了const
{
n_name++;
}
};
int main()
{
CPerson ps1;
ps1.Show();
ps1.ConstShow(); // 會出錯,不可呼叫
const CPerson ps2;
ps2.Show(); // 會出錯,不可呼叫
ps2.ConstShow();
system("pause");
return 0;
}
4.安全性只能升級,不能降級
1.可以進行下列操作
int a = 100;
const int *p1 = &a;
// 以下程式是錯誤的
const int b = 120;
int *p2 = &b;
5.類之間的關係
1.建立一個建模專案->UML類圖。
這種類圖是用來直觀的表示程式中各個類之間的關係的圖。
2.類之間的關係分為兩大類: 橫向關係和縱向關係
縱向關係就是繼承關係,它的概念非常明確,也成為面向物件程式設計的三個重要特徵之一。
橫向關係較為微妙,按照UML的建議大體上可以分為四種:
1.依賴 (Dependency)
2.關聯 (Association)
3.聚合 (Aggregation)
4.組合 (Composition)
它們的強弱關係是沒有異議的:依賴 < 關聯 < 聚合 < 組合
3.建立一個組合關係的類
1.首先定義一個CPerson類,該類可以完成PersonSay()函式,這個函式是由兩個物件的函式組成;
2.定義一個CHead類,該類完成的是PersonSay()函式中的一個物件的函式呼叫;
3.定義一個CHand類,該類完成的是PersonSay()函式中的另一個物件的函式呼叫;
4.在這個過程當中,CHead類與CHand類的關係就是組合關係。
class CHead
{
public:
void Say()
{
cout << "Head Mouth Say!" << endl;
}
};
class CHand
{
public:
void HandMove()
{
cout << "Hand Move!" << endl;
}
};
class CPerson
{
private:
CHead ps_head;
CHand ps_hand;
public:
CPerson()
{
}
public:
void PersonSay()
{
ps_head.HeadSay();
ps_hand.HandMove();
}
};
int main()
{
CPerson ps1;
ps1.PersonSay();
system("pause");
return 0;
}
4.定義一個依賴關係
1.首先定義一個CComputer類,這個類中可以實現Code函式;
2.其次在CPerson類中定義一個Coding函式,傳入CComputer類物件的引用,並在其中呼叫該物件的Code函式。
class CComputer
{
public:
void Code()
{
cout << "碼程式碼..." << endl;
}
};
class CPerson
{
private:
public:
CPerson()
{
}
public:
void Coding(CComputer& cp)
{
cp.Code();
}
};
int main()
{
CPerson ps1;
ps1.Coding();
system("pause");
return 0;
}
5.定義一個關聯關係類
1.首先需要理解什麼是關聯關係,所謂關聯就是某個物件會長期的持有另一個物件的引用,而二者的關聯往往也是相互的。關聯的兩個物件彼此間沒有任何強制性的約束,只要二者同意,可以隨時解除關係或是進行關聯,它們在生命期問題上沒有任何約定。被關聯的物件還可以再被別的物件關聯,所以關聯是可以共享的。
2.建立一個朋友CFriend類,其中包括friend的人品,人品大於等於5則可以交朋友。
#include<iostream>
#include<time.h>
using namespace std;
class CFriend
{
public:
int f_rp;
public:
CFriend()
{
f_rp = rand() % 10;
}
public:
void PlayTogether()
{
cout << "爸爸帶你飛..." << endl;
}
};
class CPerson
{
private:
CFriend *p_friend;
public:
CPerson()
{
p_friend = 0;
}
public:
void FindFriend(CFriend *one_friend)
{
if(one_friend->f_rp >= 5)
{
p_friend = one_friend;
}
}
void LOL()
{
if(p_friend)
{
p_friend->PlayTogether();
}
else
{
cout << "孤獨..." << endl;
}
}
};
int main()
{
srand((unsigned int)time(0));
CFriend new_friend;
CPerson ps1;
ps1.FindFriend(&new_friend);
ps1.LOL();
system("pause");
return 0;
}
6.定義一個聚合類
class CPerson
{
private:
public:
CPerson()
{
}
public:
};
class CFamily
{
private:
CPerson *p_family[10];
public:
CFamily() // 初始化家庭指標陣列為空(每個元素都為0)
{
for(int i=0; i<10; i++)
{
p_family[i] = 0;
}
}
public:
void PushPerson(CPerson *person)
{
int count = 0;
while(p_family[count])
{
count++;
}
p_family[count] = person;
}
};
int main()
{
CPerson ps1;
CFamily family;
family.PushPerson(&ps1);
system("pause");
return 0;
}
7.依賴關係和關聯關係沒有生命週期,組合關係和聚合關係是有生命週期的。
7.整體程式
#include <iostream>
#include <time.h>
#include <string>
using namespace std;
class CHead
{
private:
public:
void HeadSay()
{
cout << "HeadSay" << endl;
}
};
class CHand
{
private:
public:
void HandMove()
{
cout << "HandMove" << endl;
}
};
// 定義一個與CPerson呈依賴關係的CComputer類
class CComputer
{
public:
void Code()
{
cout << "碼程式碼...." << endl;
}
};
// 定義一個關聯類
class CFriend
{
public:
int f_rp;
public:
CFriend()
{
f_rp = 10;
}
public:
void PlayTogher()
{
cout << "爸爸帶你飛" << endl;
}
};
class CPerson
{
private:
CHead head;
CHand hand;
CFriend *p_friend;
public:
CPerson()
{
p_friend = 0;
}
public:
void FindFriend(CFriend *one_friend)
{
if(one_friend->f_rp >= 5)
p_friend = one_friend;
}
void Play()
{
if(p_friend)
p_friend->PlayTogher();
else
{
cout << "我自己飛" << endl;
}
}
void PersonSay()
{
head.HeadSay();
hand.HandMove();
}
void Coding(CComputer& cp)
{
cp.Code();
cout << "掉頭髮....." <<endl;
}
};
// 定義一個與CPerson是聚合關係的類
class CFamily
{
public:
CPerson *p_family[10];
public:
CFamily()
{
for(int i=0; i<10; i++)
p_family[i] = 0;
}
public:
void PushPerson(CPerson *person)
{
int i = 0;
while (p_family[i])
{
i++;
}
p_family[i] = person;
}
void AllFamilyCoding(CComputer& cp)
{
int i = 0;
while (p_family[i])
{
p_family[i]->Coding(cp);
i++;
}
}
};
int main()
{
srand((unsigned int)time(0));
CComputer cp;
CFriend one_friend;
CPerson ps1;
ps1.PersonSay();
ps1.Coding(cp);
ps1.FindFriend(&one_friend);
ps1.Play();
// 測試CFamily類
CFamily c_family;
c_family.PushPerson(&ps1);
c_family.AllFamilyCoding(cp);
system("pause");
return 0;
}