2012-11-16 18 views
5

sınıf operator+, boğan o const beyan edilmelidir? Ayrıca, atama yapılır çünkü operator= ve operator+= başvuru döndürmek biliyoruz. Peki ya operator+? Uyguladığımda, geçerli nesnenin bir kopyasını almalı, verilen nesneyi buna eklemeli ve bu değeri mi vermeliyim?C++ - Operatör + `const yapmalı mıyım? Ve bir referans döndürüyor mu? o nesne üzerinde herhangi atama yapmaz çünkü

class Point 
{ 
public: 
    int x, int y; 

    Point& operator += (const Point& other) { 
     X += other.x; 
     Y += other.y; 
     return *this; 
    } 

    // The above seems pretty straightforward to me, but what about this?: 
    Point operator + (const Point& other) const { // Should this be const? 
     Point copy; 
     copy.x = x + other.x; 
     copy.y = y + other.y; 
     return copy; 
    } 
}; 

bu operator+ doğru bir uygulama mı: İşte

ben ne var? Ya da dert ya da istenmeyen/tanımlanmamış davranışlara neden olabilecek bir şey var mı? Daha da iyisi

+1

Birçok ayrıntıları burada bulabilirsiniz: http://stackoverflow.com/questions/4421706/operator-overloading – chris

cevap

6

, bunu ücretsiz bir işlev yapmalıdır:

Point operator+(Point lhs, const Point& rhs) { // lhs is a copy 
    lhs += rhs; 
    return lhs; 
} 

Ama üye fonksiyonu olarak bırakırsan bunun sol taraftaki nesne değiştirilmez olarak evet, bu const olmalıdır. bir referans ya da kopyalama dönmek olup ilişkin

, operatör aşırı yükleme için öneriler (int s gibi, yani bunu) gibi temel tip do olup. Bu durumda, iki tamsayı için ek, girişlerden hiçbirine bir başvuru olmayan ayrı bir tam sayı döndürür. Operatör gereksiz yüklenmesine

+0

Ah, görüyorum. Teşekkür ederim. Ayrıca, özgür bir işlev olarak sahip olmanın yararı nedir? –

+1

@BrandonMiller: Simetri türlere göre. senin tipin bir örtük dönüştürme yapıcısı varsa üye işlev sağ taraftaki dönüşümleri yapmak sadece olabilir iken serbest fonksiyonu uygulanması, her iki argüman dönüşümleri sağlayacak, (yani örtülü olarak diğer bazı tip dönüştürülebilir). –

+0

Bazı iyi bilgiler var! Bunu hiç düşünmemiştim. –