[ Pretender @ 05.11.2003. 17:43 ] @
SOS

Code:
124:   // creates a new string by adding current
125:   // string to rhs
126:   String String::operator+(const String& rhs)
127:   {
128:      int  totalLen = itsLen + rhs.GetLen();
129:      String temp(totalLen);
130:      int i, j;
131:      for (i = 0; i<itsLen; i++)
132:         temp[i] = itsString[i];
133:      for (j = 0; j<rhs.GetLen(); j++, i++)
134:         temp[i] = rhs[j];
135:      temp[totalLen]='\0';
136:      return temp;
137:   }

Citat:
Because operator+ is not (and can't be) a const function (it changes the object it is called on), attempting to write the following will cause a compile-time error:

String buffer = Edie.GetFirstName() + Edie.GetLastName();

GetFirstName() returns a constant String, and you can't call operator+ on a constant object.
Code:
1:     class Employee

11:       const String & GetFirstName() const 
12:          { return itsFirstName; }

24:    private:
25:       String    itsFirstName;

Zasto ne mozemo da pozovemo operator + , sa konstantnim objektom ?
Kako to ovaj operator menja objekat za koji je pozvan, kada od dva niza (kakva god) pravi NOVI ?


Ovo je razumljivo u slucaju operatora += , koji stvarno menja niz iz kojeg je pozvan, pa je njegov return , modifikovan TAJ niz :
Code:
139:   // changes current string, returns nothing
140:   void String::operator+=(const String& rhs)
141:   {
142:      unsigned short rhsLen = rhs.GetLen();
143:      unsigned short totalLen = itsLen + rhsLen;
144:      String  temp(totalLen);
145:      for (int i = 0; i<itsLen; i++)
146:         temp[i] = itsString[i];
147:      for (int j = 0; j<rhs.GetLen(); j++, i++)
148:         temp[i] = rhs[i-itsLen];
149:      temp[totalLen]='\0';
150:      *this = temp;
151:   }

Ali, kod operatora + , cini se da stvari stoje malo drugacije.


Txx
[ milanche @ 05.11.2003. 20:47 ] @
Obrati paznju:

Operator se poziva 'NA' nekom objektu. U ovom slucaju, kad stringu A hoces
da konkateniras string B, onda NA objektu (stringu) A zoves '+' operator, koji tom istom stringu (A) konkatenira sadrzaj stringa B.

Ako je, medjutim, string A deklarisan kao konstantan, kompajler ce da vristi naglas, jer ako je A konstantan, ne moze mu se nista 'prishivati'. Sve sto je
deklarisano 'const' ne moze da se menja at run-time.
[ Pretender @ 05.11.2003. 22:14 ] @
Uh, da vidimo:

Ovde je, u stvari, pitanje, da li stringovi `sabirci`, posle sabiranja, nastavljaju
da egzistiraju ili ne.
Ako je odgovor NE, onda je jasno ovo oko konstanti, ali nije bas, zasto NE.
[ Cybernoid II @ 05.11.2003. 23:02 ] @
meni ovo radi
Code:
Buffer Buffer::operator+(const Buffer& rhs) const
{
    Buffer temp;
    size_t totalsize=m_size+rhs.m_size; //  ! overflow
    temp.setSize(totalsize);
    memcpy(temp.m_pData,m_pData,m_size);
    memcpy(&((temp.m_pData)[m_size]),rhs.m_pData,rhs.m_size);
    if(temp.m_pData)  
        (temp.m_pData)[totalsize]='\0';
    return temp;
}


......

const Buffer a;
const Buffer b;
Buffer c;
c=a+b;