高质量C++/C编程指南

1   有如下的c++类 
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::~String(void)
{
    delete [] m_data; 
   // 由于m_data是内部数据类型,也可以写成 delete m_data;
   //为什么呢????
     }
     
2 以下两个函数的区别是什么?

char *GetString(void)
{
   char p[] = "hello world";

   return p;   // 编译器将提出警告
}

char *GetString2(void)
{
   char *p = "hello world";

   return p;
}

实际上就是 char p[] 与 char *p 的区别是什么?
分别计算如下值就真相大白了, sizeof(p)

3 重载,覆盖与隐藏

    成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual关键字可有可无。

    覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual关键字。

本来仅仅区别重载与覆盖并不算困难,但是C++的隐藏规则使问题复杂性陡然增加。这里“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

4、编写类String的构造函数、析构函数和赋值函数(25分)

已知类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的上述4个函数。

标准答案:

// String的析构函数

       String::~String(void)               // 3分

{

    delete [] m_data;                        

// 由于m_data是内部数据类型,也可以写成 delete m_data;

       }

       // String的普通构造函数            

       String::String(const char *str)      // 6分

{

    if(str==NULL)                         

    {

        m_data = new char[1];    // 若能加 NULL 判断则更好

        *m_data = ‘\0’;                     

    }                                         

    else

    {

        int length = strlen(str);          

        m_data = new char[length+1]; // 若能加 NULL 判断则更好     

        strcpy(m_data, str);               

    }

}  

// 拷贝构造函数

    String::String(const String &other)   // 3分

    {  

    int length = strlen(other.m_data);   

    m_data = new char[length+1];      // 若能加 NULL 判断则更好   

    strcpy(m_data, other.m_data);        

}

// 赋值函数

    String & String::operate =(const String &other)    // 13分

    {  

       // (1) 检查自赋值                     // 4分

        if(this == &other)

           return *this;

   

// (2) 释放原有的内存资源            // 3分

       delete [] m_data;

      

       // (3)分配新的内存资源,并复制内容 // 3分

    int length = strlen(other.m_data);   

    m_data = new char[length+1];         // 若能加 NULL 判断则更好

        strcpy(m_data, other.m_data);

      

       // (4)返回本对象的引用            // 3分

        return *this;

}  

要是那次面试碰到这个题,还真不知道自己是否能够写得完整哦.

猜你喜欢

转载自www.cnblogs.com/gdoupanguoqing/p/9686045.html