結(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ù)把問題看成是相互作用的事物的集合拷肌,也就是對象的集合馋袜。對象具有兩個特性:
- 狀態(tài):指對象本身的信息,也稱為屬性趁啸。
- 行為:對對象的操作强缘。
- 通過對事物的抽象,找出同一類對象的共同屬性(靜態(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)抛虏。
-
抽象:對象是系統(tǒng)中用來描述客觀事物的一個實體劫哼。對象的特點包括兩個方面:屬性和操作叮趴。
類的初步知識
類的定義
- 類中的成員
按功能劃分博其,包括成員變量和成員函數(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標準下丙猬,類中聲明的任何成員不能使用
auto
、extern
和register
關(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 |
受保護的 | 介于public 和private 之間缤沦,使用它修飾的類的成員 能在本類內(nèi)及子類中被訪問 |
隱藏的作用
設置私有成員的機制叫做隱藏虎韵。隱藏的一個目的就是強制對私有成員變量的訪問一定要通過公有成員函數(shù)進行。這樣做的好處是:如果以后修改了成員變量的類型等屬性缸废,只需要更改成員函數(shù)即可包蓝;否則,所有直接訪問成員變量的語句都需要修改企量。
標識符的作用域與可見性
- 標識符是組成程序的最小成分之一测萎。類名、函數(shù)名梁钾、變量名绳泉、常量名和枚舉類型的取值等都是標識符。這些標識符有各自的作用域和可見性姆泻。標識符的作用域是指標識符的有效范圍零酪,即它在程序中的存在區(qū)域冒嫡。標識符的可見性是指在程序的哪個區(qū)域里可以使用。對于同一個標識符來說四苇,這兩個區(qū)域可能是不完全重合的孝凌。
- C++中標識符的作用域有:函數(shù)原型作用域、局部作用域(塊作用域)月腋、類作用域和命名空間作用域蟀架。
函數(shù)原型作用域
-
在聲明函數(shù)原型時形參的作用范圍就是函數(shù)原型作用域,這是C++程序中最小的作用域榆骚。例如片拍,有如下的函數(shù)聲明:
double area(double radius);
標識符
radius
的作用范圍就在函數(shù)area
形參表的左右括號之間,在程序的其他地方不能引用這個標識符妓肢。因為函數(shù)聲明中形參僅在形參列表中有效捌省,所以,函數(shù)聲明中往往不寫形參名碉钠,而僅寫形參的類型纲缓。
局部作用域
類作用域
類可以被看成是一組有名字的成員的集合,類X
的成員m
具有類作用域喊废,對m
的訪問方式有如下3中:
- 如果在類
X
的成員函數(shù)中沒有聲明同名的局部作用域標識符祝高,那么在該函數(shù)內(nèi)可以直接訪問成員m
。也就是說污筷,m
在這樣的函數(shù)中起作用工闺。 - 在類外,可以通過表達式
x.m
或者X::m
來訪問瓣蛀,其中x
是類X
的對象斤寂。這正是程序中訪問對象成員的最基本方法。當然揪惦,這樣的訪問不能違反m
的訪問修飾符的限定遍搞。 - 在類外,可以通過
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ī)則枪向。