一 判断输出
#include
<
iostream
>
using namespace std;
Fun(
int
&
n)
{
printf(
"
%d,
"
,
++
n);
if
(n
==
11
)
{
return
1
;
}
return
0
;
}
void
main()
{
int
n
=
10
;
printf(
"
%d, %d, %d\n
"
,n
++
,n
++
,n
++
);
//
10,10,10
n
=
10
;
printf(
"
%d, %d, %d\n
"
,
++
n,
++
n,
++
n);
//
13,12,11
n
=
10
;
cout
<<
n
++<<
"
,
"
<<
n
++<<
"
,
"
<<
n
++<<
endl;
//
12, 11, 10
n
=
10
;
cout
<<++
n
<<
"
,
"
<<++
n
<<
"
,
"
<<++
n
<<
endl;
//
13, 12, 11
n
=
10
;
if
(Fun(n)
&&
Fun(n)
&&
Fun(n))
{}
cout
<<
n
<<
endl;
//
11,12,12
}
二,String类的编写
这是一个常见的c++面试题,已经不知道出处了,
assert(m_data != NULL);
class
String
{
public
:
String(
const
char
*
str
=
NULL);
//
普通构造函数
String(
const
String
&
other);
//
拷贝构造函数
~
String(
void
);
//
析构函数
String
&
operate
=
(
const
String
&
other);
//
赋值函数
private
:
char
*
m_data;
//
用于保存字符串
}
;
//
普通构造函数
String::String(
const
char
*
str)
{
if
(str
==
NULL)
{
m_data
=
new
char
[
1
];
//
得分点:对空字符串自动申请存放结束标志'\0'的空
//
加分点:对m_data加NULL 判断assert(m_data != NULL);
*
m_data
=
'
\0
'
;
}
else
{
int
length
=
strlen(str);
m_data
=
new
char
[length
+
1
];
//
若能加 NULL 判断则更好
strcpy(m_data, str);
}
}
//
String的析构函数
String::
~
String(
void
)
{
delete [] m_data;
//
或delete m_data;
}
//
拷贝构造函数
String::String(
const
String
&
other)
//
得分点:输入参数为const型
{
int
length
=
strlen(other.m_data);
m_data
=
new
char
[length
+
1
];
//
加分点:对m_data加NULL 判断 assert(m_data != NULL);
strcpy(m_data, other.m_data);
}
//
赋值函数
String
&
String::operate
=
(
const
String
&
other)
//
得分点:输入参数为const型
{
if
(
this
==
&
other)
//
得分点:检查自赋值
return
*
this
;
delete [] m_data;
//
得分点:释放原有的内存资源
int
length
=
strlen( other.m_data );
m_data
=
new
char
[length
+
1
];
//
加分点:对m_data加NULL 判断 assert(m_data != NULL);
strcpy( m_data, other.m_data );
return
*
this
;
//
得分点:返回本对象的引用
}
剖析:
能够准确无误地编写出String类的构造函数、拷贝构造函数、赋值函数和析构函数的面试者至少已经具备了C++基本功的60%以上!
在这个类中包括了指针类成员变量m_data,当类中包括指针类成员变量时,一定要重载其拷贝构造函数、赋值函数和析构函数,这既是对C++程序员的基本要求,也是《Effective C++》中特别强调的条款。
三、实现strcpy函数
已知strcpy函数的原型是:
char * strcpy(char * strDest,const char * strSrc);
不调用库函数,实现strcpy函数。
char
*
strcpy(
char
*
strDest,
const
char
*
strSrc)
{
if
((strDest
==
NULL)
||
(strSrc
==
NULL))
//
[1]
throw
"
Invalid argument(s)
"
;
//
[2]
char
*
strDestCopy
=
strDest;
//
[3]
while
((
*
strDest
++=*
strSrc
++
)
!=
'
\0
'
);
//
[4]
return
strDestCopy;
}