// В файле заголовка: определение класса:Не копировать массивы символов, функция подкачки оленья кожа компиляции правильно и stringPtr не изменяется
class myString
{
public:
myString(void);
myString(const char *str);
myString(const myString &); //copy constructor
~myString(void); //destructor
void swap(myString &from);
private:
char *stringPtr;
int stringLen;
};
// в CPP файле, определяя их функции-члены
myString::myString(const char *str)
{
stringLen = strlen(str);
stringPtr = new char[stringLen+1];
strcpy(stringPtr,str);
cout << "constructor with parameter called"<<endl;
}
myString::myString(const myString &str)
{
stringPtr = new char[str.stringLen +1];
strcpy(stringPtr,str.stringPtr);
cout << "copyconstructor"<<endl;
}
void myString::swap(myString &from)
{
myString buffer(from);
int lengthBuffer = from.stringLen;
from = new char[stringLen+1];
from.stringLen = stringLen;
strcpy(from.stringPtr, stringPtr);
stringPtr = new char[lengthBuffer+1];
stringLen = lengthBuffer;
strcpy(stringPtr,buffer.stringPtr);
}
так, что вы говорите 'недействительным FUNC (Int & а) {a = 1; } 'не будет изменять? – vava
С дополнительным бонусом, что это безопасно для исключений, связанных с распределением памяти. –
@vava: from = new char [stringLen + 1]; будет компилироваться, но myString не имеет оператора =(), поэтому он не будет. – sharptooth