C中的結構體存在缺點:
1.函數中的任意賦值語句都可以訪問結構體中的成員,但在現實生活中並不是什麼數據都可以被隨意訪問的,因此C語言中的結構體的數據是不安全的;
2.結構體中的數據和對該數據的操作是分離的,並不是一個被封裝起來的整體,因此使程序難以重用,影響了軟件生產效率;於是C++中引入了類的概念。
C++中規定如果沒有對類的成員加私有private,保護protected,或公有public,則默認爲私有的。
而對於C++的結構體來說,成員可以是私有的,保護的或公有的,但默認爲公有的;還有要注意的是不能在類的聲明中給數據成員賦值.
一般情況下,一個類的數據成員應該聲明爲私有的,成員函數聲明爲共有的。這樣,內部的數據隱藏在類中,在類的外部無法訪問直接訪問,使數據得到有效的保護。而公有的成員函數就成爲一種與類外部溝通的接口。
(1)普通的成員函數:
C++中的成員函數要注意幾點:
1.類名和函數名之間應加上作用域運算符“::”,用於聲明這個成員函數是屬於哪一個類的,如果在函數名前沒有類名,或既無類名又無作用域運算符“::”,那麼這個函數不屬於任何類,不是成員函數,而是普通函數;
2.在類的聲明中,成員函數原型的參數表中可以不說明參數的名字,而只說明它的類型,但在類外定義時必須既要說明參數類型又要說明參數名;
(2)內聯成員函數:
內聯函數又分爲顯式聲明和隱式聲明2種方式。
隱式聲明:(這種定義的內聯成員函數沒有使用關鍵字inline進行聲明,因此叫隱式定義)
class Kid
{
private:
int age;
char*name;
char*sex;
public:
void setKid(int age,char*name,char*sex)
{
Kid::age=age;
Kid::name=name;
Kid::sex=sex;
}
void showKid()
{
cout<<"姓名:"<<name<<endl<<"年齡:"<<age<<endl<<"性別:"<<sex<<endl;
}
};
顯式聲明:
class Kid
{
private:
int age;
char*name;
char*sex;
public:
inline void setKid(int age,char*name,char*sex);
inline void showKid();
};
inline void Kid::setKid(int age,char*name,char*sex)
{
Kid::age=age;
Kid::name=name;
Kid::sex=sex;
}
//注意:line 應該在函數定義之前(在聲明之前是否有inline對函數是否內聯不影響)
inline void Kid::showKid()
{
cout<<"姓名:"<<name<<endl<<"年齡:"<<age<<endl<<"性別:"<<sex<<endl;
}
//建議把inline函數的定義放到頭文
內聯函數的調用就是代碼的擴展,而不是一般函數的調用的操作;但要注意的是使用inline定義的內聯函數必須將類的聲明和內聯成員函數的定義都放在同一個文件中,否則編譯時無法進行代碼的置換;
在C++中,類與對象的關係,可以用數據類型int和整形變量i之間的關係來類比。int類型和類類型代表一種抽象的概念,而整形變量和類的對象代表具體的東西。C++把類的變量稱爲類的對象,對象也被稱爲類的實例;類的對象可以是:
class Kid
{
private:
int age;
char*name;
char*sex;
public:
inline void setKid(int age,char*name,char*sex);
inline void showKid();
}kid1,kid2;
也可以是聲明瞭類後,使用時在定義對象:Kid kid1,kid2;(聲明一個類後,它並不接受和存儲具體的值,只作爲生成具體對象的一種“樣板”,只有定義了對象後,系統才爲對象分配存儲空間,以存放對象中的成員);
對對象中的成員的訪問可以是:
1.對象名.數據成員名/對象名.成員函數名(參數),比如kid1.setKid(10,"rookie_j","男");
2.指針訪問對象中成員,比如:class Kid{public: int age;}; Kid kid,*ptr; ptr=&kid;cout<<ptr->age//cout<<(*ptr).age;
3.還記得上節所講到的引用(reference)麼,還可以通過引用來訪問對象中的成員:class Kid{public: int age;}; Kid kid;Kid &ptr=kid; cout<<ptr.age//cout<<kid.age;
舉例說明:
#include "stdafx.h"
#include <iostream>
usingnamespace std;
struct struct_Kid //結構體
{
int age; //默認公有
char*name;
char*sex;
}kid1;
class Kid
{
int age; //默認私有
private: //私有
char*name;
char*sex;
public: //公有
inline void setKid(int age,char*name,char*sex);//顯示內聯
/*{
Kid::age=age;
Kid::name=name;
Kid::sex=sex;
}*/
void showKid()//隱式內聯
{
cout<<"類:"<<endl<<"姓名:"<<name<<endl<<"年齡:"<<age<<endl<<"性別:"<<sex<<endl;
}
}kid2;//直接定義對象
inline void Kid::setKid(int age,char*name,char*sex)
{
Kid::age=age;
Kid::name=name;
Kid::sex=sex;
}
int main()
{
//結構體
kid1.age=10;
kid1.name="rookie_j";
kid1.sex="男";
cout<<"結構體:"<<endl<<"姓名:"<<kid1.name<<endl<<"年齡:"<<kid1.age<<endl<<"性別:"<<kid1.sex<<endl;
cout<<"--------------------"<<endl;
//類
Kid kid3,*ptr;
Kid &kid4=kid3;
ptr=&kid2;
kid2.setKid(0,"rookie_y","男");
kid2.showKid();
cout<<"--------------------"<<endl;
//指針調用成員函數
(*ptr).setKid(20,"rookie_y","女");//或ptr->setKid(20,"rookie_z","女");
kid2.showKid();
cout<<"--------------------"<<endl;
//對象名調用成員函數
kid3.setKid(10,"rookie_x","男");
kid3.showKid();
cout<<"--------------------"<<endl;
//引用調用成員函數
kid4.setKid(30,"rookie_x","女");
kid3.showKid();
return0;
}