類通常分爲以下兩個部分
1. 類的實現細節
2. 類的使用方式
注:當使用類時,不需要關心其實現細節;當創建一個類時,才需要考慮其內部實現細節;
使用手機時,只需要知道如何發短信,打電話,拍照等等即可,不需要關心手機是如何開發出來的。手機開發工程師就需要考慮手機內部的實現細節,如硬件細節和軟件細節。
一、封裝的基本概念
根據日常生活中的經驗:並不是類的每個屬性都是對外公開的
如:女孩子不希望外人知道自己的年齡和身高
如:一些男孩子不希望別人知道自己會尿牀
而一些類的屬性是對外公開的
如:人類的姓名,學歷,國籍等
因此,需要在類的表示法中定義屬性和行爲的公開級別,類似文件系統中文件的權限
二、C++中類的封裝
成員變量
C++中用於表示類屬性的變量;
成員函數
C++中用於表示類行爲的函數;
在C++中可以給成員變量和成員函數定義訪問級別
public
成員變量和成員函數可以在類的內部和外界訪問和調用
private
成員變量和成員函數只能在類的內部被訪問和調用
類成員的訪問屬性demo:
#include <stdio.h>
struct Biology
{
bool living;
};
struct Animal : Biology
{
bool movable;
void findFood()
{
}
};
struct Plant : Biology
{
bool growable;
};
struct Beast : Animal
{
void sleep()
{
}
};
struct Human : Animal
{
void sleep()
{
printf("I'm sleeping...\n");
}
void work()
{
printf("I'm working...\n");
}
};
struct Girl : Human
{
private:
int age;
public:
void play()
{
printf("I'm girl, I'm playing...\n");
}
void print()
{
age = 22;
printf("Girl's age is %d\n", age);
play();
sleep();
work();
}
};
struct Boy : Human
{
public:
int age;
void play()
{
printf("I'm boy, I'm playing...\n");
}
void print()
{
age = 23;
printf("Boy's age is %d\n", age);
play();
sleep();
work();
}
};
int main(int argc, char *argv[])
{
Girl girl;
girl.print();
Boy boy;
boy.print();
printf("Press any key to continue...");
getchar();
return 0;
}
編譯運行結果如下:
三、類成員的作用域
類成員的作用域都只在類的內部,外部無法直接訪問
成員函數可以直接訪問成員變量和調用其它成員函數
類的外部可以通過類變量訪問public成員
類成員的作用域與訪問級別沒有關係
注:C++中用struct定義的類的所有成員默認爲public
類成員的作用域demo:
#include <stdio.h>
int i = 1;
struct Test
{
private:
int i;
public:
int j;
int getI()
{
i = 3;
return i;
}
};
int main()
{
int i = 2;
Test test;
test.j = 4;
printf("i = %d\n", i);
printf("::i = %d\n", ::i);
//printf("test.i = %d\n", test.i);
printf("test.j = %d\n", test.j);
printf("test.getI() = %d\n", test.getI());
printf("Press any key to continue...");
getchar();
return 0;
}
編譯運行結果如下:
四、類的真正形態
struct在C語言中已經有了自己的含義,只能繼續兼容。在C++中提供了新的關鍵字class用於類定義。class和struct的用法是完全相同的。
class和struct有什麼區別?
1. 在用struct定義類時,所有成員的默認屬性爲public;
2. 在用class定義類時,所有成員的默認屬性爲private;
#include <stdio.h>
struct A
{
int i;
int getI()
{
return i;
}
};
class B
{
int i;
int getI()
{
return i;
}
};
int main(int argc, char *argv[])
{
A a;
B b;
a.i = 1;
a.getI();
b.i = 2;
b.getI();
printf("Press any key to continue...");
getchar();
return 0;
}
編譯運行結果如下:
五、一個運算類的實現
要求:
1. 提供setOperator函數設置運算類型,如加,減,乘,除;
2. 提供setParameter函數設置運算參數,類型爲整型;
3. 提供result函數進行運算,其返回值表示運算的合法性,通過引用參數返回結果;
//Operator.cpp
#include "Operator.h"
bool Operator::setOperator(char op)
{
bool ret = false;
if( (op == '+') || (op == '-') || (op == '*') || (op == '/') )
{
ret = true;
mOp = op;
}
else
{
mOp = '\0';
}
return ret;
}
void Operator::setParameter(double p1, double p2)
{
mP1 = p1;
mP2 = p2;
}
bool Operator::result(double& r)
{
bool ret = true;
switch( mOp )
{
case '/':
if( (-0.000000001 < mP2) && (mP2 < 0.000000001) )
{
ret = false;
}
else
{
r = mP1 / mP2;
}
break;
case '+':
r = mP1 + mP2;
break;
case '*':
r = mP1 * mP2;
break;
case '-':
r = mP1 - mP2;
break;
default:
ret = false;
break;
}
return ret;
}
//Operator.h
#ifndef _OPERATOR_H_
#define _OPERATOR_H_
class Operator
{
private:
char mOp;
double mP1;
double mP2;
public:
bool setOperator(char op);
void setParameter(double p1, double p2);
bool result(double& r);
};
#endif
//main.cpp
#include <stdio.h>
#include "Operator.h"
int main(int argc, char *argv[])
{
Operator op;
double r = 0;
op.setOperator('/');
op.setParameter(8, 4);
if( op.result(r) )
{
printf("Result is %f\n", r);
}
printf("Press any key to continue...");
getchar();
return 0;
}
編譯運行結果如下:
六、總結
類的精華在於封裝
1. 將實現細節和使用方式相分離;
C++中通過public和private實現類的封裝
1. public成員可以通過變量被外界訪問;
2. private成員只能夠在類內部使用;
類的定義和實現可以分開到不同的文件中。