- 前引
- 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_delete
lengthm_data_
NULL
delete
delete
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)