欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

深度探究C++中的函數(shù)重載的用法

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語言|點(diǎn)擊: 次

C++ 允許同一范圍內(nèi)具有相同名稱的多個(gè)函數(shù)的規(guī)范。這些函數(shù)稱為重載函數(shù),“重載”中對(duì)其進(jìn)行了詳細(xì)介紹。利用重載函數(shù),程序員可以根據(jù)參數(shù)的類型和數(shù)量為函數(shù)提供不同的語義。
例如,采用字符串(或 char *)參數(shù)的 print 函數(shù)執(zhí)行的任務(wù)與采用“雙精度”類型的參數(shù)的函數(shù)執(zhí)行的任務(wù)截然不同。重載允許通用命名并使程序員無需創(chuàng)建名稱,例如 print_sz 或 print_d。下表顯示了 C++ 使用函數(shù)聲明的哪些部分來區(qū)分同一范圍內(nèi)具有相同名稱的函數(shù)組。
重載注意事項(xiàng)

函數(shù)聲明元素 是否用于重載?
函數(shù)返回類型 No
參數(shù)的數(shù)量
參數(shù)的類型
省略號(hào)存在或缺失
typedef 名稱的使用
未指定的數(shù)組邊界
const 或 volatile(見下文)

雖然可以根據(jù)返回類型區(qū)分函數(shù),但是無法在此基礎(chǔ)上對(duì)它們進(jìn)行重載。僅當(dāng) Const 或 volatile 在類中用于應(yīng)用于類的 this 指針(而不是函數(shù)的返回類型)時(shí),它們才用作重載的基礎(chǔ)。換言之,僅當(dāng) const 或 volatile 關(guān)鍵字遵循聲明中函數(shù)的參數(shù)列表時(shí),重載才適用。
以下示例闡述如何使用重載。

// function_overloading.cpp
// compile with: /EHsc
#include <iostream>
#include <math.h>

// Prototype three print functions.
int print( char *s );         // Print a string.
int print( double dvalue );      // Print a double.
int print( double dvalue, int prec ); // Print a double with a
// given precision.
using namespace std;
int main( int argc, char *argv[] )
{
const double d = 893094.2987;
if( argc < 2 )
  {
// These calls to print invoke print( char *s ).
print( "This program requires one argument." );
print( "The argument specifies the number of" );
print( "digits precision for the second number" );
print( "printed." );
exit(0);
  }

// Invoke print( double dvalue ).
print( d );

// Invoke print( double dvalue, int prec ).
print( d, atoi( argv[1] ) );
}

// Print a string.
int print( char *s )
{
cout << s << endl;
return cout.good();
}

// Print a double in default precision.
int print( double dvalue )
{
cout << dvalue << endl;
return cout.good();
}

// Print a double in specified precision.
// Positive numbers for precision indicate how many digits
// precision after the decimal point to show. Negative
// numbers for precision indicate where to round the number
// to the left of the decimal point.
int print( double dvalue, int prec )
{
// Use table-lookup for rounding/truncation.
static const double rgPow10[] = { 
10E-7, 10E-6, 10E-5, 10E-4, 10E-3, 10E-2, 10E-1, 10E0,
10E1, 10E2, 10E3, 10E4, 10E5, 10E6
  };
const int iPowZero = 6;
// If precision out of range, just print the number.
if( prec < -6 || prec > 7 )
return print( dvalue );
// Scale, truncate, then rescale.
dvalue = floor( dvalue / rgPow10[iPowZero - prec] ) *
rgPow10[iPowZero - prec];
cout << dvalue << endl;
return cout.good();
}

前面的代碼演示了文件范圍內(nèi)的 print 函數(shù)重載。
默認(rèn)參數(shù)不被視為函數(shù)類型的一部分。因此,它不用于選擇重載函數(shù)。僅在默認(rèn)參數(shù)上存在差異的兩個(gè)函數(shù)被視為多個(gè)定義而不是重載函數(shù)。
不能為重載運(yùn)算符提供默認(rèn)參數(shù)。
參數(shù)匹配
選擇重載函數(shù)以實(shí)現(xiàn)當(dāng)前范圍內(nèi)的函數(shù)聲明與函數(shù)調(diào)用中提供的參數(shù)的最佳匹配。如果找到合適的函數(shù),則調(diào)用該函數(shù)。此上下文中的“Suitable”具有下列含義之一:

  • 找到完全匹配項(xiàng)。
  • 已執(zhí)行不重要的轉(zhuǎn)換。
  • 已執(zhí)行整型提升。
  • 已存在到所需參數(shù)類型的標(biāo)準(zhǔn)轉(zhuǎn)換。
  • 已存在到所需參數(shù)類型的用戶定義的轉(zhuǎn)換(轉(zhuǎn)換運(yùn)算符或構(gòu)造函數(shù))。
  • 已找到省略號(hào)所表示的參數(shù)。

編譯器為每個(gè)參數(shù)創(chuàng)建一組候選函數(shù)。候選函數(shù)是這樣一種函數(shù),其中的實(shí)參可以轉(zhuǎn)換為形參的類型。

為每個(gè)參數(shù)生成一組“最佳匹配函數(shù)”,并且所選函數(shù)是所有集的交集。如果交集包含多個(gè)函數(shù),則重載是不明確的并會(huì)生成錯(cuò)誤。對(duì)于至少一個(gè)參數(shù)而言,最終選擇的函數(shù)始終是比組中的所有其他函數(shù)更好的匹配項(xiàng)。如果不是這樣(如果沒有清晰的勝者),則函數(shù)調(diào)用會(huì)生成錯(cuò)誤。
考慮下面的聲明(針對(duì)下面的討論中的標(biāo)識(shí),將函數(shù)標(biāo)記為 Variant 1、Variant 2 和 Variant 3):

Fraction &Add( Fraction &f, long l );    // Variant 1
Fraction &Add( long l, Fraction &f );    // Variant 2
Fraction &Add( Fraction &f, Fraction &f ); // Variant 3

Fraction F1, F2;

請(qǐng)考慮下列語句:

F1 = Add( F2, 23 );

前面的語句生成兩個(gè)集:

集 1:其第一個(gè)參數(shù)的類型為 Fraction 的候選函數(shù) 集 2:其第二個(gè)參數(shù)可轉(zhuǎn)換為類型 int 的候選函數(shù)
Variant 1 Variant 1(可使用標(biāo)準(zhǔn)轉(zhuǎn)換將 int 轉(zhuǎn)換為 long)
Variant 3

集 2 中的函數(shù)是具有從實(shí)參類型到形參類型的隱式轉(zhuǎn)換的函數(shù),在這些函數(shù)中,有一種函數(shù)的從實(shí)參類型到其形參類型的轉(zhuǎn)換的“成本”是最低的。
這兩個(gè)集的交集為 Variant 1。不明確的函數(shù)調(diào)用的示例為:

F1 = Add( 3, 6 );

前面的函數(shù)調(diào)用生成以下集:

集 1:其第一個(gè)參數(shù)的類型為 int 的候選函數(shù) 集 2:其第二個(gè)參數(shù)的類型為 int 的候選函數(shù)
Variant 2(可使用標(biāo)準(zhǔn)轉(zhuǎn)換將 int 轉(zhuǎn)換為 long) Variant 1(可使用標(biāo)準(zhǔn)轉(zhuǎn)換將 int 轉(zhuǎn)換為 long)

請(qǐng)注意,這兩個(gè)集之間的交集為空。因此,編譯器會(huì)生成錯(cuò)誤消息。
對(duì)于參數(shù)匹配,具有 n 個(gè)默認(rèn)參數(shù)的函數(shù)將視為 n+1 個(gè)單獨(dú)函數(shù),并且每個(gè)函數(shù)均具有不同數(shù)量的參數(shù)。
省略號(hào) (...) 用作通配符;它與任何實(shí)參匹配。如果您未極其謹(jǐn)慎地設(shè)計(jì)重載函數(shù)集,這可能導(dǎo)致產(chǎn)生許多不明確的集。
注意
重載函數(shù)的多義性無法確定,直到遇到函數(shù)調(diào)用。此時(shí),將為函數(shù)調(diào)用中的每個(gè)參數(shù)生成集,并且可以確定是否存在明確的重載。這意味著,多義性可保持在您的代碼中,直到它們由特定函數(shù)調(diào)用引發(fā)。
參數(shù)類型差異
重載函數(shù)區(qū)分使用不同的初始值設(shè)定項(xiàng)的參數(shù)類型。因此,對(duì)于重載而言,給定類型的參數(shù)和對(duì)該類型的引用將視為相同。由于它們采用相同的初始值設(shè)定項(xiàng),因此它們被視為是相同的。例如,max( double, double ) 被視為與 max( double &, double & ) 相同。聲明兩個(gè)此類函數(shù)會(huì)導(dǎo)致錯(cuò)誤。
出于同一原因,對(duì)由 const 或 volatile 修改的類型的函數(shù)參數(shù)(出于重載的目的)的處理方式與基類沒有什么不同。
但是,函數(shù)重載機(jī)制可以區(qū)分由 const 和 volatile 限定的引用和對(duì)基類型的引用。此方法可以編寫諸如以下內(nèi)容的代碼:

// argument_type_differences.cpp
// compile with: /EHsc /W3
// C4521 expected
#include <iostream>

using namespace std;
class Over {
public:
  Over() { cout << "Over default constructor\n"; }
  Over( Over &o ) { cout << "Over&\n"; }
  Over( const Over &co ) { cout << "const Over&\n"; }
  Over( volatile Over &vo ) { cout << "volatile Over&\n"; }
};

int main() {
  Over o1;      // Calls default constructor.
  Over o2( o1 );   // Calls Over( Over& ).
  const Over o3;   // Calls default constructor.
  Over o4( o3 );   // Calls Over( const Over& ).
  volatile Over o5;  // Calls default constructor.
  Over o6( o5 );   // Calls Over( volatile Over& ).
}

輸出

Over default constructor
Over&
Over default constructor
const Over&
Over default constructor
volatile Over&

指向 const 和 volatile 對(duì)象的指針也被認(rèn)為和指向基類型的指針(以重載為目的)不同。
參數(shù)匹配和轉(zhuǎn)換
當(dāng)編譯器嘗試根據(jù)函數(shù)聲明中的參數(shù)匹配實(shí)際參數(shù)時(shí),如果未找到任何確切匹配項(xiàng),它可以提供標(biāo)準(zhǔn)轉(zhuǎn)換或用戶定義的轉(zhuǎn)換來獲取正確類型。轉(zhuǎn)換的應(yīng)用程序受這些規(guī)則的限制:
不考慮包含多個(gè)用戶定義的轉(zhuǎn)換的轉(zhuǎn)換序列。
不考慮可通過刪除中間轉(zhuǎn)換來縮短的轉(zhuǎn)換序列。
最終的轉(zhuǎn)換序列(如果有)稱為最佳匹配序列??赏ㄟ^多種方式使用標(biāo)準(zhǔn)轉(zhuǎn)換將類型 int 的對(duì)象轉(zhuǎn)換為類型unsigned long 的對(duì)象(如標(biāo)準(zhǔn)轉(zhuǎn)換中所述):

  • 從 int 轉(zhuǎn)換為 long,然后從 long 轉(zhuǎn)換為 unsigned long。
  • 從 int 轉(zhuǎn)換為 unsigned long。

第一個(gè)序列(盡管它實(shí)現(xiàn)了所需目標(biāo))不是最佳匹配序列 - 存在一個(gè)較短的序列。

下表顯示了一組稱為常用轉(zhuǎn)換的轉(zhuǎn)換,這些轉(zhuǎn)換對(duì)確定哪個(gè)序列是最佳匹配項(xiàng)有一定的限制。該表后面的列表中討論了常用轉(zhuǎn)換影響序列選擇的實(shí)例。
常用轉(zhuǎn)換

從類型轉(zhuǎn)換 轉(zhuǎn)換為類型
type-name type-name &
type-name & type-name
type-name [ ] type-name*
type-name ( argument-list ) ( *type-name ) ( argument-list )
type-name const type-name
type-name volatile type-name
type-name* const type-name*
type-name* volatile type-name*

在其中嘗試轉(zhuǎn)換的序列如下:
完全匹配。用于調(diào)用函數(shù)的類型與函數(shù)原型中聲明的類型之間的完全匹配始終是最佳匹配。常用轉(zhuǎn)換的序列將歸類為完全匹配。但是,不進(jìn)行任何轉(zhuǎn)換的序列被視為比進(jìn)行轉(zhuǎn)換的序列更佳:

  • 從指針,到指向 const(type* 指向 consttype*)的指針。
  • 從指針,到指向 volatile(type* 指向 volatiletype*)的指針。
  • 從引用,到對(duì) const(type & 到 const type &)的引用。
  • 從引用,到對(duì) volatile(type & 到 volatile type &)的引用。

使用提升的匹配。未歸類為僅包含整型提升、從 float 到 double 的轉(zhuǎn)換以及常用轉(zhuǎn)換的完全匹配的任何序列將被歸類為使用提升的匹配。盡管比不上完全匹配,但使用提升的匹配仍優(yōu)于使用標(biāo)準(zhǔn)轉(zhuǎn)換的匹配。

使用標(biāo)準(zhǔn)轉(zhuǎn)換的匹配。未歸類為完全匹配或僅包含標(biāo)準(zhǔn)轉(zhuǎn)換和常用轉(zhuǎn)換的使用提升的匹配的序列將歸類為使用標(biāo)準(zhǔn)轉(zhuǎn)換的匹配。在此類別中,以下規(guī)則將適用:
從指向派生類的指針到指向直接或間接基類的指針的轉(zhuǎn)換優(yōu)于到 void * 或 const void * 的轉(zhuǎn)換。
從指向派生類的指針到指向基類的指針的轉(zhuǎn)換會(huì)產(chǎn)生一個(gè)到直接基類的更好匹配。假定類層次結(jié)構(gòu)如下圖所示。

演示首選轉(zhuǎn)換的關(guān)系圖
從 D* 類型到 C* 類型的轉(zhuǎn)換優(yōu)于從 D* 類型到 B* 類型的轉(zhuǎn)換。同樣,從 D* 類型到 B* 類型的轉(zhuǎn)換優(yōu)于從 D* 類型到 A* 類型的轉(zhuǎn)換。
此同一規(guī)則適用于引用轉(zhuǎn)換。從 D& 類型到 C& 類型的轉(zhuǎn)換優(yōu)于從 D& 類型到 B& 類型的轉(zhuǎn)換等。
此同一規(guī)則適用于指向成員的指針轉(zhuǎn)換。從 T D::* 類型到 T C::* 類型的轉(zhuǎn)換優(yōu)于從 T D::* 類型到 T B::* 類型的轉(zhuǎn)換等(其中,T 是該成員的類型)。
前面的規(guī)則僅沿派生的給定路徑應(yīng)用??紤]下圖中顯示的關(guān)系圖。

演示首選轉(zhuǎn)換的多繼承關(guān)系圖
從 C* 類型到 B* 類型的轉(zhuǎn)換優(yōu)于從 C* 類型到 A* 類型的轉(zhuǎn)換。原因是它們位于同一個(gè)路徑上,且 B* 更為接近。但是,從 C* 類型到 D* 類型的轉(zhuǎn)換不優(yōu)于到 A* 類型的轉(zhuǎn)換;沒有首選項(xiàng),因?yàn)檫@些轉(zhuǎn)換遵循不同的路徑。
使用用戶定義的轉(zhuǎn)換的匹配。此序列不能歸類為完全匹配、使用提升的匹配或使用標(biāo)準(zhǔn)轉(zhuǎn)換的匹配。序列必須僅包含用戶定義的轉(zhuǎn)換、標(biāo)準(zhǔn)轉(zhuǎn)換或要?dú)w類為使用用戶定義的轉(zhuǎn)換的匹配的常用轉(zhuǎn)換。使用用戶定義的轉(zhuǎn)換的匹配被認(rèn)為優(yōu)于使用省略號(hào)的匹配,但比不上使用標(biāo)準(zhǔn)轉(zhuǎn)換的匹配。
使用省略號(hào)的匹配。與聲明中的省略號(hào)匹配的任何序列將歸類為使用省略號(hào)的匹配。這被視為最弱匹配。
如果內(nèi)置提升或轉(zhuǎn)換不存在,則用戶定義的轉(zhuǎn)換將適用?;趯⑵ヅ涞膮?shù)的類型選擇這些轉(zhuǎn)換??紤]下列代碼:

// argument_matching1.cpp
class UDC
{
public:
  operator int()
  {
   return 0;
  }
  operator long();
};

void Print( int i )
{
};

UDC udc;

int main()
{
  Print( udc );
}

類 UDC 的可用的用戶定義的轉(zhuǎn)換來自 int 類型和 long 類型。因此,編譯器會(huì)考慮針對(duì)將匹配的對(duì)象類型的轉(zhuǎn)換:UDC。到 int 的轉(zhuǎn)換已存在且已被選中。
在匹配參數(shù)的過程中,標(biāo)準(zhǔn)轉(zhuǎn)換可應(yīng)用于參數(shù)和用戶定義的轉(zhuǎn)換的結(jié)果。因此,下面的代碼將適用:

void LogToFile( long l );
...
UDC udc;
LogToFile( udc );

在前面的示例中,將調(diào)用用戶定義的轉(zhuǎn)換 operator long 以將 udc 轉(zhuǎn)換為類型 long。如果未定義到 long 類型的用戶定義的轉(zhuǎn)換,則按如下所示繼續(xù)轉(zhuǎn)換:使用用戶定義的轉(zhuǎn)換將 UDC 類型轉(zhuǎn)換為 int 類型。將應(yīng)用從 int 類型到 long 類型的標(biāo)準(zhǔn)轉(zhuǎn)換以匹配聲明中的參數(shù)。
如果需要任何用戶定義的轉(zhuǎn)換來匹配參數(shù),則在計(jì)算最佳匹配時(shí)不會(huì)使用標(biāo)準(zhǔn)轉(zhuǎn)換。即使多個(gè)候選函數(shù)需要用戶定義的轉(zhuǎn)換也是如此;在這種情況下,這些函數(shù)被認(rèn)為是相等的。例如:

// argument_matching2.cpp
// C2668 expected
class UDC1
{
public:
  UDC1( int ); // User-defined conversion from int.
};

class UDC2
{
public:
  UDC2( long ); // User-defined conversion from long.
};

void Func( UDC1 );
void Func( UDC2 );

int main()
{
  Func( 1 );
}

Func 的兩個(gè)版本都需要用戶定義的轉(zhuǎn)換以將類型 int 轉(zhuǎn)換為類類型參數(shù)。可能的轉(zhuǎn)換包括:

  • 從 int 類型轉(zhuǎn)換到 UDC1 類型(用戶定義的轉(zhuǎn)換)。
  • 從 int 類型轉(zhuǎn)換到 long 類型;然后轉(zhuǎn)換為 UDC2 類型(一個(gè)兩步轉(zhuǎn)換)。

即使其中的第二個(gè)轉(zhuǎn)換需要標(biāo)準(zhǔn)轉(zhuǎn)換以及用戶定義的轉(zhuǎn)換,這兩個(gè)轉(zhuǎn)換仍被視為相等。

注意
用戶定義的轉(zhuǎn)換被認(rèn)為是通過構(gòu)造函數(shù)的轉(zhuǎn)換或通過初始化的轉(zhuǎn)換(轉(zhuǎn)換函數(shù))。在考慮最佳匹配時(shí),兩個(gè)方法被認(rèn)為是相等的。
參數(shù)匹配和 this 指針
處理類成員函數(shù)的方式各不相同,具體取決于它們是否已被聲明為 static。由于非靜態(tài)函數(shù)具有提供 this 指針的隱式參數(shù),因此將非靜態(tài)函數(shù)視為比靜態(tài)函數(shù)多一個(gè)參數(shù);否則,將以相同的方式聲明這些函數(shù)。
這些非靜態(tài)成員函數(shù)要求隱含的 this 指針與通過其調(diào)用函數(shù)的對(duì)象類型匹配,或者對(duì)于重載運(yùn)算符,它們要求第一個(gè)參數(shù)與該運(yùn)算符應(yīng)用于的對(duì)象匹配。

與重載函數(shù)中的其他參數(shù)不同,當(dāng)嘗試匹配 this 指針參數(shù)時(shí),不會(huì)引入臨時(shí)對(duì)象,且不會(huì)嘗試轉(zhuǎn)換。
當(dāng) – > 成員選擇運(yùn)算符用于訪問成員函數(shù)時(shí),this 指針參數(shù)具有 class-name* const 的類型。如果將成員聲明為 const 或 volatile,則類型分別為 const class-name* const 和 volatile class-name * const。
. 成員選擇運(yùn)算符以相同的方式工作,只不過隱式 & (address-of) 運(yùn)算符將成為對(duì)象名稱的前綴。下面的示例演示了此工作原理:

// Expression encountered in code
obj.name

// How the compiler treats it
(&obj)->name

處理 –>* 和 .*(指向成員的指針)運(yùn)算符的左操作數(shù)的方式與處理與參數(shù)匹配相關(guān)的 . 和 –>(成員選擇)運(yùn)算符的方式相同。
限制
多個(gè)限制管理可接受的重載函數(shù)集:

  • 重載函數(shù)集內(nèi)的任意兩個(gè)函數(shù)必須具有不同的參數(shù)列表。
  • 僅基于返回類型重載具有相同類型的參數(shù)列表的函數(shù)是錯(cuò)誤的。

不能只根據(jù)一個(gè)靜態(tài)類型和一個(gè)非靜態(tài)類型來重載成員函數(shù)。
typedef 聲明不定義新類型;它們引入現(xiàn)有類型的同義詞。它們不影響重載機(jī)制??紤]下列代碼:

typedef char * PSTR;

void Print( char *szToPrint );
void Print( PSTR szToPrint );

前面的兩個(gè)函數(shù)具有相同的參數(shù)列表。 PSTR 是類型 char * 的同義詞。在成員范圍內(nèi),此代碼生成錯(cuò)誤。
枚舉類型是不同的類型,并且可用于區(qū)分重載函數(shù)。
就區(qū)分重載函數(shù)而言,類型“array of”和“pointer to”是等效的。此情況僅適用于單維度數(shù)組。因此,以下重載函數(shù)會(huì)發(fā)生沖突并生成錯(cuò)誤消息:

void Print( char *szToPrint );
void Print( char szToPrint[] );

對(duì)于多維數(shù)組,第二個(gè)和后續(xù)維度被視為類型的一部分。因此,它們可用來區(qū)分重載函數(shù):

void Print( char szToPrint[] );
void Print( char szToPrint[][7] );
void Print( char szToPrint[][9][42] );

聲明匹配
同一范圍內(nèi)具有同一名稱的任何兩個(gè)函數(shù)聲明都可以引用同一函數(shù)或重載的兩個(gè)不同的函數(shù)。如果聲明的參數(shù)列表包含等效類型的參數(shù)(如上一節(jié)所述),函數(shù)聲明將引用同一函數(shù)。否則,它們將引用使用重載選擇的兩個(gè)不同的函數(shù)。
需要嚴(yán)格遵守類范圍;因此,在基類中聲明的函數(shù)與在派生類中聲明的函數(shù)不在同一范圍內(nèi)。如果使用與基類中的函數(shù)相同的名稱聲明派生類中的函數(shù),則該派生類函數(shù)會(huì)隱藏基類函數(shù),而不是導(dǎo)致重載。
需要嚴(yán)格遵守塊范圍;因此,在文件范圍中聲明的函數(shù)與在本地聲明的函數(shù)不在同一范圍內(nèi)。如果在本地聲明的函數(shù)與在文件范圍中聲明的函數(shù)具有相同名稱,則在本地聲明的函數(shù)將隱藏文件范圍內(nèi)的函數(shù)而不是導(dǎo)致重載。例如:

// declaration_matching1.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
void func( int i )
{
  cout << "Called file-scoped func : " << i << endl;
}

void func( char *sz )
{
  cout << "Called locally declared func : " << sz << endl;
}

int main()
{
  // Declare func local to main.
  extern void func( char *sz );

  func( 3 );  // C2664 Error. func( int ) is hidden.
  func( "s" );
}

前面的代碼顯示函數(shù) func 中的兩個(gè)定義。由于 char * 語句,采用 main 類型的參數(shù)的定義是 extern 的本地定義。因此,采用 int 類型的參數(shù)的定義被隱藏,而對(duì) func 的第一次調(diào)用出錯(cuò)。
對(duì)于重載的成員函數(shù),不同版本的函數(shù)可能獲得不同的訪問權(quán)限。它們?nèi)员灰暈樵诜忾]類的范圍內(nèi),因此是重載函數(shù)。請(qǐng)考慮下面的代碼,其中的成員函數(shù) Deposit 將重載;一個(gè)版本是公共的,另一個(gè)版本是私有的。
此示例的目的是提供一個(gè) Account 類,其中需要正確的密碼來執(zhí)行存款。使用重載可完成此操作。
請(qǐng)注意,對(duì) Deposit 中的 Account::Deposit 的調(diào)用將調(diào)用私有成員函數(shù)。此調(diào)用是正確的,因?yàn)?Account::Deposit 是成員函數(shù),因而可以訪問類的私有成員。

// declaration_matching2.cpp
class Account
{
public:
  Account()
  {
  }
  double Deposit( double dAmount, char *szPassword );

private:
  double Deposit( double dAmount )
  {
   return 0.0;
  }
  int Validate( char *szPassword )
  {
   return 0;
  }

};

int main()
{
  // Allocate a new object of type Account.
  Account *pAcct = new Account;

  // Deposit $57.22. Error: calls a private function.
  // pAcct->Deposit( 57.22 );

  // Deposit $57.22 and supply a password. OK: calls a
  // public function.
  pAcct->Deposit( 52.77, "pswd" );
}

double Account::Deposit( double dAmount, char *szPassword )
{
  if ( Validate( szPassword ) )
   return Deposit( dAmount );
  else
   return 0.0;
}

上一篇:詳解C++成員函數(shù)的override和final說明符的用法

欄    目:C語言

下一篇:詳解C++中const_cast與reinterpret_cast運(yùn)算符的用法

本文標(biāo)題:深度探究C++中的函數(shù)重載的用法

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2554.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有