#include <utility> |
#include <string.h> |
|
class String |
{ |
public : |
String() |
: data_( new char [1]) |
{ |
*data_ = '\0' ; |
} |
|
String( const char * str) |
: data_( new char [ strlen (str) + 1]) |
{ |
strcpy (data_, str); |
} |
|
String( const String& rhs) |
: data_( new char [rhs.size() + 1]) |
{ |
strcpy (data_, rhs.c_str()); |
} |
/* Delegate constructor in C++11 |
String(const String& rhs) |
: String(rhs.data_) |
{ |
} |
*/ |
|
~String() |
{ |
delete [] data_; |
} |
|
/* Traditional: |
String& operator=(const String& rhs) |
{ |
String tmp(rhs); |
swap(tmp); |
return *this; |
} |
*/ |
String& operator=(String rhs) // yes, pass-by-value |
{ |
swap(rhs); |
return * this ; |
} |
|
// C++ 11 |
String(String&& rhs) |
: data_(rhs.data_) |
{ |
rhs.data_ = nullptr; |
} |
|
String& operator=(String&& rhs) |
{ |
swap(rhs); |
return * this ; |
} |
|
// Accessors |
|
size_t size() const |
{ |
return strlen (data_); |
} |
|
const char * c_str() const |
{ |
return data_; |
} |
|
void swap(String& rhs) |
{ |
std::swap(data_, rhs.data_); |
} |
|
private : |
char * data_; |
}; |