10 多載函數 10.1 多載概論 多載一般函數 多載成員函數 10-3

Slides:



Advertisements
Similar presentations
单元二:面向对象程序设计 任务二:借书卡程序设计.
Advertisements

JAVA 编 程 技 术 主编 贾振华 2010年1月.
四資二甲 第三週作業 物件導向程式設計.
程序设计实习 3月份练习解答
第九讲 类与对象 (I)面向对象基础.
第八章 类和对象.
C++程序设计 王希 图书馆三楼办公室.
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
第二章 C# 基础知识.
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
第11章 运算符重载 什么是运算符重载 运算符重载的方法 几个特殊的运算符的重载 自定义类型转换运算符 运算符重载实例.
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
哈夫曼编码.
Ch10 類別與物件-方法 Java程式設計(2).
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
類別樣板 Class Template 類似函式樣板 由類別樣板產生的類別稱為類別樣版的實體(instance)
Operator Overloading; String and Array Objects
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
第三章 C++中的C 面向对象程序设计(C++).
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
第四章 小技巧.
$10 可空类型.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
Animation(動畫) 靜宜大學資工系 蔡奇偉 副教授
第三章 C# 基础知识.
Classes (2) Lecture 7.
第十三讲 文件流与 输出输入重载.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第10讲 构造函数和析构函数 构造函数 析构函数 This 指针.
保留字與識別字.
第四章 类 4.1 基础知识 4.2 构造函数 4.3 方法 4.4 属性与索引 4.5 String类
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
第三章 数据抽象.
字符串 (String) 字符串是 n (  0 ) 个字符的有限序列, 记作 S = “c1c2c3…cn” 其中,S 是串名字
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
Object-Oriented Programming in C++ 第二章 类和对象
C++程式設計入門 變數與運算子 作者:黃建庭.
第二章 Java语法基础.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
C++程序设计 吉林大学计算机科学与技术(软件)学院.
第二章 类型、对象、运算符和表达式.
C++程序设计基础 主讲人:谢昕 华东交通大学信息工程学院 第十~十二讲 多态性和虚函数 2005年春季学期.
第1章 C++面向对象程序设计要点 1.1 函数和函数参数 1.2 输入输出   1.3 类 1.4 抽象类型和模板.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第 5 章 继承、多态和虚函数 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
第 4 章 类的高级部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
Class 2005/05/25.
第2章 Java语言基础.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
變數與資料型態  綠園.
Presentation transcript:

10 多載函數 10.1 多載概論 10-2 10.1.1 多載一般函數 10-2 10.1.2 多載成員函數 10-3 10 多載函數 10.1 多載概論 10-2 10.1.1 多載一般函數 10-2 10.1.2 多載成員函數 10-3 10.1.3 多載建立者函數 10-5 10.2 多載運算符號 10-8 10.2.1 多載運算符號限制 10-9 10.2.2 運算符號函數 10-10 10.2.3 多載 >> 運算符號 10-10 10.2.4 多載 << 運算符號 10-13 10.2.5 多載雙運算元符號 10-16 10.2.6 多載單運算元符號 10-20 10.2.7 多載前置運算符號 10-23 10.2.8 多載後置運算符號 10-23 10.3 轉換型態 10-26 10.3.1 基本型態轉基本型態 10-26 10.3.2 基本型態轉類別型態 10-27 10.3.3 類別型態轉基本型態 10-29 10.3.4 類別型態轉類別型態 10-31

10.1 多載概論 多載(overloading)就是重複定義多個相同名稱的函數,但這些函數的功能不完全相同。所以多載函數的情況包括:(1)接收不同數量的參數,(2)傳遞不同型態的參數,(3)傳回不同型態的參數。

10.1.1 多載一般函數 多載(overloading)就是重複定義多個相同名稱的函數,但這些函數的功能不完全相同。 範例 10.1.1 多載一般函數 多載(overloading)就是重複定義多個相同名稱的函數,但這些函數的功能不完全相同。 範例 int area(int length, int width); //第一個area { return length * width; } 範例待續……

10.1.1 多載一般函數 (續) 範例續 double area(int radius) //第二個area函數 { 10.1.1 多載一般函數 (續) 範例續 double area(int radius) //第二個area函數 { return 3.1415926 * pow(radius, 2); } int main() int rectangleArea = area(3, 5); //呼叫第一個area函數 double circleArea = area(5); //呼叫第二個area函數 return 0; //正常結束程式

10.1.2 多載成員函數 多載函數的情況包括:(1)接收不同數量的參數,(2)傳遞不同型態的參數,(3)傳回不同型態的參數。 範例一 10.1.2 多載成員函數 多載函數的情況包括:(1)接收不同數量的參數,(2)傳遞不同型態的參數,(3)傳回不同型態的參數。 範例一 class Cuboid //宣告長方體類別 { private: int length; //Cuboid的資料成員1 int width; //Cuboid的資料成員2 int height; //Cuboid的資料成員3

10.1.2 多載成員函數 (續) 範例續 public: int area() { //錯誤,Multiple declaration 10.1.2 多載成員函數 (續) 範例續 public: int area() { //錯誤,Multiple declaration return length * width; } return 2 * (length * width + width * height + height * length); };

10.1.2 多載成員函數 (續) 範例二 class Cuboid //宣告長方體類別 { 10.1.2 多載成員函數 (續) 範例二 class Cuboid //宣告長方體類別 { int length; //Cuboid的資料成員1 int width; //Cuboid的資料成員2 int height; //Cuboid的資料成員3 public: void setSide(int l, int w) //設定長方形邊長 length = l; width = w; height = 0; }

10.1.2 多載成員函數 (續) 範例續 void setSide(int l, int w, int h) //設定長方體邊長 { 10.1.2 多載成員函數 (續) 範例續 void setSide(int l, int w, int h) //設定長方體邊長 { length = l; width = w; height = h; } int area() //計算長方體表面積函數 return 2 * (length * width + width * height + height * length); };

10.1.3 多載建立者函數 在類別中可以多載(overload)建立者函數,也就是定義多個建立者函數,每個建立者函數可含有不同個數的參數。 10.1.3 多載建立者函數 在類別中可以多載(overload)建立者函數,也就是定義多個建立者函數,每個建立者函數可含有不同個數的參數。 範例 class Timer { int seconds; public: Timer() { //定義無參數建立者 seconds = 0;} Timer(int s) { //定義整數參數建立者 seconds = s;}

10.1.3 多載建立者函數 (續) 範例續 Timer(char *t) { //定義指標參數建立者 10.1.3 多載建立者函數 (續) 範例續 Timer(char *t) { //定義指標參數建立者 seconds = atoi(t);} }; int main() { char str[20] = "250"; Timer t1; //t1.seconds = 0 Timer t2(10); //t2.seconds = 10 Timer t3(str); //t3.seconds = 250 return 0; //正常結束程式 }

10.2 多載運算符號 在C++ 語言中,<< 運算符號可以配合cout敘述作為字串輸出運算符號,也可以作為左移位元運算符號;同理,>> 運算符號可以配合cin敘述作為字串輸入運算符號,也可以作為右移位元運算符號。這就是運算符號多載(operator overloading)。 運算符號多載(operator overloading),就是要再定義這些運算符號,使它們也能接受使用者自定的資料型態與物件。

10.2.1 多載運算符號限制 可以被多載的運算符號包括表10.1算術運算符號、表10.2關係與邏輯運算符號、表10.3位元運算符號、表10.4指定運算符號、表10.5特殊運算符號。 表中同時提供這些運算符號在C++ 資料庫中的內建功能、範例與說明,設計師為自定資料型態多載這些符號時,必須保持它們原來的功能,否則將會造成語法錯誤訊息。 例如,將 + 多載為減法運算符號,編譯時會出現語法錯誤訊息。

10.2.2 運算符號函數 運算符號函數可以是類別成員函數或非類別成員函數。當非成員函數或非friend函數要存取私用區(private)或保護區(protected)的資料時,必須先呼叫公用區(public)的set或get成員函數,如此將會降低程式的性能。 所以為了得到更好的性能,可使用friend函數,friend雖然不是類別成員函數但仍可直接存取私用區(private)或保護區(protected)的資料。

10.2.3 多載 >> 運算符號 friend istream &operator>>(istream&傳回參數, 類別名稱 物件參數) 範例 class Test { private: int a, b; //定義private變數 public: Test() { a = b = 0; }

10.2.3 多載 >> 運算符號 (續) 範例續 Test(int n, int m) { a = n; b = m; } 10.2.3 多載 >> 運算符號 (續) 範例續 Test(int n, int m) { a = n; b = m; } }; int main() { Test s1; cin >> s1; //錯誤不能輸入Test型態資料 cout << s1; //錯誤不能輸出Test型態資料 return 0; //正常結束程式 }

10.2.4 多載 << 運算符號 friend ostream &operator<<(ostream&傳回參數, 類別名稱 物件參數) 範例 class Test { private: int a, b; //定義private變數 public: Test() { a = b = 0; }

10.2.4 多載 << 運算符號 (續) 範例續 Test(int n, int m) { a = n; b = m; } 10.2.4 多載 << 運算符號 (續) 範例續 Test(int n, int m) { a = n; b = m; } friend istream& operator>>(istream& in, Test& obj); friend ostream& operator<<(ostream& out, Test& obj); }; istream& operator>>(istream& in, Test& obj) { cout << "請輸入a與b之值:"; in >> obj.a >> obj.b; return in; }

10.2.4 多載 << 運算符號 (續) 範例續 10.2.4 多載 << 運算符號 (續) 範例續 ostream& operator<<(ostream& out, Test& obj) { out << "a 與 b 的值:" << endl; out << obj.a << " " << obj.b << endl; return out; } int main() { Test s1; cin >> s1; //若輸入2 3 cout << s1; //則輸出2 3 return 0; //正常結束程式

10.2.5 多載雙運算元符號 傳回型態 operator運算符號(類別型態 物件參數) 10.2.5 多載雙運算元符號 傳回型態 operator運算符號(類別型態 物件參數) 傳回型態 operator運算符號(類別1 物件1, 類別2 物件2) 範例 class Test { int a, b; //定義private變數 public: Test() { a = b = 0; } Test(int n, int m) { a = n; b = m; } Test operator+(Test); //宣告多載 + 號 };

10.2.5 多載雙運算元符號 (續) 範例一續 Test Test::operator+(Test obj) { //定義多載 + 號 10.2.5 多載雙運算元符號 (續) 範例一續 Test Test::operator+(Test obj) { //定義多載 + 號 Test temp; temp.a = a + obj.a; //a=s1.a, obj.a=s2.a temp.b = b + obj.b; //b=s1.b, obj.b=s2.b return temp; } int main() { Test s1(2, 3), s2(4, 5), s3; s3 = s1 + s2; //s1.operator+(s2) return 0; //正常結束程式

10.2.5 多載雙運算元符號 (續) 範例二 class Test { int a; //定義private變數 public: 10.2.5 多載雙運算元符號 (續) 範例二 class Test { int a; //定義private變數 public: Test() { a = 0; } Test(int n) { a = n; } bool operator>(Test); //宣告多載 > 號 }; bool Test::operator>(Test obj) { //定義多載 > 號 if (a > obj.a) return true; else return false; }

10.2.5 多載雙運算元符號 (續) 範例二續 int main() { Test s1(2), s2(5); 10.2.5 多載雙運算元符號 (續) 範例二續 int main() { Test s1(2), s2(5); if (s1 > s2) //呼叫多載 > 函數 cout << "s1 > s2"; else cout << "s1 < s2"; return 0; //成功結束程式 }

10.2.6 多載單運算元符號 傳回型態 operator運算符號() 傳回型態 operator運算符號(類別型態 物件參數) 範例 10.2.6 多載單運算元符號 傳回型態 operator運算符號() 傳回型態 operator運算符號(類別型態 物件參數) 範例 class Test { int a; //定義private變數 public: Test(int n) { a = n; } bool operator !(); //宣告多載 ! 號 };

10.2.6 多載單運算元符號 (續) 範例續 bool Test::operator!() { //定義多載 ! 號 10.2.6 多載單運算元符號 (續) 範例續 bool Test::operator!() { //定義多載 ! 號 if (a != 0) {return true;} else {return false;} } int main() { Test s1(5); if (!s1) {cout << "s1 != 0"; } //呼叫多載 ! 符號函數 else {cout << "s1 == 0";} return 0; //正常結束程式

10.2.7 多載前置運算符號 傳回型態 operator運算符號() 範例 class Test { 10.2.7 多載前置運算符號 傳回型態 operator運算符號() 範例 class Test { int a, b; //定義private變數 public: Test() { a = b = 0; } Test(int n, int m) { a = n; b = m; } Test operator++(); //宣告前置 ++x 號 };

10.2.7 多載前置運算符號 (續) 範例續 Test Test::operator++() //定義前置 ++x 號 { 10.2.7 多載前置運算符號 (續) 範例續 Test Test::operator++() //定義前置 ++x 號 { return Test(++a, ++b); } int main() Test s1(2, 3), s2; s2 = ++s1; //等於s1.operator++() return 0; //正常結束程式

10.2.8 多載後置運算符號 傳回型態 operator運算符號(int) 範例 class Test { 10.2.8 多載後置運算符號 傳回型態 operator運算符號(int) 範例 class Test { int a, b; //定義private變數 public: Test() { a = b = 0; } Test(int n, int m) { a = n; b = m; } Test operator++(int); //宣告後置 x++ 號 };

10.2.8 多載後置運算符號 (續) 範例續 Test Test::operator++(int) //定義後置 x++ 號 { 10.2.8 多載後置運算符號 (續) 範例續 Test Test::operator++(int) //定義後置 x++ 號 { return Test(a++, b++); } int main() Test s1(2, 3), s2; s2 = s1++; //s2.a=s1.a=2, s2.b=s1.b=3 //s1.a=++s1.a=3, s1.b=++s1.b=4 return 0; //正常結束程式

10.3 轉換型態 轉換型態 目的位置 來源位置 基本型態轉換基本型態 使用C++ 內建函數 基本型態轉換類別型態 使用建立者函數 無 10.3 轉換型態 轉換型態 目的位置 來源位置 基本型態轉換基本型態 使用C++ 內建函數 基本型態轉換類別型態 使用建立者函數 無 類別型態轉換基本型態 使用多載型態符號函數 類別型態轉換類別型態

10.3.1 基本型態轉基本型態 float型態的fracfeet轉成int型態的feet int feet; 10.3.1 基本型態轉基本型態 float型態的fracfeet轉成int型態的feet int feet; float fracfeet = 3.280833 * 3.5; feet = int(fracfeet); //float轉成int int型態的fracfeet轉成float型態的fracfeet float fracfeet = inch / 10; fracfeet = float(feet); //feet從int轉為float

10.3.2 基本型態轉類別型態 float型態的資料轉成Distance型態 const float MTF = 3.280833f; 10.3.2 基本型態轉類別型態 float型態的資料轉成Distance型態 const float MTF = 3.280833f; class Distance //宣告Distance類別 { int feet; float inch; public: Distance (int f, float in) //宣告一參數建立者 feet = f; inch = in; }

10.3.2 基本型態轉類別型態 (續) 範例續 Distance (float meter) { //宣告二參數建立者 10.3.2 基本型態轉類別型態 (續) 範例續 Distance (float meter) { //宣告二參數建立者 float fracfeet = MTF * meter; feet = (int)fracfeet; inch = 10 * (fracfeet - feet); } }; int main() { Distance d(0, 0); //呼叫二個參數的建立者 float m = 3.5; //m = 3.5 m d = m; //呼叫一個參數的建立者 return 0; //正常結束程式

10.3.3 類別型態轉基本型態 Distance型態的資料轉成float型態 範例 const float MTF = 3.280833; 10.3.3 類別型態轉基本型態 Distance型態的資料轉成float型態 範例 const float MTF = 3.280833; class Distance //宣告Distance類別 { int feet; float inch; public: Distance (int f, float in) //Distance類別建立者 feet = f; inch = in; }

10.3.3 類別型態轉基本型態 (續) 範例續 operator float() { //多載float型態函數 10.3.3 類別型態轉基本型態 (續) 範例續 operator float() { //多載float型態函數 float fracfeet = inch / 10; fracfeet = float(feet); return fracfeet / MTF; } }; int main() { Distance d(2, 3); //呼叫Distance建立者 float m; //宣告浮點數變數m m = d; //呼叫operator float函數 return 0; //正常結束程式

10.3.4 類別型態轉類別型態 Polar型態的資料轉成Cartesian型態 10.3.4 類別型態轉類別型態 Polar型態的資料轉成Cartesian型態 class Cartesian { //宣告 Cartesian 類別 double x; double y; public: Cartesian () {x = y = 0.0;} }; class Polar { //宣告Polar類別 double radius; double angle; Polar(double r, double a) { radius = r; angle = a; }

10.3.4 類別型態轉類別型態 (續) 範例續 operator Cartesian() { //多載Cartesian函數 10.3.4 類別型態轉類別型態 (續) 範例續 operator Cartesian() { //多載Cartesian函數 double xx, yy; xx = radius * cos(angle); yy = radius * sin(angle); return Cartesian(xx, yy); } }; int main() { Polar p(2.0, 35.0); //建立極座標p點位置 Cartesian c; //建立平面座標c c = p; //呼叫Cartesian函數 return 0; //正常結束程式

10.3.4 類別型態轉類別型態 (續) Polar型態的資料轉成Cartesian型態 範例 10.3.4 類別型態轉類別型態 (續) Polar型態的資料轉成Cartesian型態 範例 class Polar //宣告Polar類別 { double radius; double angle; public: Polar(double r, double a) { radius = r; angle = a; } double getr() {return radius;} double geta() {return angle;} };

10.3.4 類別型態轉類別型態 (續) class Cartesian { //宣告Cartesian類別 double x; 10.3.4 類別型態轉類別型態 (續) class Cartesian { //宣告Cartesian類別 double x; double y; public: Cartesian() {x = y = 0.0;} Cartesian(double a, double b) {x = a; y = b;} Cartesian operator = (Polar p) { //定義多載 = 號函數 double r = p.getr(); double a = p.geta(); x = r * cos(a); y = r * sin(a); return Cartesian(x, y); } };

10.3.4 類別型態轉類別型態 (續) 範例 int main() { Polar p(2.0, 35.0); //建立極座標p點位置 10.3.4 類別型態轉類別型態 (續) 範例 int main() { Polar p(2.0, 35.0); //建立極座標p點位置 Cartesian c; //建立平面座標c c = p; //呼叫多載 = 號函數 return 0; //正常結束程式 }