Error[8]: Undefined offset: 910, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; } [+++] [+++]str [+++] tmpstring [+++] [+++] [+++] [+++][+++] [+++] endl[+++]
  [+++] [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 911, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  [+++]str [+++] tmpstring [+++] [+++] [+++] [+++][+++] [+++] endl[+++]
  [+++] [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 912, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str [+++] tmpstring [+++] [+++] [+++] [+++][+++] [+++] endl[+++]
  [+++] [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 913, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring [+++] [+++] [+++] [+++][+++] [+++] endl[+++]
  [+++] [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 914, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring  [+++] [+++] [+++][+++] [+++] endl[+++]
  [+++] [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 915, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring   [+++] [+++][+++] [+++] endl[+++]
  [+++] [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 916, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring    [+++][+++] [+++] endl[+++]
  [+++] [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 917, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring    [+++] [+++] endl[+++]
  [+++] [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 918, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring     [+++] endl[+++]
  [+++] [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 919, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring      endl[+++]
  [+++] [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 920, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring      endl
  [+++] [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 921, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring      endl
   [+++][+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 922, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring      endl
   [+++]
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 923, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

文章目录


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring      endl
   
[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
C++ 考察基础经典面试题:string类的基础设计_C_内存溢出

C++ 考察基础经典面试题:string类的基础设计

C++ 考察基础经典面试题:string类的基础设计,第1张

文章目录
    • 前引
    • C++ 经典基础面试题:string类的基础设计
      • 1、题目(原型代码)
        • 1、String::String(const char* str) 构造函数
        • 2、String::String(const String& other) 拷贝构造函数
        • 3、String::~String 析构函数
        • 4、String& String::operator= (const String& other) 赋值函数
        • 5、String String::operator+ (const String& other) 字符串相加
        • 6、bool String::operator==(const String& other) const 判断是否为相同字符串
        • 7、int String::GetLength() const 返回字符串长度
      • 2、总代码 + 测试代码


前引

刚刚看了一下 一本关于后台开发知识点的总结的书
感觉写的挺糟糕的 大部分东西都是抄的网上的 还是腾讯员工写的
但是作为知识点补足看看还是ok的

里面有个关于C++的很经典的考察基础的面试题 就是string类的基础设计
觉得挺有趣的 想自己写写 于是就写下了这篇博客

大概率后面 博客会越发越少了 因为确实之后也没什么可以发的了 目前我所做的 基本上该做的也全做了 最多之后目前我能想的到的 也就是找到实习后 再做做 MIT关于分布式系统的那个Lab

因为说实话 到现在对于目前我的阶段 除了为实习面试准备 再查缺补补漏 也好像确实没啥可以做的了 前引部分就先写到这里


C++ 经典基础面试题:string类的基础设计
1、题目(原型代码)

下面是原型题目 接下来需要编写 也就是补足String的7个函数
成员没有size

代码风格是用的google style 自从之前完成了项目 之后代码风格统一采用google style 固定住自己的代码风格也很重要 当然这和这道题没有关系 只是我顺口提了一嘴

class String {
 public:
  String(const char* str = NULL);
  String(const String& other);
  ~String();

  String& operator= (const String& other);
  String operator+ (const String& other);
  bool operator== (const String& other);

  int GetLength() const;

 private:
  char* m_data_;
};

1、String::String(const char* str) 构造函数

在看了答案前 主要我没有考虑到 如果进来是NULL
如果传进来是NULL的话 我们的strlen就会直接报错 因为我们需要保证strlen传进来的参数是non-null 这个也是我刚刚去试了一下才发现的

需要考虑的是 最后一位 由于是最后一位设置为char是自古一来判断字符串是否已经走到了最后的判断方法 所以我们需要设置额外的一个String空间来存放::

String(constchar* )if str( {
  == NULLstr ) =new {
    m_data_ char [ 1];[0
    m_data_]=';' return ;}
    int=
  strlen

  ( length ) ;=strnewchar
  m_data_ [ + 1]length ; memcpy(,
  ,)m_data_; str[ length]=
  m_data_';'length} null String::
String

2、String::String(const String& other) 拷贝构造函数

这里的话 依然需要注意一下 就是对方的是否为(
其他的就没了

const&)if( String! other. {
  ) =newothercharm_data_[ {
    m_data_ 1 ] ;[0]=
    m_data_';'}int = strlen(
  .

  ) length ; =newothercharm_data_[+
  m_data_ 1 ] ;memcpylength ( ,.,
  );m_data_[ other]m_data_= length';'}
  m_data_deletelengthm_data_ NULL deletedelete
NULL

3、String::~String 析构函数

这里很简单 需要String一下即可
只是:: 又初始化为~ 这个可能算个加分点 一个String后的字符串不再使用 (后立马设置为)

if()delete;= {
  NULL ;m_data_} {
    } m_data_NULL
    m_data_ & ::operator
  =
(

4、String& String::operator= (const String& other) 赋值函数

这个需要稍微看一下 是否为const 其他的就是需要在之前先把我们分配的空间给delete掉
最重要的是 在开始判断是否是相同的指针 相同的地址空间
如果是的话 直接返回当前对象即可 不需要任何 *** 作

String& String)if( .!= String) otherif {
  ( !=otherNULLm_data_ ) m_data_delete {
     ; }m_data_ if (. {
        == m_data_NULL
     )
     = NULLother;m_data_ } elseint {
       m_data_ = strlen(
     . ) {
       ; length = newcharother[m_data_+1
       m_data_ ] ; memcpy(length , .,)
       ;[m_data_] other=m_data_';' length}}
       m_data_returnlength* this ;}
     NULL
  ::
  operator +(const
&

5、String String::operator+ (const String& other) 字符串相加

这个的话 就需要一个额外的临时对象了
如果相连接的是)的话 就直接拷贝当前对象返回就好了
其他的就是正常 *** 作了

String String;if( .== StringNULL other) {
  String newstring=
  * thisother;m_data_ } elseint {
    newstring = strlen()
  ; int {
    = nowlength strlen (.m_data_);
    int otherlength = +;other.m_data_=new
    char length [ nowlength + otherlength1
    newstring]m_data_ ; memcpy (.length , ,);
    memcpy(newstring.m_data_+ m_data_, nowlength.,
    );newstring.m_data_ [ nowlength] other=m_data_';' otherlength}return
    newstring;m_data_}lengthstrcmp bool ::operator
  ==
  ( newstringconst
&

6、bool String::operator==(const String& other) const 判断是否为相同字符串

这个工作交给)即可 没什么其他的

const Stringreturnstrcmp(,. String) other== 0 {
  ? true:m_data_false other;m_data_} int size_ strlen strlen NULL int String::
GetLength

7、int String::GetLength() const 返回字符串长度

由于我们没有成员( 其实正常的应该是有的 但是我们按照题目来吧 有的话 可以不用每次都) 工作交给const即可
但是注意 有可能存在if的情况 则需要先判断一下

( ==NULL)return0 ; {
  } returnm_data_ strlen () {
    ; }<<
  os
  # include#m_data_include#
include

2、总代码 + 测试代码

下面就是测试正确性的代码了
包括上面的所有的代码

为了方便检查正确 我还重载了using 方便namespace输出
就写到这里了 去做核酸了

;class 
Stringpublic 
:String 

( const stdchar

* = {
 NULL)
  ;String( const& str ) ;~String
  (); String& otheroperator=
  (const&);

  Stringoperator +( const& String) other;bool
  String operator== (const String& other)const
  ; friend& operator<< String( other& ,const
  & ostream) ;int GetLengthostream( os) const String; strprivate:

  char *;} ;String

 ::String
  (const m_data_char
*)

if(==NULL) =new strchar {
  [ 1str ] ;[ {
    m_data_ 0 ] =';'return;}
    m_data_int=strlen ( );
    =new
  char

  [ length + 1]str;memcpy
  m_data_ ( , ,)length ; []=
  ';'}m_data_String str:: lengthString(
  m_data_constlength& ) if(
!

.)=newchar String[ other1 {
  ] ;[other0m_data_] {
    m_data_ = ';' }int=strlen(
    m_data_.); = newchar
  [

  + length 1 ];othermemcpym_data_(,
  m_data_ . , );length [ ]=';'
  }Stringm_data_:: other~m_data_String length()
  m_data_iflength( ) delete;
=

NULL;}}&:: {
  operator =m_data_( {
    const m_data_&
    m_data_ ) if(
  .
!=

String) Stringif(!= NULL) Stringdelete other; {
  } ifother(m_data_ . m_data_== {
     NULL )m_data_ = NULL; {
        } m_data_else
     int
     = strlenother(m_data_ . ); {
       m_data_ = newchar
     [ + {
       1 length ] ;memcpyother(m_data_,.
       m_data_ , ) ;[length ] =';'}
       }returnm_data_* otherthism_data_; length}::
       m_data_operatorlength+ ( const&
     )
  ;
  if (.==
NULL

String String)=* this; String} otherelse {
  String newstringint
  = strlenother(m_data_ ) ;int {
    newstring = strlen(.
  ) ; {
    int nowlength = +;m_data_.=
    new otherlength char [+other1m_data_];
    memcpy length ( nowlength . otherlength,
    newstring,m_data_ ) ; memcpy(length . +,.
    ,)newstring;m_data_. m_data_[ nowlength]=
    ';'}newstringreturnm_data_ ; nowlength} otherboolm_data_:: otherlengthoperator==
    newstring(m_data_constlength& ) constreturn
  strcmp
  ( newstring,
.

) String==0?true: Stringfalse other; } {
  int String::m_data_GetLength other(m_data_) const if ( == NULL )return
0

; }returnstrlen() ; {
  } &m_data_ operator <<( {
    & ,const
  &
  ) return<<m_data_.;
}

ostreamint main( )ostreamstr os( NULL String) str; {
  << os "str(NULL) str : " str<<m_data_<<
;

tmp ("gogo") {
  String ;<<"tmp(\"gogo\") ":<<
  cout << ; << str "str == tmp : " endl<<

  String (==?"true":
  cout "false" )tmp << " ; tmp emptystring endl(

  cout NULL ) ; <<str "str == emptystring : " tmp << ( == ?"true" : endl"false"

  String )<<;=;
  cout << "str = tmp str : " << <<str ; emptystring = + ; <<"tmpstring = str + tmp tmpstring : " << endl<<

  str ; tmp<<
  cout "str == tmp : " << ( str == endl?

  String tmpstring "true" str : tmp"false"
  cout ) << ; tmpstring << endl"str == tmpstring : "

  cout << ( == ?str "true" tmp : "false" ) <<; return endl0
  cout ; }  str  tmpstring      endl
   

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/914791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存