官术网_书友最值得收藏!

3.1 結構與類

3.1.1 C++對結構的擴展

最初的C++稱為“帶類的C”,擴展了C語言結構的功能。C++中的結構不僅可以包含數據,而且可以包含操作這些數據的函數。將數據和操作數據的函數包裝在一起的主要目的是實現數據封裝和信息隱藏,信息隱藏就是使結構中的數據和對數據進行操作的細節對外不可見。簡單地說,信息隱藏就是不讓結構外部的函數直接修改結構中的數據,只能通過結構的成員函數對數據進行間接修改。為了實現信息隱藏,限制對結構某些成員的非法訪問,C++增設了以下三個訪問權限限定符,用于設置結構中數據成員和成員函數的訪問權限。

① public:被設置為public權限的成員(包括數據成員和成員函數)稱為類的公有成員,可被任何函數訪問(包括結構內和結構外的函數)。public區域中的成員稱為類的接口。

② private:被設置為private權限的成員(包括數據成員和成員函數)稱為類的私有成員,只能被結構內部的成員訪問。

③ protected:與繼承有關,以后再介紹。

C++默認結構成員都具有public權限,可被直接訪問,通過訪問控制權限的設置,可以改變C++結構中成員的訪問權限。

例3-1】 一個包含了數據和數據操作函數的復數結構。

//Eg3-1.cpp
#include <iostream>
using namespace std;
struct Complex{
private:
    double r;
    double i;
public:
    void init(double rr,double ii){r=rr;i=ii;}
    double real() {return r;}
    double image() {return i;}
};
void main(){
    Complex a;
    a.init(2,3);
    cout<<a.real()<<"+"<<a.image()<<"i"<<endl;
    a.r=6;        //L1 錯誤
    a.i=3.2;        //L2 錯誤
}

訪問權限限定符的有效范圍是從其開始直到下一個權限設置。所以本例中的private將數據成員r和i都設置成了private權限,public則將init()、real()和image()三個成員函數設置為public權限。因此,r和i只能被Complex內部的成員函數init()、real()和image()訪問,而函數init()、real()和image()則可被結構之外的任何函數訪問。

main( )中對a.r和a.i的直接賦值是錯誤的,因為r和i是Complex結構內部的私有成員,不允許main()函數直接訪問它們,a.r和a.i的修改只能通過public成員函數init()進行:

3.1.2 類

struct將所有成員都默認為public權限,這很不安全。如果在設計結構時,本想將成員設置為private權限,但因疏忽而忘了加上關鍵字private,成員就變成公有權限了。此外,struct還容易與傳統C語言中的結構混淆。基于這些原因,C++引進了功能與struct相同但更安全的數據類型——類。

類也是一種自定義數據類型,用關鍵字class表示,用法與struct相同,形式如下:

class class_name{
[private:]               //可以省略
    data_member;
    functin_name;
public:
    data_member;
    functin_name;
protected:
    data_member;
    functin_name;
};                   //分號必不可少

class_name是類名,常用首字符大字的標識符表示;private、public、protected用于指定成員的訪問權限,與其在struct中的含義和用法都相同;data_member表示數據成員;functin_name表示成員函數;一對“{}”表示類的范圍,“}”后面的分號必不可少,表示類聲明的結束。

例3-2】 用class定義的復數類Complex。

//Eg3-2.cpp
#include <iostream.h>
class Complex{
private:
        double r;
        double i;
public:
    void init(double rr,double ii){r=rr;i=ii;}
    double real() {return r;}
    double image() {return i;}
    };
void main(){
    Complex a;
    a.init(2,3);
    cout<<a.real()<<"+"<<a.image()<<"i"<<endl;
    a.r=6;            //錯誤,訪問類的私有成員
    a.i=3.2;            //錯誤,訪問類的私有成員
}

說明:① 類聲明中的訪問限定符private、public、protected沒有先后次序之分,哪個在前面,哪個在后面沒有區別,常將private成員的聲明放在類的后面,將public成員放在前面,以方便人們了解類的可訪問接口。

② 在同一個類中,訪問限定符private、public、protected的出現次數沒有限制。例如,可以將一個public區域中的成員分散為多個public區域,也可以將多個public區域中的成員合并在一個public區域中。

③ 數據成員和成員函數都可以設置為public、private或protected屬性。出于信息隱藏的目的,常將數據成員和只能讓類內部訪問的成員函數設置為private權限,將需要讓類的外部函數(非本類定義的函數)訪問的成員函數設置為public權限,

④ 數據成員可以是任何數據類型,如整型、浮點型、字符型、數組、指針、引用等,也可以是另外一個類的對象或指向對象的指針,還可以是指向自身類的指針或引用,但不能是自身類的對象。數據成員不能指定為自動(auto)、寄存器(register)和外部(extern)存儲類型。例如:

class A{……};
class B{
  private:
    int a;
    A obja1;      //正確
    A *obja2;     //正確
    B *objb,&objr;  //正確
    B b1;       //錯誤
    auto int b;     //錯誤
    extern int c;    //錯誤
  public:
    ……
};

⑤ 在聲明(或定義)類時,不能為數據成員賦初值。例如:

class A{
private:
    int a=0;      //錯誤
    int b[3]={1,2,3};  //錯誤
public:
    ……
};

類的聲明(或定義)只是增加了一種自定義數據類型,不存在為數據成員分配存儲空間的事情。在聲明(或定義)類時就為數據成員賦初值是錯誤的,因為此時數據成員在內存中還不存在。只有用類定義變量時,才會為類變量分配存儲空間,數據成員才會在內存中存在。

⑥ C++的struct也是一種類,它與class具有相同功能,用法完全相同。struct與class的唯一區別是,在沒有指定成員的訪問權限時,struct中的成員具有public權限,而class中的成員則具有private權限。例如:

struct Complex{    class Complex{
    double r;          double r;
    double i;          double i;
  public:            public:
    ……               ……
};     };

struct Complex中的r和i是public成員,而class Complex中的r和i則是private成員。

雖然struct和class具有同樣的功能,但在實際工作中,常用class設計具有成員函數的類,而struct則保留C語言中的用法,常用來設計只包含數據成員的結構。

主站蜘蛛池模板: 盐山县| 黎城县| 成安县| 阳泉市| 长汀县| 芜湖县| 武胜县| 志丹县| 张家界市| 沾益县| 万山特区| 大理市| 手游| 灵寿县| 新河县| 景东| 玉溪市| 丰镇市| 新绛县| 丰都县| 堆龙德庆县| 静海县| 长泰县| 呼玛县| 湟中县| 儋州市| 个旧市| 山阳县| 曲麻莱县| 泌阳县| 博野县| 邹城市| 新化县| 区。| 门源| 威海市| 定日县| 辽宁省| 增城市| 田阳县| 阳曲县|