前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IT面试系列:手写string类

IT面试系列:手写string类

作者头像
lcyw
发布2022-06-10 19:36:14
5580
发布2022-06-10 19:36:14
举报
文章被收录于专栏:machh的专栏machh的专栏

很多公司在招聘初级或中级C++程序员时,喜欢让面试者手写String类的定义及实现。重点是考察类 String 的构造函数、析构函数和赋值函数以便考察面试者的C++基本功,这里提供一个版本供大家参考!

代码语言:javascript
复制

class myString
{
public:
    myString(){
        cout<< “default constructor “ <<endl;
        m_data = new char[1];
        *m_data = ‘\0’;
    }

    ~myString(){
        cout << "destroy" << endl;
        if(m_data)
        {
            delete [] m_data;
            m_data = NULL;
        }
    }

    myString(const char * str) {
        cout<< "paramter construct " <<endl;
        if(str == NULL )
        {
            m_data = new char[1];
            *m_data = '\0';
        }
        else{
            m_data = new char[strlen(str)+1];
            strcpy(m_data, str );    
        }
    }
    
    ‍myString(const myString& other) {
        cout<< "copy construct " <<endl;
        value = other.value; 
        m_data = new char[strlen(other.m_data)+1];
        strcpy(m_data, other.m_data );        
    }‍

    myString & operator =(const myString & other){
        cout<< "operator == " <<endl;
        if( this != &other )  // 检查自赋值 
        {
            myString strtemp(other);
            char * pTemp = strtemp.m_data;
            strtemp.m_data = m_data;
            m_data = pTemp;
        }    
        
        // 返回本对象的引用
        return *this;
    }

    char * c_str(){ return m_data; }
private:
    char * m_data;
};    


  • 考察重点一,拷贝构造函数的参数 如果面试者对拷贝构造函数理解不到位,将函数做如下声明: myString( myString other) 那么,考虑如下情况: myString str1("aaa"); myString str2 = str1; 由于是传值参数,形参复制到实参会调用拷贝构造函数,就会在拷贝构造函数内部 调用拷贝构造函数,会形成永无休止的递归调用,导致栈溢出。
  • 考察重点二,赋值运算函数
  • 是否把返回值的类型声明为该类型的引用
  • 是否在函数结束前返回自身的引用
  • 传入参数是否声明为常量引
  • 是否释放实例自身的内存
  • 是否判断输入参数是否和当前实例是同一个实例

考察重点三,考虑异常及安全 如果在赋值函数内部使用delete释放实例自身内存,再用new申请新的内存, 如果此时内存不足导致new操作失败,抛出异常导致类实例状态无效 本文采用零时对象和自身实例交换, 通过局部零时对象离开作用域时调用析构函数 进而释放内存 // 调用演示 int main ( ) { myString aa; myString bb( " mysting bb" ); aa = bb; cout<< aa.c_str() <<endl; return 0 ; }

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 音视频开发训练营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档