C++面向對象三大特性:封裝、繼承、多態
1.封裝
1.1封裝的意義
- 將屬性和行為作為一個整體
- 將屬性和行為加以權限控制
封裝意義一:
語法:class 類名{ 訪問權限: 屬性 / 行為 };
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//實例1 #define _CRT_SECURE_NO_WARNINGS 1 //求圓的周長 #include<iostream> using namespace std; #define pi 3.14 class circle { public : int m_d; //直徑 double calculate() { return pi*m_d; } }; int main() { circle c1; c1.m_d = 10; cout << "圓周長為" << c1.calculate() << endl; system ( "pause" ); return 0; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
//實例2 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; #include <string> class Student { public : string m_name; int m_num; void showStudent() { cout << " 姓名:" << "\t" << m_name << " 學號:" << m_num << endl; } void setname(string name) { m_name = name; } void setnum( int num) { m_num = num; } }; int main() { Student s1; s1.setname( "zhangsan" ); s1.setnum(2001); s1.showStudent(); Student s2; s2.setname( "lisi" ); s2.setnum(2002); s2.showStudent(); system ( "pause" ); return 0; } |
總結:類中的 屬性 和 行為 統一稱為 成員
類中的 屬性 又稱為 成員屬性 成員變量
類中的 行為 又稱為 成員函數 成員方法
封裝意義二
訪問權限有三種
公共權限: public 成員類內可以訪問,類外可以訪問
保護權限: protected 成員類內可以訪問,類外不可以訪問 兒子可以訪問父親中的保護內容
私有權限: private 成員類內可以訪問,類外不可以訪問 兒子不可以訪問父親中的保護內容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; #include <string> class Student { public : string m_name; protected : int m_num; private : int m_age; public : void func() { m_name = "lili" ; m_num = 1; m_age = 30; } private : void func1() { m_name = "lili" ; m_num = 1; m_age = 30; } }; int main() { Student s1; s1.m_name = "lilllll" ; //s1.m_num = 2;//不可訪問 //s1.m_age = 20;//不可訪問 s1.func(); //s1.func1();//不可訪問 system ( "pause" ); return 0; } |
1.2 struct 和 class 區別
在C++中 struct 和 class 區別在于 默認的訪問權限不同
- struct 默認權限為公共
- class 默認權限為私有
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; class C1 { string m_a; }; struct C2 { string m_b; }; int main() { //C1 c1; //c1.m_a = "lili";//不可訪問 C2 c2; c2.m_b = "lili" ; system ( "pause" ); return 0; } |
1.3 成員屬性設置為私有
優點:
- 將所有成員屬性設置為私有,可以自己控制讀寫權限
- 對于寫權限,我們可以檢測數據的有效性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include <string> using namespace std; class C1 { public : void setname(string name) { m_name = name; } string getname() { return m_name; } int getnum() { return m_num; } void setage( int age) { m_age = age; } private : string m_name; int m_num; int m_age; }; int main() { C1 c; c.setname( "yangyang" ); //可寫 cout << c.getname() << endl; //可讀 cout << c.getnum() << endl; //只讀 c.setage(30); //只寫 system ( "pause" ); return 0; } |
好的,到這里封裝就算是學到手了,可以進行兩個小案例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include <string> using namespace std; class Cube { public : void setchang( int chang) { m_c = chang; } void setkuan( int kuan) { m_k = kuan; } void setgao( int gao) { m_g = gao; } int getchang() { return m_c; } int getkuan() { return m_k; } int getgao() { return m_g; } int S() { return 2 * (m_c*m_g + m_c*m_k + m_g*m_k); } int V() { return m_c*m_g*m_k; } bool isSamebyclass(Cube &c) { if (m_c == c.getchang() && m_g == c.getgao() && m_k == c.getkuan()) { return true ; } return false ; } private : int m_c; int m_k; int m_g; }; bool isSame1(Cube &c1, Cube &c2) { if (c1.getchang() == c2.getchang() && c1.getgao() == c2.getgao() && c1.getkuan() == c2.getkuan()) { return true ; } return false ; } int main() { Cube c1; c1.setchang( 10 ); c1.setkuan( 10 ); c1.setgao( 10 ); cout << "面積:" << c1.S() << endl; cout << "體積:" << c1.V() << endl; Cube c2; c2.setchang( 11 ); c2.setkuan( 11 ); c2.setgao( 11 ); cout << "面積:" << c2.S() << endl; cout << "體積:" << c2.V() << endl; bool ret = isSame1(c1, c2); if (ret) { cout << "全局函數判斷:兩個立方體相等" << endl; } else { cout << "全局函數判斷:兩個立方體不相等" << endl; } ret = c1.isSamebyclass(c2); if (ret) { cout << "成員函數判斷:兩個立方體相等" << endl; } else { cout << "成員函數判斷:兩個立方體不相等" << endl; } system( "pause" ); return 0 ; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include <string> using namespace std; class Point { public : void setX( int x) { m_x = x; } int getX() { return m_x; } void setY( int y) { m_y = y; } int getY() { return m_y; } private : int m_x; int m_y; }; class Circle { public : void setR( int r) { m_r = r; } int getR() { return m_r; } void setcenter(Point center) { m_center = center; } Point getcenter() { return m_center; } private : int m_r; Point m_center; }; void C_and_P(Circle &c, Point &p) { int distance = (c.getcenter().getX() - p.getX())*(c.getcenter().getX() - p.getX()) + (c.getcenter().getY() - p.getY())* (c.getcenter().getY() - p.getY()); int doubleR = c.getR()*c.getR(); if (distance==doubleR) { cout << "點在圓上" << endl; } else if (distance<doubleR) { cout << "點在圓內" << endl; } else { cout << "點在圓外" << endl; } } int main() { Point p; p.setX( 10 ); p.setY( 30 ); Circle c; c.setR( 10 ); Point center; center.setX( 26 ); center.setY( 43 ); C_and_P(c, p); system( "pause" ); return 0 ; } |
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!
原文鏈接:https://blog.csdn.net/GiGi_Princess/article/details/120057308