二逢艘、面向?qū)ο蟮幕靖拍?/h1>

結(jié)構(gòu)化程序設計

在結(jié)構(gòu)化程序設計中,采用自頂向下骤菠、逐步求精模塊化的思想它改,將復雜的大問題層層分解為許多簡單的小問題。

在編寫程序時商乎,使用3種基本控制結(jié)構(gòu)來構(gòu)造程序央拖。可以說鹉戚,程序基本上都含有順序鲜戒、選擇循環(huán)3種基本控制結(jié)構(gòu),這3種控制結(jié)構(gòu)到目前為止仍然是重要的控制結(jié)構(gòu)崩瓤。程序以控制結(jié)構(gòu)為單位袍啡,只有一個入口和一個出口,基于控制結(jié)構(gòu)可以從前往后的順序閱讀程序却桶,程序的靜態(tài)描述與執(zhí)行時的控制流程容易對應额划,所以可以獨立的理解各個部分佑钾。結(jié)構(gòu)化程序設計主要強調(diào)的是程序的易讀性。

面向?qū)ο蟪绦蛟O計的概念和特點

概念

  • 所謂面向?qū)ο蟮某绦蛟O計方法,就是使分析冤留、設計和實現(xiàn)一個系統(tǒng)的方法盡可能地接近人們認識一個系統(tǒng)的方法衷快。通常包括3個方面:
    • 面向?qū)ο蟮姆治?/strong>
    • 面向?qū)ο蟮脑O計
    • 面向?qū)ο蟮某绦蛟O計
  • 面向?qū)ο蠹夹g(shù)把問題看成是相互作用的事物的集合拷肌,也就是對象的集合馋袜。對象具有兩個特性:
    1. 狀態(tài):指對象本身的信息,也稱為屬性趁啸。
    2. 行為:對對象的操作强缘。
  • 通過對事物的抽象,找出同一類對象的共同屬性(靜態(tài)特征)行為(動態(tài)特征)不傅,從而得到類的概念旅掂。
  • 對象是類的一個具象,類是對象的一個抽象访娶。

特點

  • C++中使用對象名商虐、屬性操作三要素來描述對象。
  • 面向?qū)ο蟮某绦蛟O計有抽象崖疤、封裝秘车、繼承多態(tài)4個基本特點。
    • 抽象:對象是系統(tǒng)中用來描述客觀事物的一個實體劫哼。對象的特點包括兩個方面:屬性和操作叮趴。
      • 屬性是指描述對象靜態(tài)特征的數(shù)據(jù)項,可以用變量來表示
      • 操作是指描述對象動態(tài)特征的函數(shù)序列权烧,也稱為方法或服務眯亦。
    • 封裝:在C++中咳蔚,通過用戶定義的來支持數(shù)據(jù)封裝和信息隱藏。
    • 繼承:在C++現(xiàn)有類的基礎上可以聲明新的類搔驼,將一個已有類中的數(shù)據(jù)和函數(shù)保留,并加上自己特殊的數(shù)據(jù)和函數(shù)侈询,從而構(gòu)成一個新類舌涨,這就是繼承和復用的思想。原來的類是基類扔字,也稱為父類或超類囊嘉。新類是派生類,也稱為子類革为。
    • 多態(tài):指不同種類的對象都具有名稱相同的行為扭粱,而具體行為的實現(xiàn)方式卻有所不同。在一個類或多個類中震檩,可以讓多個方法使用同一個名字琢蛤,從而具有多態(tài)性。這是通過函數(shù)重載及運算符重載實現(xiàn)的多態(tài)抛虏。

類的初步知識

類的定義

  • 類中的成員
    按功能劃分博其,包括成員變量成員函數(shù)
    按訪問權(quán)限劃分迂猴,包括公有成員慕淡、私有成員保護成員
  • 在C++中還可以定義不是任何類的成員的函數(shù)沸毁,這樣的函數(shù)可稱為全局函數(shù)峰髓。
  • 成員函數(shù)既可以在類體內(nèi)定義,也可以在類體外定義息尺。如果成員函數(shù)定義在類體內(nèi)部携兵,則默認是內(nèi)聯(lián)函數(shù)。也可以在類體內(nèi)部聲明函數(shù)掷倔,并加上inline關(guān)鍵字眉孩,然后在類體外給出函數(shù)定義,這樣的成員函數(shù)也是內(nèi)聯(lián)函數(shù)勒葱。
名稱 描述 代表
成員變量 是類中的一類成員浪汪,
個數(shù)不限,
也稱為數(shù)據(jù)成員凛虽。
成員變量的聲明方式與普通變量的聲明相同死遭。
代表對象的屬性
成員函數(shù) 是類中的另一類成員,
個數(shù)不限凯旋,
其聲明方式與普通函數(shù)的聲明相同呀潭。
代表對該類對象所含數(shù)據(jù)
進行操作的方法钉迷。
  • 標識符的命名規(guī)則字母、數(shù)字和下劃線****的組合钠署,大小寫敏感糠聪,但不能以數(shù)字開頭,也不能和系統(tǒng)中使用的關(guān)鍵字完全相同谐鼎。

  • 是具有唯一標識符的實體舰蟆,就是說類名不能重復類定義以狸棍;結(jié)束身害,大括號中的部分稱為類體。

  • 定義類時系統(tǒng)并不為類分配存儲空間草戈,而只是把類看作是一種模板或樣板塌鸯。或者說,類可以看作是用戶自定義的一種數(shù)據(jù)類型唐片。在C++98標準下丙猬,類中聲明的任何成員不能使用autoexternregister關(guān)鍵字進行修飾牵触。

  • 如果成員函數(shù)定義在類體外淮悼,則類體內(nèi)必須要有函數(shù)原型,類體外函數(shù)定義的前面必須用類名::來限定揽思,格式如下:

    返回值類型 類名::成員函數(shù)名(參數(shù)列表) {
        成員函數(shù)的函數(shù)體
    }
    
  • 類名是成員函數(shù)所屬類的名字袜腥,符號::類作用域運算符表明它后面的成員函數(shù)是屬于類名標識的這個類的钉汗。返回值類型就是這個成員函數(shù)返回值的類型羹令。

  • 類C中不能定義類C的成員變量,但可以定義類C的指針和引用损痰。

示例

myDate

class myDate {
public:
    myDate();                      //構(gòu)造函數(shù)
    myDate(int, int, int);         //構(gòu)造函數(shù)
    void setDate(int, int, int);   //設置日期
    void setDate(myDate);          //設置日期
    myDate getDate();              //獲取日期
    void setYear(int);             //設置年
    int getMonth();                //設置月
    void printDate() const;        //打印日期
private:
    int year, month, day;          //成員變量
};

myDate::myDate() {
    year = 1970;
    month = 1;
    day = 1;
}
myDate::myDate(int y, int m, int d) {
    year = y;
    month = m;
    day = d;
}
void myDate::setDate(int y, int m, int d) {
    year = y;
    month = m;
    day = d;
}
void myDate::setDate(myDate date) {
    year = date.year;
    month = date.month;
    day = date.day;
}
myDate myDate::getDate() {
    return *this;
}
void myDate::setYear(int y) {
    year = y;
}
int myDate::getMonth() {
    return month;
}
void myDate::printDate() const {
    cout << year << "年" << month << "月" << day << "日" << endl;
}

Student

class Student {
public:
    Student();
    Student(string, myDate);
    string _nickname;
    void setStudent(string, myDate);
    void setName(string);
    string getName();
    void setBirthday(myDate);
    myDate getBirthday();
    void printStudent() const;
private:
    string _name;
    myDate _birthday;
};

Student::Student() {
    _name = "xxx";
    _nickname = "nickname";
    _birthday = myDate(1970, 1, 1);
}
Student::Student(string name, myDate birthday) {
    _name = name;
    _nickname = "nickname";
    _birthday = birthday;
}
void Student::setStudent(string name, myDate birthday) {
    _name = name;
    _birthday = birthday;
}
void Student::setName(string name) {
    _name = name;
}
string Student::getName() {
    return _name;
}
void Student::setBirthday(myDate birthday) {
    _birthday = birthday;
}
myDate Student::getBirthday() {
    return _birthday;
}
void Student::printStudent() const {
    cout << "姓名:" << _name << ", 昵稱 = " << _nickname << ", 生日:";
    _birthday.printDate();
    cout << endl;
}

main函數(shù)

#include <iostream>

#include "myDate.hpp"
#include "Student.hpp"

using namespace std;

int main(int argc, const char * argv[]) {
    string name;
    int y, m, d;
    
    cout << "請輸入學生的姓名和生日福侈,以\"年月日\"的順序輸入" << endl;
    cin >> name >> y >> m >> d;
    
    Student s = Student();
    s.setStudent(name,
                 myDate(y, m, d));
    s.printStudent();
    
    return 0;
}

類的示例程序剖析

程序結(jié)構(gòu)

  • 一個完整的C++程序包括以下幾個部分:
    • 一個主函數(shù),可以調(diào)用其他函數(shù)卢未,但不能被調(diào)用肪凛,也稱主程序。
    • 用戶定義的任意多個類及全局函數(shù)
    • 全局說明辽社。在所有函數(shù)和類定義之外的變量說明及函數(shù)原型伟墙。
    • 注釋
    • 頭文件
  • 對于比較大的程序,根據(jù)主函數(shù)和個用戶定義的類及全局函數(shù)的功能及相互關(guān)系滴铅,可以把類及全局函數(shù)劃分為幾個程序文件戳葵,包括.cpp文件和.hpp/.h文件。.cpp文件是源程序文件汉匙,.hpp/.h文件是頭文件拱烁。

成員變量與成員函數(shù)的定義

實現(xiàn)成員函數(shù)時要指明類的名稱生蚁,在類體外定義的一般格式如下:

返回值類型 類名::成員函數(shù)名(參數(shù)列表) {
    成員函數(shù)的函數(shù)體
}

成員函數(shù)并非每個對象各自存有一份。成員函數(shù)和普通函數(shù)一樣戏自,在內(nèi)存中只有一份邦投,它可以作用于不同的對象,為類中各對象共享擅笔。

通常尼摹,因為函數(shù)體代碼較長,所以在類體內(nèi)僅給出成員函數(shù)的原型剂娄,然后在類體外給出對應的函數(shù)體。如果函數(shù)體定義在類體內(nèi)玄呛,則系統(tǒng)將其視為內(nèi)聯(lián)函數(shù)阅懦。類中定義的成員函數(shù)允許重載。

創(chuàng)建類對象的基本形式

void create() {
    //類名 對象名;
    Student s;
    
    //類名 對象名(參數(shù));
    myDate birthday(2020, 5, 25);
    
    //類名 對象名 = 類名(參數(shù));
    Student s1 = Student("鄧紫棋", birthday);
   
    //可以擴展為多個對象
    //類名 對象名1, 對象名2, 對象名3,...;
    Student s2, s3, s4;
    //類名 對象名1(參數(shù)), 對象名2(參數(shù)),...;
    Student s5("王五", birthday), s6("趙六", birthday);
    
    //類名 *對象名 = new 類名;
    Student *s8 = new Student;
    
    //類名 *對象名 = new 類名();
    Student *s9 = new Student();
    
    //類名 *對象名 = new 類名(參數(shù));
    Student *s10 = new Student("十號", birthday);
}

new創(chuàng)建對象時返回的是一個對象指針徘铝,這個指針指向本類剛創(chuàng)建的這個對象耳胎。C++分配給指針的僅僅是存儲指針值的空間,而對象所占用的空間分配在堆上惕它。使用new創(chuàng)建的對象怕午,必須用delete來撤銷。

與基本數(shù)據(jù)類型一樣淹魄,還可以聲明對象的引用郁惜、對象的指針及對象數(shù)組。

void create1() {
    Student s = Student("永桂",
                        myDate(1999, 9, 9));
    
    //聲明對象引用甲锡,即變量別名
    Student &yonggui = s;
    
    //聲明對象的指針
    Student *yg = &yonggui;
    
    //聲明對象數(shù)組的形式
    Student students[5];
}

同類型的對象之間可以相互賦值兆蕉。對象和對象指針都可以用作函數(shù)參數(shù)。函數(shù)的返回值可以是對象或指向?qū)ο蟮闹羔槨?/p>

訪問對象的成員

void visit() {
    Student s = Student();
    
    //1.通過對象訪問成員變量的格式
    //對象名.成員變量名
    s._nickname = "小八";
    
    //調(diào)用成員函數(shù)的格式
    //對象名.成員函數(shù)(參數(shù)表)
    s.printStudent();
    //姓名:xxx, 昵稱 = 小八, 生日:1970年1月1日
    
    //2.通過引用訪問對象的成員
    Student &sRef = s;
    //設置姓名
    sRef.setName("引用");
    sRef.printStudent();
    //姓名:引用, 昵稱 = 小八, 生日:1970年1月1日
    
    //3.通過指針訪問對象的成員
    Student *sPointer = &s;
    sPointer->setName("指針");
    sPointer->_nickname = "小針";
    sPointer->printStudent();
    //姓名:指針, 昵稱 = 小針, 生日:1970年1月1日
}

類成員的可訪問范圍

訪問范圍說明符 含義 作用
public 公有的 使用它修飾的類的成員
可以在程序的任何地方被訪問
private 私有的 使用它修飾的類的成員
僅能在本類內(nèi)被訪問
protected 受保護的 介于publicprivate之間缤沦,
使用它修飾的類的成員
能在本類內(nèi)及子類中被訪問

隱藏的作用

設置私有成員的機制叫做隱藏虎韵。隱藏的一個目的就是強制對私有成員變量的訪問一定要通過公有成員函數(shù)進行。這樣做的好處是:如果以后修改了成員變量的類型等屬性缸废,只需要更改成員函數(shù)即可包蓝;否則,所有直接訪問成員變量的語句都需要修改企量。

標識符的作用域與可見性

  • 標識符是組成程序的最小成分之一测萎。類名、函數(shù)名梁钾、變量名绳泉、常量名和枚舉類型的取值等都是標識符。這些標識符有各自的作用域和可見性姆泻。標識符的作用域是指標識符的有效范圍零酪,即它在程序中的存在區(qū)域冒嫡。標識符的可見性是指在程序的哪個區(qū)域里可以使用。對于同一個標識符來說四苇,這兩個區(qū)域可能是不完全重合的孝凌。
  • C++中標識符的作用域有:函數(shù)原型作用域、局部作用域(塊作用域)月腋、類作用域和命名空間作用域蟀架。

函數(shù)原型作用域

  • 在聲明函數(shù)原型時形參的作用范圍就是函數(shù)原型作用域,這是C++程序中最小的作用域榆骚。例如片拍,有如下的函數(shù)聲明:

    double area(double radius);
    
  • 標識符radius的作用范圍就在函數(shù)area形參表的左右括號之間,在程序的其他地方不能引用這個標識符妓肢。因為函數(shù)聲明中形參僅在形參列表中有效捌省,所以,函數(shù)聲明中往往不寫形參名碉钠,而僅寫形參的類型纲缓。

局部作用域

image.png

類作用域

類可以被看成是一組有名字的成員的集合,類X的成員m具有類作用域喊废,對m的訪問方式有如下3中:

  1. 如果在類X的成員函數(shù)中沒有聲明同名的局部作用域標識符祝高,那么在該函數(shù)內(nèi)可以直接訪問成員m。也就是說污筷,m在這樣的函數(shù)中起作用工闺。
  2. 在類外,可以通過表達式x.m或者X::m來訪問瓣蛀,其中x是類X的對象斤寂。這正是程序中訪問對象成員的最基本方法。當然揪惦,這樣的訪問不能違反m的訪問修飾符的限定遍搞。
  3. 在類外,可以通過ptr->m這樣的表達式來訪問器腋,其中ptr為指向類X的一個對象的指針溪猿。當然,這樣的訪問不能違反m的訪問修飾符的限定纫塌。

命名空間作用域

定義命名空間的一般形式如下:

namespace 命名空間名 {
    命名空間內(nèi)的各種聲明(函數(shù)聲明诊县、類圣經(jīng)、...)
}

在命名空間內(nèi)部可以直接引用當前命名空間中聲明的標識符措左,如果需要引用其他命名空間的標識符依痊,需要使用下面的方式:

命名空間名::標識符名

例如,定義一個命名空間如下:

namespace SomeNs {
    class SomeClass {.....};
    someFunc(int pram) {....};
}

int main() {
    //引用類名SomeClass或者函數(shù)名someFunc
    SomeNs::SomeClass obj1;
    SomeNs::someFunc(5);

    return 0;
}

在標識符前面總要加上這樣的命名空間限定會顯得過于冗長,為了解決這一問題胸嘁,C++又提供了using語句瓶摆,using與有兩種形式:

using 命名空間名::標識符名;
或
using namespace 命名空間名;

作用域隱藏規(guī)則

具有命名空間作用域的變量也稱為全局變量性宏。

對于在不同的作用域聲明的標識符群井,可見性的一般原則如下:

  • 標識符要聲明在前,引用在后毫胜。
  • 在同一個作用域中书斜,不能聲明同名的標識符。在沒有互相包含關(guān)系的不同作用域中聲明的同名標識符酵使,互不影響荐吉。
  • 如果存在兩個或多個具有包含關(guān)系的作用域,外層聲明了一個標識符口渔,而內(nèi)層沒有再次聲明同名標識符稍坯,那么外層標識符在內(nèi)層仍然可見。如果在內(nèi)層聲明了同名標識符搓劫,則外層標識符在內(nèi)層不可見,這時稱內(nèi)層標識符隱藏了外層同名標識符混巧,這種機制稱為隱藏規(guī)則枪向。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咧党,隨后出現(xiàn)的幾起案子秘蛔,更是在濱河造成了極大的恐慌,老刑警劉巖傍衡,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件深员,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛙埂,警方通過查閱死者的電腦和手機倦畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绣的,“玉大人叠赐,你說我怎么就攤上這事÷沤” “怎么了芭概?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惩嘉。 經(jīng)常有香客問我罢洲,道長,這世上最難降的妖魔是什么文黎? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任惹苗,我火速辦了婚禮殿较,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸽粉。我一直安慰自己斜脂,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布触机。 她就那樣靜靜地躺著帚戳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儡首。 梳的紋絲不亂的頭發(fā)上片任,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音蔬胯,去河邊找鬼对供。 笑死,一個胖子當著我的面吹牛氛濒,可吹牛的內(nèi)容都是我干的产场。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼舞竿,長吁一口氣:“原來是場噩夢啊……” “哼京景!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骗奖,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤确徙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后执桌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鄙皇,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年仰挣,在試婚紗的時候發(fā)現(xiàn)自己被綠了伴逸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡膘壶,死狀恐怖违柏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情香椎,我是刑警寧澤漱竖,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站畜伐,受9級特大地震影響馍惹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一万矾、第九天 我趴在偏房一處隱蔽的房頂上張望悼吱。 院中可真熱鬧,春花似錦良狈、人聲如沸后添。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遇西。三九已至,卻和暖如春严嗜,著一層夾襖步出監(jiān)牢的瞬間粱檀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工漫玄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茄蚯,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓睦优,卻偏偏與公主長得像渗常,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子汗盘,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345