2013-03-08 20 views
14

Sadece C++ başlıyorum. Atama ve dere operatörünün dönüş türü konusunda biraz kafam karışmış. C++ Primer kitabını takip ediyorum. Çeşitli vesilelerle, yazar ödev operatörünün dönüş türünün sol el işleneni türüne başvurduğunu, ancak daha sonra, dönüş türünün soldaki işlenenin türünü verdiğini söyler. C++ 11 Standard Sec. 5.17, dönüş türünün "sol taraftaki işlenene gönderme yapan değer" olarak tanımlandığı yer.Atama operatörü dönüş tipi nedir?

Benzer şekilde, dereferansın işaret edilen nesneyi veya nesneye yapılan başvuruyu döndürüp döndürmediğini anlayamıyorum.

Bu ifadeler eşdeğer midir? Öyleyse nasıl olacak? Herhangi bir açıklama takdir edilecektir. yani referans olarak

+1

Plz herkesin not alması. tüm cevaplar için teşekkürler ama operatör aşırı yüklenmesi hakkında sormak istemedim. Ben henüz orada değilim, sadece dilde yapılan atama işlemi hakkında soruyordum. – rahul1210

cevap

18

Standart, bir görev operatörünün dönüş türünü doğru olarak tanımlar. Aslında, atama işleminin kendisi dönüş değerine bağlı değil - bu nedenle dönüş türünün anlaşılması kolay değil.

Dönüş tipi zincirleme işlemleri için önemlidir. Aşağıdaki yapıyı düşünün: a = b = c;. Bu a = (b = c)'a eşit olmalıdır, yani ve ba içine atanmalıdır. Bunu a.operator=(b.operator=(c)) olarak yeniden yazınız. a'un doğru şekilde çalışması için b.operator=(c) dönüş türünün iç atama sonucuna referans olması gerekir (kopyayla birlikte çalışacaktır, ancak bu sadece gereksiz bir ek yük olacaktır).

Dereference operatör dönüş tipi iç mantığınıza bağlıdır, gereksinimlerinize uygun şekilde tanımlayın.

+1

"Standart, bir ödev operatörünün dönüş tipini doğru olarak tanımlar" - nasıl? –

+7

@LuchianGrigore, OP'nin aktardığı gibi: * C++ 11 Standart Sec. 5.17, dönüş türünün "sol taraftaki işlenene gönderme yapan değer" olarak tanımlandığı yer. * – SomeWittyUsername

+7

Bu son yorum, yanıtın tamamından daha yararlıdır. –

5

Her ikisi de herhangi bir şey olabilir, ama genellikleoperator = getirileri mevcut nesne,

A& A::operator = (...) 
{ 
    return *this; 
} 

Ve evet, ve "lvalue "sol işlenen türüne başvuru" sol el atıfta işlenen "aynı şey demek.

Dereferans operatörü temel olarak herhangi bir dönüş türüne sahip olabilir. Çoğunlukla programın mantığına bağlıdır, çünkü nesneye bir işaretçiye değil, bir nesneye uygulanan operatörü aşırı yüklüyorsunuz. Genellikle bu akıllı işaretçiler veya yineleyiciler için kullanılır ve bunlar etrafında sarın nesneyi döndürmek edilir: Ben benzer sorunlar gördük

+0

"Soldaki işlenene gönderme yapan değer", "sol el işleneni türüne başvuru" ile aynı anlama gelir. Referans bir değer mi? – rahul1210

+0

@ user2148032 evet, bir referans bir değerdir. Soldaki işlenen, nesnenin kendisidir (çünkü 'x = y', sol el işleneni' x'). –

+0

teşekkürler sanırım ben – rahul1210

1

, ama kullanma

X& X::operator=(const X&); 

kullanmak iyi olurdu sanırım Bu, nesneyi bir zincir atamasında yeniden kullanabileceksiniz.