【dart学习】之运算符重载
一,什么是運(yùn)算符重載(operator overloading)
在軟件開(kāi)發(fā)過(guò)程中,運(yùn)算符重載(英語(yǔ):operator overloading)是多態(tài)的一種。運(yùn)算符重載通常只是一種語(yǔ)法糖,這種語(yǔ)法對(duì)語(yǔ)言的功能沒(méi)有影響,但是更方便程序員使用。讓程序更加簡(jiǎn)潔,有更高的可讀性。
二,語(yǔ)法糖的現(xiàn)實(shí)意義
在日常工作過(guò)程中,我們讀代碼讀機(jī)會(huì)往往超過(guò)寫代碼,軟件工程是門協(xié)作的藝術(shù)
我們寫的代碼主要是給機(jī)器和人看的,給機(jī)器看的可以通過(guò)代碼測(cè)試和實(shí)際運(yùn)行來(lái)進(jìn)行檢驗(yàn),給人的目前還沒(méi)太好的評(píng)價(jià)方式。不過(guò)在設(shè)計(jì)一門語(yǔ)言的時(shí)候,方便閱讀也是語(yǔ)言設(shè)計(jì)重點(diǎn)考慮的一個(gè)方面。
運(yùn)算符重載在功能實(shí)現(xiàn)方面并沒(méi)有任何影響,但是會(huì)給未來(lái)的自己和其他程序員帶來(lái)極大的便利。
三,operator關(guān)鍵字
operator 是 Dart 的一個(gè)關(guān)鍵字,它和運(yùn)算符(如=)一起使用,表示一個(gè) 運(yùn)算符重載函數(shù),在理解時(shí)可將operator和運(yùn)算符(如operator=)視為一個(gè)函數(shù)名。
使用 operator 重載運(yùn)算符,是 Dar 擴(kuò)展運(yùn)算符功能的方法。使用 operator 擴(kuò)展運(yùn)算符功能的原因如下:
使重載后的運(yùn)算符的使用方法與重載前一致
擴(kuò)展運(yùn)算符的功能只能通過(guò)函數(shù)的方式實(shí)現(xiàn)
對(duì)于 Dart 提供的所有操作符,通常只支持對(duì)于基本數(shù)據(jù)類型和標(biāo)準(zhǔn)庫(kù)中提供的類的操作,而對(duì)于用戶自己定義的類,如果想要通過(guò)該操作符實(shí)現(xiàn)一些基本操作(比如比較大小,判斷是否相等),就需要用戶自己來(lái)定義關(guān)于這個(gè)操作符的具體實(shí)現(xiàn)了。
比如,我們要設(shè)計(jì)一個(gè)名為“person”的類,現(xiàn)在要判斷person類的兩個(gè)對(duì)象p1和p2是否一樣大,我們?cè)O(shè)計(jì)的比較規(guī)則是按照其年齡來(lái)比較,那么,在設(shè)計(jì)person類的時(shí)候,就可以通過(guò)對(duì)操作符“==”進(jìn)行重載,來(lái)使用操作符“==”對(duì)對(duì)象p1和p2
進(jìn)行比較了(根據(jù)前面的分析,實(shí)際上比較的內(nèi)容應(yīng)該是person類中的數(shù)據(jù)成員“age”)。
我們上面說(shuō)的對(duì)操作符“==”進(jìn)行重載,說(shuō)是“重載”,是由于編譯器在實(shí)現(xiàn)操作符“==”功能的時(shí)候,已經(jīng)為我們提供了這個(gè)操作符對(duì)于一些基本數(shù)據(jù)類型的操作支持,只不過(guò)由于現(xiàn)在該操作符所操作的內(nèi)容變成了我們自定義的數(shù)據(jù)類型(如
class),而默認(rèn)情況下,該操作符是不能對(duì)我們自定義的class類型進(jìn)行操作的,所以,就需要我們通過(guò)重載該操作符,給出該操作符操作我們自定義的class類型的方法,從而達(dá)到使用該操作符對(duì)我們自定義的class類型進(jìn)行運(yùn)算的目的。
四,實(shí)現(xiàn)一個(gè)操作符重載的方式通常分為兩種情況
(1)將操作符重載實(shí)現(xiàn)為類的成員函數(shù); (2)操作符重載實(shí)現(xiàn)為非類的成員函數(shù)(即全局函數(shù))
將操作符重載實(shí)現(xiàn)為類的成員函數(shù);
在類體中聲明(定義)需要重載的操作符,聲明方式跟普通的成員函數(shù)一樣,只不過(guò)操作符重載函數(shù)的名字是“關(guān)鍵字 operator +以及緊跟其后的一個(gè) Dart 預(yù)定義的操作符”,樣式如下(person是我們定義的類):
bool operator==(const person& ps)
{
if (this->age == ps.age)
{
return true;
}
return false;
}
示例代碼(operator_test2.cpp)如下:
class Person
{
int age;
public Person(int nAge){
this->age = nAge;
}
bool operator==(Person ps){
if (this.age == ps.age) {
return true;
}
return false;
}
};
int main()
{
Person p1 = new Person(10);
Person p2 = new Person(10);
if (p1 == p2) {
} else {
}
return 0;
}
通過(guò)上述代碼能夠知道:因?yàn)椴僮鞣剌d函數(shù)“operator==”是person類的一個(gè)成員函數(shù),所以對(duì)象p1、p2都可以調(diào)用該函數(shù)。其中的if (p1 == p2)語(yǔ)句,相當(dāng)于對(duì)象p1調(diào)用函數(shù)“operator==”,把對(duì)象p2作為一個(gè)參數(shù)傳遞給該函數(shù),從而實(shí)現(xiàn)了兩個(gè)對(duì)象的比較。
操作符重載實(shí)現(xiàn)為非類的成員函數(shù)(即全局函數(shù))
對(duì)于全局重載操作符,代表左操作數(shù)的參數(shù)必須被顯式指定。
示例代碼如下:
class Person
{
public int age;
};
// 左操作數(shù)的類型必須被顯式指定
// 此處指定的類型為person類
bool operator==(Person p1 ,Person p2)
{
if (p1.age == p2.age)
{
return true;
}
else
{
return false;
}
}
int main()
{
Person p1 = new Person();
Person p2 = new Person();
p1.age = 18;
p2.age = 18;
if (p1 == p2){
}else{
}
return 0;
}
重載后操作符的操作數(shù)至少有一個(gè)是用戶定義類型;
不能違反原來(lái)操作數(shù)的語(yǔ)法規(guī)則;
不能創(chuàng)建新的操作符;
不能重載的操作符包括(以空格分隔):sizeof . .* :: ?: RTTI類型運(yùn)算符
=、()、[]、以及 ->操作符只能被類的成員函數(shù)重載
五,Dart語(yǔ)言的運(yùn)算符重載實(shí)例
第一步創(chuàng)建個(gè)類
class Role{
final String name;
final int accessLevel;
const Role(this.name,this.accessLevel);
}
main()
{
print('hello operator overloading');
}
第二步 通過(guò)函數(shù)實(shí)現(xiàn)Role比較
class Role{
final String name;
final int accessLevel;
const Role(this.name,this.accessLevel);
}
main()
{
var adminRole =new Role('管理員',3);
var reporterRole = new Role('報(bào)告員',2);
var userRole= new Role('用戶',1);
if(adminRole.accessLevel > reporterRole.accessLevel){
print("管理員的權(quán)限大于報(bào)告員");
}
if(reporterRole.accessLevel > userRole.accessLevel){
print("報(bào)告員的權(quán)限大于用戶");
}
}
第三步 重載運(yùn)算符
class Role {
final String name;
final int _accessLevel;
const Role(this.name, this._accessLevel);
bool operator >(Role Other) {
return this._accessLevel > Other._accessLevel;
}
bool operator <(Role Other) {
return this._accessLevel < Other._accessLevel;
}
}
main() {
var adminRole = new Role('管理員', 3);
var reporterRole = new Role('報(bào)告員', 2);
var userRole = new Role('用戶', 1);
if (adminRole > reporterRole) {
print("管理員的權(quán)限大于報(bào)告員");
}
if (reporterRole > userRole) {
print("報(bào)告員的權(quán)限大于用戶");
}
}
總結(jié)
以上是生活随笔為你收集整理的【dart学习】之运算符重载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 淘宝店铺怎么注销保证金能拿回来吗(淘宝店
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?