fork download
  1. #include <cstring>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. class STR {
  6. public:
  7. STR() : m_str(1, '\0') {} // Empty string -> only a null-terminator
  8.  
  9. STR(const char* str)
  10. : m_str(&str[0], &str[strlen(str) + 1]) // Copy null-terminator as well
  11. {
  12. }
  13.  
  14. std::size_t getSize() const noexcept { return m_str.size() - 1u; }
  15. const char* getData() const { return m_str.data(); }
  16. operator const char*() const { return m_str.data(); }
  17.  
  18. private:
  19. std::vector<char> m_str;
  20. };
  21.  
  22. std::ostream& operator<<(std::ostream& os, const STR& str)
  23. {
  24. if (!str.getData())
  25. return (os << "");
  26. os << str.getData();
  27. return os;
  28. }
  29.  
  30. auto main()->int
  31. {
  32. //Object direct initialization
  33. STR a{"Simple text"};
  34. //Object direct initialization
  35. STR b = "Another text";
  36. STR c = a;
  37. //Empty obj creation
  38. STR d;
  39. std::cout << "d:" << d << '\n';
  40. //Empty object assignment
  41. d = std::move(c);
  42. std::cout << "d:" << d << '\n';
  43. //Existing object assignment
  44. b = d;
  45. std::cout << "b:" << b << '\n';
  46. //Object assigment using const char*
  47. a = "What next";
  48. std::cout << "a:" << a <<'\n';
  49. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
d:
d:Simple text
b:Simple text
a:What next