C語(yǔ)言等面向過(guò)程編程中,數(shù)據(jù)以及數(shù)據(jù)的相關(guān)操作函數(shù)都是分離的獨(dú)立個(gè)體;在C++等面向?qū)ο缶幊讨?,?shù)據(jù)以及數(shù)據(jù)的相關(guān)操作被設(shè)計(jì)為對(duì)象,對(duì)象包括屬性(數(shù)據(jù))和操作(函數(shù)),兩者共同構(gòu)成對(duì)象實(shí)體(即類(lèi)實(shí)體)。面向?qū)ο缶幊淌钩绦蚋K化,更易讀易寫(xiě),提升了代碼重用到一個(gè)更高的層次。
面向?qū)ο缶幊讨?,?shù)據(jù)和數(shù)據(jù)的操作封裝為了對(duì)象。封裝可以隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼模塊化,是把過(guò)程和數(shù)據(jù)包圍起來(lái),對(duì)數(shù)據(jù)的訪問(wèn)只能通過(guò)已定義的接口。
封裝是一種對(duì)外提供服務(wù)的模型,封裝模型是對(duì)世間萬(wàn)物的個(gè)體抽象。
封裝的訪問(wèn)屬性如下:
訪問(wèn)屬性 屬性 對(duì)象內(nèi)部 對(duì)象外部
public 公有 可訪問(wèn) 可訪問(wèn)
protected 保護(hù) 可訪問(wèn) 不可訪問(wèn)
private 私有 可訪問(wèn) 不可訪問(wèn)
C語(yǔ)言中,struct中所有行為和屬性都是public的(默認(rèn)),既可以使用接口,又可以直接訪問(wèn)其內(nèi)部數(shù)據(jù),沒(méi)有屏蔽內(nèi)部數(shù)據(jù)。
C++語(yǔ)言中,強(qiáng)化了C語(yǔ)言的封裝特性,struct、class可以指定行為和屬性的訪問(wèn)方式,對(duì)內(nèi)開(kāi)放數(shù)據(jù),對(duì)外屏蔽數(shù)據(jù),對(duì)外提供接口。
目前創(chuàng)新互聯(lián)建站已為超過(guò)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、習(xí)水網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
C語(yǔ)言中,通常使用模塊化進(jìn)行封裝。
stack的C語(yǔ)言實(shí)現(xiàn):
#include
#include
typedef struct stack
{
char space[1024];
int top;
}stack;
void stack_init(stack *st)
{
st->top = 0;
memset(&st->space, 0, sizeof(st->space));
}
int is_empty(stack *st)
{
return st->top == 0;
}
int is_full(stack *st)
{
return st->top == 1024;
}
char pop(stack *st)
{
return st->space[--st->top];
}
void push(stack *st, char c)
{
st->space[st->top++] = c;
}
int main(void)
{
stack st;
stack_init(&st);
unsigned int i;
for(i = 'a'; i < ('z' + 1); i++)
{
if(!is_full(&st))
push(&st, i);
}
for(i = 'a'; i < ('z' + 1); i++)
{
printf("%c\n", pop(&st));
}
return 0;
}
C語(yǔ)言中封裝的struct的數(shù)據(jù)成員是可以被外部調(diào)用修改的。
C++語(yǔ)言強(qiáng)化了C語(yǔ)言的封裝,在類(lèi)的表示法中定義了屬性和行為的訪問(wèn)級(jí)別。
C++語(yǔ)言中,用于表示類(lèi)屬性的變量為成員變量;用于表示類(lèi)行為的函數(shù)為成員函數(shù)。C++語(yǔ)言中,可以對(duì)類(lèi)的成員變量和成員函數(shù)定義訪問(wèn)級(jí)別。
public:使用public關(guān)鍵字聲明的類(lèi)的成員變量和成員函數(shù)可以在類(lèi)的內(nèi)部和外部訪問(wèn)與調(diào)用
private:使用private關(guān)鍵字聲明的類(lèi)的成員變量和成員函數(shù)只能在類(lèi)的內(nèi)部訪問(wèn)和調(diào)用
protected:使用protected關(guān)鍵字聲明的類(lèi)的成員變量和成員函數(shù)只能在本類(lèi)以及派生子類(lèi)的內(nèi)部訪問(wèn)和調(diào)用。
類(lèi)的成員的作用域只在類(lèi)的內(nèi)部,外部不能直接訪問(wèn)。類(lèi)的成員函數(shù)可以直接訪問(wèn)成員變量和調(diào)用成員函數(shù)。類(lèi)的外部可以通過(guò)類(lèi)對(duì)象訪問(wèn)public成員。
C++語(yǔ)言中,struct定義的類(lèi)中成員的默認(rèn)訪問(wèn)權(quán)限為public,class定義的類(lèi)中成員的默認(rèn)訪問(wèn)權(quán)限為private。
C++語(yǔ)言中,對(duì)struct關(guān)鍵字進(jìn)行了擴(kuò)展,struct已經(jīng)不只是C語(yǔ)言中變量集合的struct,C++語(yǔ)言中的struct不僅可以定義成員函數(shù),也可以實(shí)現(xiàn)繼承和多態(tài)。與C語(yǔ)言中的struct一樣,C++語(yǔ)言中使用struct定義類(lèi)時(shí),成員的默認(rèn)訪問(wèn)級(jí)別為public。
#include
using namespace std;
struct Person
{
const char* name;
int age;
virtual void print()
{
printf("My name is %s, I'm is %d years old.\n",name,age);
}
};
//默認(rèn)繼承訪問(wèn)權(quán)限為public
struct Student : Person
{
void print()
{
printf("My name is %s, I'm is %d years old."
"My score is %d\n",name,age,score);
}
void setScore(const int n)
{
score = n;
}
private:
int score;
};
int main(int argc, char *argv[])
{
Person p;
p.name = "Bob";
p.age = 30;
p.print();
Student s;
s.name = "Bauer";
s.age = 20;
s.setScore(98);
s.print();
dynamic_cast(&s)->print();
return 0;
}
由于C++語(yǔ)言的struct需要兼容C語(yǔ)言的struct,C++語(yǔ)言使用新的class關(guān)鍵字定義類(lèi)。使用class定義類(lèi)時(shí),成員的默認(rèn)訪問(wèn)級(jí)別為private。
C++中的類(lèi)支持聲明和實(shí)現(xiàn)的分離,將類(lèi)的定義和實(shí)現(xiàn)分開(kāi),通常.h頭文件中只有類(lèi)的聲明,包括成員變量和成員函數(shù)的聲明;.cpp源文件中完成類(lèi)的成員函數(shù)的實(shí)現(xiàn)。
#include
using namespace std;
class Person
{
public:
const char* name;
int age;
virtual void print()
{
printf("My name is %s, I'm is %d years old.\n",name,age);
}
};
class Student : public Person
{
public:
void print()
{
printf("My name is %s, I'm is %d years old."
"My score is %d\n",name,age,score);
}
void setScore(const int n)
{
score = n;
}
private:
int score;
};
int main(int argc, char *argv[])
{
Person p;
p.name = "Bob";
p.age = 30;
p.print();
Student s;
s.name = "Bauer";
s.age = 20;
s.setScore(98);
s.print();
dynamic_cast(&s)->print();
return 0;
}
C++語(yǔ)言中struct與class最本質(zhì)的區(qū)別如下:
A、默認(rèn)訪問(wèn)權(quán)限不同。struct默認(rèn)的訪問(wèn)權(quán)限是public的,class默認(rèn)的訪問(wèn)權(quán)限是private的。
B、默認(rèn)繼承訪問(wèn)權(quán)限不同。struct默認(rèn)的繼承訪問(wèn)權(quán)限是public的,class默認(rèn)的繼承訪問(wèn)權(quán)限是private的。
C、class可用作定義模板參數(shù)的關(guān)鍵字,而struct不可以。
C++語(yǔ)言中,繼承時(shí)如果沒(méi)有指定繼承訪問(wèn)權(quán)限,默認(rèn)繼承訪問(wèn)權(quán)限是public繼承還是private繼承,取決于子類(lèi)而不是基類(lèi)。struct可以繼承class,class也可以繼承struct,默認(rèn)的繼承訪問(wèn)權(quán)限取決于子類(lèi)是struct還是class,如果子類(lèi)使用struct聲明,默認(rèn)繼承訪問(wèn)權(quán)限是public;如果子類(lèi)使用class聲明,默認(rèn)繼承訪問(wèn)權(quán)限是private。
#include
using namespace std;
class Person
{
public:
const char* name;
int age;
virtual void print()
{
printf("My name is %s, I'm is %d years old.\n",name,age);
}
};
//默認(rèn)繼承訪問(wèn)權(quán)限為public
struct Student : public Person
{
public:
void print()
{
printf("My name is %s, I'm is %d years old."
"My score is %d\n",name,age,score);
}
void setScore(const int n)
{
score = n;
}
private:
int score;
};
int main(int argc, char *argv[])
{
Person p;
p.name = "Bob";
p.age = 30;
p.print();
Student s;
s.name = "Bauer";
s.age = 20;
s.setScore(98);
s.print();
dynamic_cast(&s)->print();
return 0;
}
C++類(lèi)實(shí)現(xiàn)stack:
stack.h源碼:
#ifndef STACK_H
#define STACK_H
class stack
{
public:
stack();
bool is_empty();
bool is_full();
void push(char c);
char pop();
private:
char space[1024];
unsigned int top;
};
#endif // STACK_H
stack.cpp源碼:
#include "stack.h"
#include
stack::stack()
{
top = 0;
memset(space, 0, sizeof(space));
}
bool stack::is_empty()
{
return top == 0;
}
bool stack::is_full()
{
return top == 1024;
}
void stack::push(char c)
{
space[top++] = c;
}
char stack::pop()
{
return space[--top];
}
main.cpp源碼:
#include
#include "stack.h"
#include
using namespace std;
int main()
{
stack st;
unsigned int i;
for(i = 'a'; i < 'z' + 1; i++)
{
if(!st.is_full())
st.push(i);
}
for(i = 'a'; i < 'z' + 1; i++)
{
cout<
C++語(yǔ)言中封裝的class stack中數(shù)據(jù)成員是private的,對(duì)于外部不可訪問(wèn),通過(guò)設(shè)置數(shù)據(jù)成員和操作方法的訪問(wèn)權(quán)限,可以對(duì)外部開(kāi)放、屏蔽數(shù)據(jù)成員和操作方法。C++通過(guò)定義類(lèi)成員的訪問(wèn)級(jí)別實(shí)現(xiàn)封裝機(jī)制。C++語(yǔ)言中類(lèi)支持聲明和實(shí)現(xiàn)的分離,在頭文件中聲明類(lèi),在源文件中實(shí)現(xiàn)類(lèi)。