免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5253 | 回复: 8
打印 上一主题 下一主题

[C++] 初学C++,在VC++6.0中写了一个简单的String类,请多批评指正 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-04 13:43 |只看该作者 |倒序浏览
初学C++,在VC++6.0中写了一个简单的String类,请多批评指正,谢谢!
  1. #include <iostream.h>
  2. #include <string.h>
  3. #include <assert.h>
  4. #include <stdlib.h>

  5. class String
  6. {
  7. private:           // 私有数据成员:
  8.   unsigned length; // length of string in characters(not counting null terminator)
  9.   char *char_ptr;  // pointer to string contents,用于保存字符串
  10. public:
  11.   //String() { length = 0; char_ptr = NULL; };
  12.   //取消上述默认构造函数,否则与下面的有默认参数的通用构造函数冲突:
  13.   //  warning C4520: 'String' : multiple default constructors specified

  14.   inline String(const char *pstr = NULL);  // conversion/default constructor
  15.   // 通用构造函数,默认参数只在定义中写
  16.   // 由于有默认参数,会与 String() 冲突

  17.   String(const String &another);    // copy constructor,拷贝构造函数
  18.   //拷贝构造函数,经常被称作X(X&),是一种特殊的构造函数,它由编译器调用来完成
  19.   //一些基于同一类的其他对象的构件及初始化。它的唯一的一个参数(对象的引用)
  20.   //是不可变的(因为是const型的)。

  21.   String(const unsigned count, const char ch);

  22.   ~String(); // // destructor,析构函数

  23.   // assignment operator,赋值运算符
  24.   const String & operator = (const String &right);
  25.   const String & operator = (const char *pstr);
  26.   const String & operator = (int nNum);

  27.   // 重载[], 实现数组运算
  28.   char& operator [] (unsigned int nIdx); // subscript operator (modifiable lvalue)
  29.   // 重载[], 实现数组运算(对象为常量)
  30.   //const char& operator [] (unsigned int nIdx) const;
  31.   // 重载[], 实现数组运算
  32.   char operator[](unsigned int) const;   // subscript operator (rvalue)
  33.   // 重载[]
  34.   String& operator [] (const String& obj);
  35.   // 重载(), return a substring
  36.   String operator () (const unsigned nIdx, const unsigned count) const;

  37.   // 重载+=,实现与对象相加
  38.   String& operator += (const String& right); // concatenation operator
  39.   // 重载+=,实现与字符串相加
  40.   String& operator += (const char *pstr);

  41.   const String operator+(const String& right) const;

  42.   friend String operator+(const String  s1, const String  s2);
  43.   // 如果写成  friend String operator+(const String &s1, const String &s2);
  44.   // 则后面的3条语句:
  45.   //   return s1 + String(cs2);
  46.   //   return String(cs1) + s2;
  47.   //   String c = a + b;
  48.   // 报错:error C2593: 'operator +' is ambiguous

  49.   friend String operator+(const String &s1, const char * cs2);
  50.   friend String operator+(const char * cs1, const String &s2);

  51.   friend String operator&(const String &s1, const String &s2);
  52.   friend String operator&(const String &s1, const char * cs2);
  53.   friend String operator&(const char * cs1, const String &s2);

  54.   bool operator!() const; // is String empty?

  55.   bool operator >  (const String &right);
  56.   bool operator >= (const String &right);
  57.   bool operator <  (const String &right);
  58.   bool operator <= (const String &right);
  59.   bool operator == (const String &right);
  60.   // 重载比较运算符!=
  61.   bool operator != (const String &right);

  62.   friend ostream &operator  << (ostream &out, const String &s)
  63.   {//输出
  64.         if(&s == NULL)
  65.           out << "<NULL>";
  66.         else if(s.char_ptr == NULL)
  67.           out << "{NULL}";
  68.         else
  69.       out << s.char_ptr;
  70.     return out;
  71.   }

  72.   friend istream &operator  >> (istream &in, String &s)
  73.   {//输入
  74.     char tmp[255]; //用于存储输入流
  75.     in >> tmp;
  76.     s = tmp;       //使用赋值运算符
  77.     return in;     //使用return可以支持连续使用>>运算符
  78.   }

  79.   int getLength() const { return length; };
  80.   char *getPtr() const { return char_ptr; };

  81.   String substr(unsigned st, unsigned len); // 提取子串,st为开始位置,len为提取长度
  82.   String & append(const String &right); // 拼接
  83.   // 如果命名为strcat则会与string.h中的strcat冲突,报错:
  84.   //   error C2661: 'strcat' : no overloaded function takes 2 parameters
  85.   String & append(const char *pstr);    // 拼接
  86.   int find(const char *pstr, unsigned st);      // 查找,st开始位置,可不填,默认为0
  87.   int find(const String &another, unsigned st); // 查找,st开始位置,可不填,默认为0
  88.   String & replace(const char *src, const char *dst);     // 替换
  89.   String & replace(const String &src, const String &dst); // 替换
  90. };

  91. inline String::String(const char *pstr /* = NULL */) // 通用构造函数
  92. // 声明为inline函数,则该函数在程序中被执行时是语句直接替换,而不是被调用
  93. {
  94.   if(pstr == NULL)
  95.     cout << "--- 通用构造函数调用之初,pstr=(NULL)\n";
  96.   else
  97.     cout << "--- 通用构造函数调用之初,pstr=[" << pstr << "]\n";
  98.   if(pstr == NULL) { length = 0; char_ptr = NULL; return; }
  99.   length = strlen(pstr);
  100.   char_ptr = new char[length + 1];
  101.   strcpy(char_ptr, pstr);
  102. }

  103. String::String(const String &another) // 拷贝构造函数
  104. // 类String拷贝构造函数与普通构造函数的区别是:
  105. // 在函数入口处无需与NULL进行比较,这是因为“引用”不可能是NULL,
  106. // 而“指针”可以为NULL。
  107. {
  108.   cout << "--- 拷贝构造函数调用之初,another=[" << another << "]\n";
  109.   // if(*this != another) // 这种写法会调用下面重载的操作符 !=
  110.   if(this != &another)
  111.   {
  112.     if(another.length == 0) { length = 0; char_ptr = NULL; return; }
  113.     // 在类的成员函数内可以访问同种类对象的私有成员(同种类肯定是友元关系)

  114.     length = another.length;
  115.     char_ptr = new char[length + 1];
  116.     strcpy(char_ptr, another.char_ptr);
  117.   }
  118. }

  119. String::String(const unsigned count, const char ch)
  120. {
  121.   cout << "--- 另一个构造函数调用之初,count=" << count << ", ch=" << ch << endl;
  122.   if(count <= 0) { length = 0; char_ptr = NULL; return; }
  123.   length = count;
  124.   char_ptr = new char[length + 1];
  125.   memset(char_ptr, ch, length);
  126.   char_ptr[length] = 0x00;
  127. }

  128. String::~String() // 析构函数
  129. {
  130.   cout << "--- 执行析构函数, length=" << length;
  131.   if(length > 0)
  132.         cout << ", char_ptr:" << char_ptr << endl; // endl 等效于 "\n"
  133.   else
  134.         cout << endl; // endl 等效于 "\n"
  135.   if(length > 0 && !char_ptr) delete []char_ptr;
  136.   // 由于 char_ptr是内部数据类型,也可以写成 delete char_ptr;
  137.   char_ptr = NULL;
  138.   length = 0;
  139. }


  140. const String & String::operator = (const String &right) // 赋值运算符
  141. {
  142.   cout << "--- 执行赋值运算, right=" << right << endl;
  143.   // 检查自赋值, 注意不要将检查自赋值的if语句“if(this == &right)”
  144.   //   错写成为“if(*this == right)”
  145.   if(this == &right) return *this;

  146.   // 释放原有资源。如果现在不释放,以后就没机会了,将造成内存泄露。
  147.   if(!char_ptr) delete []char_ptr;

  148.   if(right.length == 0) { length = 0; char_ptr = NULL; return *this; }

  149.   // 分配新的内存资源,并复制内容
  150.   length = right.length;
  151.   char_ptr = new char[length + 1];
  152.   strcpy(char_ptr, right.char_ptr); // 函数strcpy则连'\0'一起复制。
  153.   // 返回本对象的引用,目的是为了实现象 a = b = c 这样的链式表达。
  154.   // 注意不要将 return *this 错写成 return this
  155.   return *this;
  156. }

  157. const String & String::operator = (const char *pstr) // 赋值运算符
  158. {
  159.   cout << "--- 执行赋值运算, pstr=" << pstr << endl;
  160.   if(pstr == NULL) { length = 0; char_ptr = NULL; return *this; }

  161.   // 释放原有资源
  162.   if(!char_ptr) delete []char_ptr;
  163.   // 如果不加 if(!char_ptr) 判断将可能导致下述错误:
  164.   //   Debug Error!
  165.   //   DAMAGE:after Normal block(#53)at 0x00441940.

  166.   length = strlen(pstr);
  167.   char_ptr = new char[length + 1];
  168.   strcpy(char_ptr, pstr);
  169.   // 返回本对象的引用
  170.   return *this;
  171. }

  172. const String& String::operator = (int nNum) // 赋值运算符
  173. {
  174.   cout << "--- 执行赋值运算, nNum=" << nNum << endl;
  175.   char szNum[24];
  176.   itoa(nNum, szNum, 10);
  177.   if(!char_ptr) delete []char_ptr;
  178.   char_ptr = new char[strlen(szNum) + 1];
  179.   strcpy(char_ptr, szNum);
  180.   return *this;
  181. }

  182. // 重载[], 实现数组运算,return reference to character in String as a modifiable lvalue
  183. char& String::operator [] (unsigned int nIdx)
  184. {
  185.   cout << "--- 执行[]运算, modifiable lvalue" << endl;
  186.   // test for subscript out of range
  187.   if(nIdx < 0 || nIdx >= length )
  188.   {
  189.     cerr << "Error: Subscript " << nIdx
  190.          << " out of range" << endl;
  191.     exit(1); // terminate program
  192.   }
  193.   return char_ptr[nIdx]; // non-const return; modifiable lvalue
  194. }
  195. /*
  196. // 重载[], 实现数组运算(对象为常量)
  197. const char& String::operator [] (unsigned int nIdx) const
  198. {
  199.   assert(nIdx <= length);
  200.   return char_ptr[nIdx];
  201. }
  202. */

  203. // return reference to character in String as rvalue
  204. char String::operator[](unsigned int nIdx) const   // subscript operator (rvalue)
  205. {
  206.   cout << "--- 执行[]运算, subscript operator (rvalue)" << endl;
  207.   assert(nIdx <= length);
  208.   return char_ptr[nIdx]; // returns copy of this element
  209. }

  210. // 重载[]
  211. String& String::operator [] (const String& obj)
  212. {
  213.   if(obj.char_ptr == NULL)
  214.   {
  215.     return *this;
  216.   }
  217.   char *pTmp = new char[length + obj.length + 1];
  218.   strcpy(pTmp, char_ptr);
  219.   strcat(pTmp, obj.char_ptr);
  220.   if(!char_ptr) delete []char_ptr;
  221.   char_ptr = pTmp;
  222.   return *this;
  223. }

  224. // 重载()
  225. String String::operator () (const unsigned nIdx, const unsigned count) const
  226. {
  227.   if(nIdx < 0 || count <= 0 || nIdx >= length) return NULL;
  228.   String result;
  229.   if(nIdx + count > length)
  230.     result.length = length - nIdx;
  231.   else
  232.     result.length = count;
  233.   result.char_ptr = new char[result.length + 1];
  234.   strncpy(result.char_ptr, char_ptr + nIdx, result.length);
  235.   result.char_ptr[result.length] = 0x00;
  236.   return result;
  237. }

  238. // 重载+=,实现与对象相加.
  239. // Concatenate right operand to this object and store in this object.
  240. String &String::operator+=(const String &right)
  241. {
  242.   cout << "--- 执行+=运算, right=" << right << endl;
  243.   if(&right == NULL)
  244.   {
  245.     return *this;
  246.   }
  247.   char *tempPtr = char_ptr;         // hold to be able to delete
  248.   length += right.length;           // new String length
  249.   char_ptr = new char[length + 1];  // create space
  250.   assert(char_ptr != 0);            // terminate if memory not allocated
  251.   strcpy(char_ptr, tempPtr);        // left part of new String
  252.   strcat(char_ptr, right.char_ptr); // right part of new String
  253.   delete [] tempPtr;                // reclaim old space
  254.   return *this;                     // enables concatenated calls
  255. }

  256. // 重载+=,实现与字符串相加
  257. String& String::operator += (const char *pstr)
  258. {
  259.   cout << "--- 执行+=运算, pstr=" << pstr << endl;
  260.   if(pstr == NULL)
  261.   {
  262.     return *this;
  263.   }
  264.   char *pTmp = new char[length + strlen(pstr) + 1];
  265.   strcpy(pTmp, char_ptr);
  266.   strcat(pTmp, pstr);
  267.   if(!char_ptr) delete []char_ptr;
  268.   char_ptr = pTmp;
  269.   return *this;
  270. }

  271. const String String::operator+(const String& right) const
  272. {
  273.   cout << "--- 执行 + 运算, right=" << right << endl;
  274.   if(&right == NULL)
  275.   {
  276.     return *this;
  277.   }
  278.   char* r = new char [length + right.length + 1];  // temporary
  279.   assert(r != 0);
  280.   strcpy(r, char_ptr);                  // init with left string
  281.   strcpy(r + length, right.char_ptr);   // add right string
  282.   String result(r);                     // construct String object
  283.   delete [] r;                          // free temporary
  284.   return result;
  285. }

  286. String operator+(const String  s1, const String  s2)
  287. {
  288.   cout << "--- 执行 + 运算, s1=" << s1 << ", s2=" << s2 << endl;
  289.   String s3;
  290.   s3.length = s1.length + s2.length;
  291.   s3.char_ptr = new char[s3.length + 1];
  292.   if(s1.length > 0)
  293.     strcpy(s3.char_ptr, s1.char_ptr);
  294.   else
  295.     strcpy(s3.char_ptr, "");

  296.   if(s2.length > 0)
  297.     strcat(s3.char_ptr, s2.char_ptr);
  298.   s3.char_ptr[s3.length] = 0x00;
  299.   return s3;
  300. }

  301. String operator+(const String &s1, const char * cs2)
  302. {
  303.   cout << "--- 执行 + 运算, s1=" << s1 << ", cs2=" << cs2 << endl;
  304.   return s1 + String(cs2);
  305. }

  306. String operator+(const char * cs1, const String &s2)
  307. {
  308.   cout << "--- 执行 + 运算, cs1=" << cs1 << ", s2=" << s2 << endl;
  309.   return String(cs1) + s2;
  310. }

  311. String operator&(const String &s1, const String &s2)
  312. {
  313.   cout << "--- 执行 & 运算, s1=" << s1 << ", s2=" << s2 << endl;
  314.   String s3;
  315.   s3.length = s1.length + s2.length;
  316.   s3.char_ptr = new char[s3.length + 1];
  317.   strcpy(s3.char_ptr, s1.char_ptr);
  318.   strcat(s3.char_ptr, s2.char_ptr);
  319.   return s3;
  320. }

  321. String operator&(const String &s1, const char * cs2)
  322. {
  323.   cout << "--- 执行 & 运算, s1=" << s1 << ", cs2=" << cs2 << endl;
  324.   return s1 + String(cs2);
  325. }

  326. String operator&(const char * cs1, const String &s2)
  327. {
  328.   cout << "--- 执行 & 运算, cs1=" << cs1 << ", s2=" << s2 << endl;
  329.   return String(cs1) + s2;
  330. }

  331. bool String::operator!() const // is String empty?
  332. {
  333.   cout << "--- 执行 !() 运算, length=" << length << endl;
  334.   return length == 0;
  335. }

  336. bool String::operator > (const String &right)
  337. {
  338.   if(length > 0 && right.length == 0) return true;
  339.   if(length == 0 && right.length > 0) return false;
  340.   int pos = 0;
  341.   while(char_ptr[pos] == right.char_ptr[pos] && char_ptr[pos] != '\0') pos++;
  342.   if(char_ptr[pos] > right.char_ptr[pos]) return true;
  343.   else return false;
  344. }

  345. bool String::operator >= (const String &right)
  346. {
  347.   if(length > 0 && right.length == 0) return true;
  348.   if(length == 0 && right.length > 0) return false;
  349.   int pos = 0;
  350.   while(char_ptr[pos] == right.char_ptr[pos] && char_ptr[pos] != '\0') pos++;
  351.   if(char_ptr[pos]  > right.char_ptr[pos] ||
  352.     (char_ptr[pos] == right.char_ptr[pos] && char_ptr[pos] == '\0'))
  353.     return true;
  354.   else return false;
  355. }

  356. bool String::operator < (const String &right)
  357. {
  358.   return !((*this) >= right);
  359. }

  360. bool String::operator <= (const String &right)
  361. {
  362.   return !((*this) > right);
  363. }

  364. bool String::operator == (const String &right)
  365. {
  366.   //return !((*this) > right) && !((*this) < right);
  367.   return !strcmp(char_ptr, right.char_ptr);
  368. }

  369. bool String::operator != (const String &right)
  370. {
  371.   return !((*this) == right);
  372. }

  373. String String::substr(unsigned st, unsigned n)
  374. {
  375.   if(st < 0 || n <= 0 || st + n > length) return NULL;
  376.   char *tmp = new char[n+1];
  377.   for(unsigned i = 0; i < n; i++)
  378.   {
  379.     tmp[i] = char_ptr[st + i];
  380.   }
  381.   tmp[n] = '\0';
  382.   return String(tmp);
  383. }

  384. String &String::append(const String &right)
  385. {
  386.   if(&right == NULL || right.length == 0) return *this;
  387.   char* r = new char [length + right.length + 1]; // temporary
  388.   assert(r != 0);
  389.   strcpy(r, char_ptr);                  // init with left string
  390.   strcpy(r + length, right.char_ptr);   // add right string
  391.   if(!char_ptr) delete []char_ptr;
  392.   char_ptr = r;
  393.   return *this;
  394. }

  395. String &String::append(const char *pstr)
  396. {
  397.   if(NULL == pstr) return *this;
  398.   char *tmp = new char[length + strlen(pstr) + 1];
  399.   assert(tmp != 0);
  400.   strcpy(tmp, char_ptr);
  401.   strcat(tmp, pstr);
  402.   if(!char_ptr) delete []char_ptr;
  403.   char_ptr = tmp;
  404.   return *this;
  405. }

  406. int String::find(const char *pstr, unsigned st = 0)
  407. {
  408.   if(st < 0 || st >= length) return -1;
  409.   int strPos = st;
  410.   while(char_ptr[strPos] != '\0')
  411.   {
  412.     int curPos = strPos;
  413.     int pPos = 0;
  414.     if(char_ptr[strPos] != pstr[pPos])
  415.     {
  416.       strPos++;
  417.       continue; //如果当前字符不相等,继续下一个字符
  418.     }
  419.     while(char_ptr[curPos] == pstr[pPos] && pstr[pPos] != '\0')
  420.     {
  421.       curPos++;
  422.       pPos++; //相等的部分跳过
  423.     }
  424.     if(pstr[pPos] == '\0') return strPos;
  425.     else
  426.     {
  427.       strPos++;
  428.       continue;//如果当前字符不相等,继续下一个字符
  429.     }
  430.   }
  431.   return -1;
  432. }

  433. int String::find(const String &another, unsigned st)
  434. {
  435.   return find(another.char_ptr, st);
  436. }

  437. String &String::replace(const char *src, const char *dst)
  438. {
  439.   if(src == NULL || dst == NULL) return *this;
  440.   int pos = find(src);
  441.   if(pos < 0) return *this; //没有源串就退出函数
  442.   int lenSrc = 0, lenDst = 0;
  443.   while(src[lenSrc++]);
  444.   while(dst[lenDst++]);
  445.   lenSrc -= 1;
  446.   lenDst -= 1;
  447.   char *tmp = new char[length + lenDst - lenSrc + 1];
  448.   int curChar = 0;
  449.   while(curChar < pos)
  450.   {
  451.     tmp[curChar] = char_ptr[curChar];
  452.     curChar++;
  453.   }
  454.   int i = 0;
  455.   while(i < lenDst)
  456.   {
  457.     tmp[curChar] = dst[i];
  458.     curChar++;
  459.     i++;
  460.   }
  461.   pos += lenSrc;
  462.   while(pos < (int)length)
  463.   {
  464.     tmp[curChar] = char_ptr[pos];
  465.     curChar++;
  466.     pos++;
  467.   }
  468.   tmp[curChar] = '\0';
  469.   if(!char_ptr) delete []char_ptr;
  470.   char_ptr = tmp;
  471.   return replace(src, dst); //递归调用替换所有串
  472. }

  473. String &String::replace(const String &src, const String &dst)
  474. {
  475.   return replace(src.char_ptr, dst.char_ptr);
  476. }

  477. void main()
  478. {
  479.   String s("12345"); // 测试
  480.   cout << "=== @main(), s=[" << s << "]\n";
  481.   String o = s;
  482.   cout << "=== @main(), after o=s, o:" << o << endl;
  483.   o = "12345678";
  484.   cout << "=== @main(), after o='12345678', o:" << o << endl;
  485.   cout << "=== @main(), o.substr(2,2):" << o.substr(2,2) << endl;
  486.   o.append(String("ABC"));
  487.   cout << "=== @main(), after o.strcat(ABC), o:" << o << endl;
  488.   o.append("DEF");
  489.   cout << "=== @main(), after o.strcat(DEF), o:" << o << endl;
  490.   s = "123435333336";
  491.   o = "123435333336";
  492.   cout << "=== @main(), s 和 o 重新赋值, s=[" << s << "], o=[" << o << "]\n";
  493.   cout << "=== @main(), true=" << true << ", false=" << false << endl;
  494.   cout << "=== @main(), 检测 s == o 结果: " << (s == o) << endl;
  495.   cout << "=== @main(), 检测 s != o 结果: " << (s != o) << endl;
  496.   cout << "=== @main(), 检测 s  > o 结果: " << (s > o) << endl;
  497.   cout << "=== @main(), 检测 s >= o 结果: " << (s >= o) << endl;
  498.   cout << "=== @main(), 检测 s  < o 结果: " << (s < o) << endl;
  499.   cout << "=== @main(), 检测 s <= o 结果: " << (s <= o) << endl;
  500.   String ss = s(3, 4);
  501.   cout << "=== @main(), ss=s(3,4): " << ss << endl;
  502.   cout << "=== @main(), after s.replace(...), result=[" << s.replace(String("3"),String("A")) << "]\n\n";
  503.   String a="aaa";
  504.   String b="bbb";
  505.   String c = a + b;
  506.   cout << "=== @main(), c=a+b=[" << c << "]\n";
  507.   String d = a + "!!!ddd";
  508.   cout << "=== @main(), d=[" << d << "]\n";
  509.   String e = "eee " + b;
  510.   cout << "=== @main(), e=[" << e << "]\n";
  511.   String f = a & b;
  512.   cout << "=== @main(), f=a&b=[" << f << "]\n";
  513.   String r(10, 'x');
  514.   cout << "=== @main(), r=[" << r << "]\n";
  515.   r += a;
  516.   cout << "=== @main(), r+=a, =[" << r << "]\n";
  517.   r += "Hello";
  518.   cout << "=== @main(), r+=\"Hello\", =[" << r << "]\n";
  519.   String s1, s2, s3, s4, s5, s6;
  520.   s1 = s2 = s3 = s4 = "Hello!";
  521.   s6 = s5 + "666";
  522.   cout << "=== @main(), s6=[" << s6 << "]\n";
  523.   cout << "=== @main(), !s5=" << (!s5) << "\n";
  524.   cout << "=== @main(), !s6=" << (!s6) << "\n";
  525.   char c1 = s6[2];
  526.   cout << "=== @main(), c1 = s6[2]=" << c1 << "\n";
  527.   s6[2] = '2';
  528.   cout << "=== @main(), s6[2]=" << s6[2] << "\n";
  529. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-07-06 07:13 |只看该作者
自己顶。

论坛徽章:
0
3 [报告]
发表于 2011-07-06 08:02 |只看该作者
为了实现i一个 string类,C++就这么复杂,,,,

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2011-07-06 09:47 |只看该作者
判断new成功与否不能用assert

在C++中,new失败缺省会抛出异常(当然VC6是个例外)

论坛徽章:
0
5 [报告]
发表于 2011-07-06 11:48 |只看该作者
{:3_189:}{:3_189:}一说到重载new,delete之类的,建议在前面加static ,这是经验!不说了。

论坛徽章:
0
6 [报告]
发表于 2011-07-06 13:05 |只看该作者
不错,支持

论坛徽章:
0
7 [报告]
发表于 2011-07-06 19:57 |只看该作者
判断new成功与否不能用assert

在C++中,new失败缺省会抛出异常(当然VC6是个例外)
hellioncu 发表于 2011-07-06 09:47



    谢谢!

论坛徽章:
0
8 [报告]
发表于 2011-07-06 20:01 |只看该作者
一说到重载new,delete之类的,建议在前面加static ,这是经验!不说了。
留痕之雁 发表于 2011-07-06 11:48



还请多说说。

论坛徽章:
0
9 [报告]
发表于 2011-07-06 20:02 |只看该作者
不错,支持
Cu_fans 发表于 2011-07-06 13:05



谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP