2010-06-16 12 views
8

olmadan işlev mümkündür Geçti parametrelerin türü, değişen parametre sayısı, dönüş türü vb. Gibi çeşitli aşırı yükleme yöntemlerine rastladım. Aşağıdaki iki işlevi takip eden bir fonksiyonu aşırı yükleyiniz. Lütfen aşağıdaki iki işlevi yerine getiriniz.Fonksiyonun iki versiyonu ile yüklenebilir, sabit üye fonksiyonu ve const

+0

Hangi dili kullanıyorsunuz? Doğru dikkati çekmek istiyorsanız soruyu dil ile etiketlemelisiniz. – Oded

+0

edited, dili kullanıyorum C++ –

+0

C++ cinsinden geri dönüş türüne aşırı yükleyemezsiniz. – Job

cevap

9

Evet yapabilirsiniz. Eğer

MyClass m; 
m.doSomething(); 

varsa

const olmayan versiyonu çağrılır. Hepsini aç Hepsini kapa Bu Sayfada Belirtiler const sürümü çağrılacak.

2

Evet, bunu yapabilirsiniz. (@Job, bu geri dönüş türünde aşırı yüklenme değil, bu çağrılan sınıf örneğinin 'const-state' kısmında aşırı yüktür)

Örnek const ise, ikinci varyant çağrılacaksa İlk denir. pratik kullanım yöntemi const örneğinde denir, muhtemelen de dönmek istiyorum olmasıdır "const dize &" (örneğin sınıfın bir üyesi bir başvuru dönerseniz) bunun gibi,:

//function which can modify member 
String& MyClass::doSomething(); 

//constant member function 
const String& MyClass::doSomething() const; 
+0

Sorunun dönüş türünde aşırı yüklenmeyle ilgili olmadığını biliyorum, ancak sorusuna, bunun mümkün olduğunu düşündüğünden bahsetmişti. – Job

1

Bu yalnızca yaygın olarak kullanılan bir deyim olarak mümkün değildir. Örneğin, bir işlevin const sürümü çağrılırsa, bir sonucun salt okunur sürümüne yapılan bir başvuru döndürülür. Örneğin,Ancak, const sürümü kullanılmazsa, alıcının değiştirebileceği bir kopya oluşturulur ve döndürülür. Bir const versiyonunu uygulayarak, gerekli olmayacağını bildiğimizde inşaatı yapmaktan kurtulduk.

örn:

3

bu anlamak kolay şekilde, 0 parametre olarak üzerinde yöntemini çağırarak nesnenin düşünmektir bir fantezi olarak

String& MyClass::doSomething(); 
MyClass mc; 
mc.doSomething(); 

düşünün, derleyici desteklenen yolu bunu yapmanın: constness dayalı aşırı yüklenmesini, Şimdi

String& MyClass_doSomething(MyClass *this); 
MyClass mc; 
MyClass_doSomething(&mc); 

parametre türlerine göre aşırı sadece özel bir durumdur:

String& MyClass::doSomething(); 
String& MyClass::doSomething() const; 

düşüncesi ile böyle bir şey olarak yapabilirsiniz: Bu üzerindeki yararı gelince

String& MyClass_doSomething(MyClass *this); 
String& MyClass_doSomething(const MyClass *this); 

, en kolay örnekler çeşitli std:: konteynerlerin üzerinde begin ve end yöntemlerdir. vector/string/n olmayan bir şey varsa ve begin() numaralı telefonu çağırırsanız, orijinal kabın içeriğini değiştirmek için kullanılabilecek bir iterator geri alırsınız.Açıkça, bu, const işaretli kaplar için izin verilmemelidir, bu nedenle, const/const olmayan aşırı yüklenme sayesinde, bir const vektöründe begin() numaralı çağrı, vektörün içeriğini okumak için kullanılan, ancak değiştirilemeyen bir const_iterator döndürür.

örn.

string nc = "Hello world"; 
for (string::iterator iString = nc.begin(); iString != nc.end(); ++iString) 
{ 
    cout << *iString;; // legal to read 
    *iString = toupper(*iString); // legal to write 

} 

const string c = "Hello world again"; 
for (string::const_iterator iString = c.begin(); iString != c.end(); ++iString) 
{ 
    cout << *iString;; // legal to read 
    // *iString = toupper(*iString); // Writing is illegal 
} 

Döndürme türüne göre aşırı yükleme yapmak için, C++ içinde yapamazsınız. Ancak, simulate it oldukça iyi bir şekilde yapabilirsiniz.

2

Yineleyici bu şekilde kullanılır. Bir const yineleyici yanı sıra bir const yineleyici var.

İlgili konular