zoukankan      html  css  js  c++  java
  • auto | auto& | auto&&

    【1】应用示例

      1 #include <vector>
      2 #include <cassert>
      3 #include <string>
      4 #include <iostream>
      5 using namespace std;
      6 
      7 class String
      8 {
      9 public:
     10     String();
     11     String(int n, char c);
     12     String(const char* source);
     13     String(const String& s);
     14     String(String&& s);
     15     String& operator=(char* s);
     16     String& operator=(const String& s);
     17     String& operator=(String&& s);
     18     ~String();
     19 
     20     char& operator[](int i);
     21     const char& operator[](int i) const;
     22     String& operator+=(const String& s);
     23     String& operator+=(const char* s);
     24 
     25     friend ostream& operator<<(ostream& out, String& s);
     26     friend ostream& operator<<(ostream& out, const String& s);
     27     friend istream& operator>>(istream& in, String& s);
     28 
     29     friend bool operator<(const String& left, const String& right);
     30     friend bool operator>(const String& left, const String& right);
     31     friend bool operator==(const String& left, const String& right);
     32     friend bool operator!=(const String& left, const String& right);
     33 
     34     int getSize() const;
     35     void setSize(int nSize);
     36     char* getData() const;
     37     void setData(char* pData);
     38 
     39 private:
     40     void init();
     41 
     42 private:
     43     int m_size;
     44     char* m_data;
     45 };
     46 
     47 void String::init()
     48 {
     49     m_data = new char[1];
     50     assert(m_data != NULL);
     51     *m_data = '';
     52     m_size = 0;
     53 }
     54 
     55 String::String()
     56 {
     57     cout << "call String()" << endl;
     58     init();
     59 }
     60 
     61 String::String(int n, char c)
     62 {
     63     cout << "call String(int n, char c)" << endl;
     64     m_data = new char[n + 1];
     65     assert(m_data != NULL);
     66     m_size = n;
     67     char* temp = m_data;
     68     while (n--)
     69     {
     70         *temp++ = c;
     71     }
     72     *temp = '';
     73 }
     74 
     75 String::String(const char* source)
     76 {
     77     cout << "call String(const char* source)" << endl;
     78     if (NULL == source)
     79     {
     80         init();
     81     }
     82     else
     83     {
     84         m_size = strlen(source);
     85         m_data = new char[m_size + 1];
     86         assert(m_data != NULL);
     87         strcpy_s(m_data, (m_size + 1), source);
     88     }
     89 }
     90 String::String(const String& s)
     91 {
     92     cout << "call String(const String& s)" << endl;
     93     m_data = new char[s.m_size + 1];
     94     assert(m_data != NULL);
     95     strcpy_s(m_data, (s.m_size + 1), s.m_data);
     96     m_size = s.m_size;
     97 }
     98 
     99 String::String(String&& s)
    100 {
    101     cout << "call move ctor" << endl;
    102     m_data = s.getData();
    103     m_size = s.getSize();
    104     s.setData(NULL);
    105     s.setSize(0);
    106 }
    107 
    108 String& String::operator=(char* s)
    109 {
    110     cout << "call operator=(char* s)" << endl;
    111 
    112     if (m_data != NULL)
    113     {
    114         delete []m_data;
    115     }
    116     m_size = strlen(s);
    117     m_data = new char[m_size + 1];
    118     assert(m_data != NULL);
    119     strcpy_s(m_data, (m_size + 1), s);
    120     return (*this);
    121 }
    122 
    123 String& String::operator=(const String& s)
    124 {
    125     cout << "call operator=(const String& s)" << endl;
    126 
    127     if (this == &s)
    128     {
    129         return *this;
    130     }
    131     if (m_data != NULL)
    132     {
    133         delete []m_data;
    134     }
    135     m_size = strlen(s.m_data);
    136     m_data = new char[m_size + 1];
    137     assert(m_data != NULL);
    138     strcpy_s(m_data, (m_size + 1), s.m_data);
    139     return (*this);
    140 }
    141 
    142 String& String::operator=(String&& s)
    143 {
    144     cout << "call move operator=" << endl;
    145 
    146     if (this == &s)
    147     {
    148         return (*this);
    149     }
    150     if (m_data != NULL)
    151     {
    152         delete[]m_data;
    153     }
    154     m_data = s.getData();
    155     m_size = s.getSize();
    156     s.setData(NULL);
    157     s.setSize(0);
    158     return (*this);
    159 }
    160 
    161 String::~String()
    162 {
    163     if (m_data != NULL)
    164     {
    165         delete[]m_data;
    166         m_data = NULL;
    167         m_size = 0;
    168     }
    169 }
    170 
    171 char& String::operator[](int i)
    172 {
    173     return m_data[i];
    174 }
    175 
    176 const char& String::operator[](int i) const
    177 {
    178     return m_data[i];
    179 }
    180 
    181 String& String::operator+=(const String& s)
    182 {
    183     int len = m_size + s.m_size + 1;
    184     char* pTemp = m_data;
    185     m_data = new char[len];
    186     assert(m_data != NULL);
    187     strcpy_s(m_data, (m_size + 1), pTemp);
    188     strcat_s(m_data, len, s.m_data);
    189     m_size = len - 1;
    190     delete[]pTemp;
    191     return (*this);
    192 }
    193 
    194 String& String::operator+=(const char* s)
    195 {
    196     if (NULL == s)
    197     {
    198         return (*this);
    199     }
    200     int len = m_size + strlen(s) + 1;
    201     char* pTemp = m_data;
    202     m_data = new char[len];
    203     assert(m_data != NULL);
    204     strcpy_s(m_data, (m_size + 1), pTemp);
    205     strcat_s(m_data, len, s);
    206     m_size = len - 1;
    207     delete[]pTemp;
    208     return (*this);
    209 }
    210 
    211 int String::getSize() const
    212 {
    213     return m_size;
    214 }
    215 
    216 void String::setSize(int nSize)
    217 {
    218     this->m_size = nSize;
    219 }
    220 
    221 char* String::getData() const
    222 {
    223     return m_data;
    224 }
    225 
    226 void String::setData(char* pData)
    227 {
    228     if (NULL == pData)
    229     {
    230         init();
    231     }
    232     else
    233     {
    234         m_data = pData;
    235     }
    236 }
    237 
    238 ostream& operator<<(ostream& out, String& s)
    239 {
    240     for (int i = 0; i < s.getSize(); ++i)
    241     {
    242         out << s[i] << " ";
    243     }
    244     return out;
    245 }
    246 
    247 ostream& operator<<(ostream& out, const String& s)
    248 {
    249     for (int i = 0; i < s.getSize(); ++i)
    250     {
    251         out << s[i] << " ";
    252     }
    253     return out;
    254 }
    255 
    256 istream& operator>>(istream& in, String& s)
    257 {
    258     char p[50];
    259     in.getline(p, 50);
    260     s = p;
    261     return in;
    262 }
    263 
    264 bool operator<(const String& left, const String& right)
    265 {
    266     int i = 0;
    267     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    268         i++;
    269 
    270     return (left[i] - right[i] < 0);
    271 }
    272 
    273 bool operator>(const String& left, const String& right)
    274 {
    275     int i = 0;
    276     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    277         i++;
    278 
    279     return (left[i] - right[i] > 0);
    280 }
    281 
    282 bool operator==(const String& left, const String& right)
    283 {
    284     int i = 0;
    285     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    286         i++;
    287 
    288     return (left[i] == right[i]);
    289 }
    290 
    291 bool operator!=(const String& left, const String& right)
    292 {
    293     int i = 0;
    294     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    295         i++;
    296 
    297     return (left[i] != right[i]);
    298 }
    299 
    300 int main()
    301 {
    302     std::vector<String> stringVector;
    303 
    304     String str(3, 'a');
    305     String str1(str);
    306     String str2("asdf");
    307     String str3 = str2;
    308 
    309     cout << "str: " << str << endl;
    310     cout << "str1: " << str1 << endl;
    311     cout << "str2: " << str2 << endl;
    312     cout << "str3: " << str3 << endl;
    313 
    314     stringVector.push_back(str);
    315     stringVector.push_back(str1);
    316     stringVector.push_back(str2);
    317     stringVector.push_back(str3);
    318 
    319     // 第一种方式
    320     cout << "the first way: " << endl;
    321     for (auto item : stringVector)
    322     {
    323         cout << item << endl;
    324     }
    325 
    326     // 第二种方式:引用,可以修改元素值
    327     cout << "the second way: " << endl;
    328     for (auto& item : stringVector)
    329     {
    330         item += "baidu";
    331         cout << item << endl;
    332     }
    333 
    334     // 第三种方式
    335     cout << "the third way: " << endl;
    336     for (auto & const item : stringVector)
    337     {
    338         cout << item << endl;
    339     }
    340 
    341     // 第四种方式
    342     cout << "the four way: " << endl;
    343     for (auto const & item : stringVector)
    344     {
    345         cout << item << endl;
    346     }
    347 
    348     // 第五种方式:万能引用 
    349     //参考:https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers
    350     cout << "the five way: " << endl;
    351     for (auto&& item : stringVector)
    352         cout << item << endl;
    353 
    354     // 第六种方式
    355     cout << "the six way: " << endl;
    356     for (auto& item : { "abc", "def", "hij" })
    357         cout << item << endl;
    358 
    359     // 第七种方式
    360     cout << "the seven way: " << endl;
    361     for (auto& item : { 100, 200, 300 })
    362         cout << item << endl;
    363 
    364 #if 0
    365     // 第七种方式:编译错误
    366     cout << "the seven way: " << endl;
    367     for (int& item : { 100, 200, 300 })
    368         cout << item << endl;
    369 #endif
    370 
    371     system("pause");
    372 }

    good good study, day day up.

  • 相关阅读:
    各个版本中Notification对象创建的方法
    数据结构一:线性表
    安装eclipse中文汉化包后无法打开eclipse【转】
    在MFC里面使用自定义的OpenGL类进行绘图(基于VS2010)
    2016-2-25 我的博客开通了
    从C#到Swift原来这么简单,So Easy!
    CocoaPods安装及使用(包含重装步骤)
    Xcode键盘快捷键
    参考资料收集
    重温算法和数据结构:二分查找
  • 原文地址:https://www.cnblogs.com/Braveliu/p/15041594.html
Copyright © 2011-2022 走看看