7:编写类String的构造函数、析构函数和赋值函数,已知类String的原型为:

class String
{      
public:      

  String(const char *str = NULL); // 普通构造函数    

  String(const String &other); // 拷贝构造函数   

  ~ String(void); // 析构函数 

  String & operate =(const String &other); // 赋值函数      

private:     

  char *m_data; // 用于保存字符串      

};

   String::String(const char *str = NULL)
   {
      if(str == NULL)
      {
        m_data = new char[1];
        *m_data = '\0';
      }
      else
      {
        int len = strlen(str + 1);
        m_data = new char[len];
        strcpy(m_data,str);
      }
   }
   String::~String(void)
   {
     delete []m_data;
   }
  
   String::String(const String &other)  
   {
     m_data = new char[strlen(other.m_data)+1];
     strcpy(m_data,other.m_data);
   }
   //赋值函数
String & String::operate =(const String &other) // 得分点:输入参数为const型
{
  if(this == &other)
    return(this);
   delete m_data;
   int len = strlen(other.m_data) + 1;
   m_data = new char[len];
   strcpy(m_data,other.m_data);
   return this;
}

试题:写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
int sum(int n)
{
  return(n*(n+long(1))/2);
}


}
 1.将一个字符串逆序
#include <string.h>
/* reverse: reverse string s in place */
void reverse(char s[])
{
int c, i, j;
for (i = 0, j = strlen(s)-1; i < j; i++, j--)
c = s[i], s[i] = s[j], s[j] = c;
}
2.将一个链表(linked list)逆序
node *linkrev(node *head)
{
  node *p1,*p2,*p3;
  if(head||head->next)
    return head;
  p1 = head;
  p2 = head->next;
  while(p2)
  {
    p3 = p2->next;
    p2->next = p1;
    p1 = p2;
    p2 = p3;
  }
  head->next = null;
  head = p1;
  return head;
}
3.计算一个字节(byte)里有多少bit被置1

 算法一: a)要计算一个整数对应的二进制数有多少位是 1,常用的方法是使用位移:
   int countone(int n)
   {
     int count;
     int len = sizeof(n);
     for(i=0,i<len,i++)
     {
        count += n&1;
        n >>= 1;
     }
      return count;
   }
算法二:
int  count;
for(count = 0; x&=x--;count++);

算法三:查表法:
unsigned   char   mask[]   =   {1,2,4,8,16,32,64,128};
          unsigned   char   val   =   11;  
          unsigned   char*   p   =   mask;  
   
          int   c   =   0;  
          while(p   <   mask   +   8)  
          {  
                  if   (   *p++   &   val)  
                          ++c;  
          }  
   
          cout<<"num   of   1's   =   "   <<   c   <<endl;
4.搜索给定的字节(byte)
5.在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的
6字符串转换成整数
/* atoi: convert s to integer */
int atoi(char s[])
{
int i, n;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] - '0');
return n;
}
7.整数转换成字符串(这个问题很不错,因为应试者要用到堆栈或者strev函数)
/* itoa: convert n to characters in s */
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* record sign */
n = -n; /* make n positive */
i = 0;
do { /* generate digits in reverse order */
     s[i++] = n % 10 + '0'; /* get next digit */
   } while ((n /= 10) > 0); /* delete it */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}

#include <string.h>
/* reverse: reverse string s in place */
void reverse(char s[])
{
int c, i, j;
for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}

1。请实现一个类型,该类型只能在栈上分配,不能从堆上分配

2。请实现一个类型,该类型只能在堆上分配,不能从栈上分配
1。重载一个private的operator   new

  说明:new操作符变为私有,不能这样构造对象了:  
  CMyClass*   pmyObj   =   new   CMyClass();   //   堆上  
  只能这样:  
  CMyClass   myObj;//   栈上
  2。将ctor作为private,写一个public的static的CreateObject方法,在其中用new
  创建object。  

  说明:ctor变为私有,不能这样构造对象了  
  CMyClass   myObj;//   栈上
  只能这样:  
应该是:CMyClass*   pmyObj   =   CMyClass::CreateObject();