免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7508 | 回复: 25
打印 上一主题 下一主题

[C++] 经常见到的一个的面试题。。 [复制链接]

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-15 23:42 |只看该作者 |倒序浏览
本帖最后由 ilex 于 2013-07-16 22:17 编辑

【题:】编写类String的构造函数、析构函数和赋值函数,已知类String的原型为
class String
{
 public:
  String(constchar*str = NULL); // 普通构造函数
  String(const String &other); // 拷贝构造函数
  ~ String(void); // 析构函数
  String & operator =(const String &other); // 赋值函数
 private:
  char*m_data; // 用于保存字符串
};
 解答:
//普通构造函数
String::String(constchar*str)
{
 if(str==NULL)
 {
  m_data =newchar[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的空
  //加分点:对m_data加NULL 判断
  *m_data ='\0';
 }
 else
 {
  int length = strlen(str);
  m_data =newchar[length+1]; // 若能加 NULL 判断则更好
  strcpy(m_data, str);
 }
}
// String的析构函数
String::~String(void)
{
 delete [] m_data; // 或deletem_data;
}
//拷贝构造函数
String::String(const String &other)    // 得分点:输入参数为const型
{
 int length = strlen(other.m_data);
 m_data =newchar[length+1];     //加分点:对m_data加NULL 判断
 strcpy(m_data, other.m_data);
}
//赋值函数
String & String:perator =(const String &other) // 得分点:输入参数为const型
{
 if(this==&other)   //得分点:检查自赋值
  return*this;
 delete [] m_data;     //得分点:释放原有的内存资源
 int length = strlen( other.m_data );
 m_data =newchar[length+1];  //加分点:对m_data加NULL 判断
 strcpy( m_data, other.m_data );
 return*this;         //得分点:返回本对象的引用
}


最近在整理一份面试题库,抄来抄去抄到这个题了,其实是有错误(编辑一下,不是错误是有点不够完善,如楼下的所说的,new没有判断是否为NULL)的,但发现网上到处都是这个样子,那些转博客的人貌似也就是转转罢了,都不细纠代码。


论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2013-07-16 08:27 |只看该作者
你总得说说错在什么地方吧?!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2013-07-16 08:28 |只看该作者
好像出自林锐的那本书

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
4 [报告]
发表于 2013-07-16 10:01 |只看该作者
回帖攒积分

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
5 [报告]
发表于 2013-07-16 10:20 |只看该作者
  1. int length = strlen(str);
  2.   m_data =newchar[length+1]; // 若能加 NULL 判断则更好
  3.   strcpy(m_data, str);
复制代码
这是为了凑代码行数?

另外,作为基础类,诸如内存异常是必须处理的吧?

论坛徽章:
0
6 [报告]
发表于 2013-07-16 18:28 |只看该作者
哪有错 没看出来

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
7 [报告]
发表于 2013-07-17 09:05 |只看该作者
mightofcode 发表于 2013-07-16 18:28
哪有错 没看出来

我也没看出来,作为示例代码这完全够了,加上完善的细枝末节代码反而会影响自己所想表达的代码。
但楼主草鸡毛,没说出他认为不正确的地方。我猜可能指的是其注释,比如“加NULL 判断”等

要我说这段代码中最的就是 检查字符串指针值是否为NULL 的行为了
String::String( const char* str )
{
 if(str==NULL)

总有一些人鼓吹要检查str是否NULL,还觉得自己这种行为是严谨细致的表现,其实是个半吊子。
想想C中的strcpy,检查参数为NULL了吗?想想C++中的std::string,检查参数为NULL了吗?保证 错误的行为得到错误的结果 才是正常的做法。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2013-07-17 09:17 |只看该作者
bruceteen 发表于 2013-07-17 09:05
我也没看出来,作为示例代码这完全够了,加上完善的细枝末节代码反而会影响自己所想表达的代码。
但楼主 ...


可能是说缺省new失败时抛异常,当然VC6不是

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
9 [报告]
发表于 2013-07-17 11:52 |只看该作者
一般的程序,new失败了直接跪了就好,没内存了还怎么搞?

另外如8楼所说,正常编译器new失败要抛异常的,判断是否为NULL有啥用。

论坛徽章:
0
10 [报告]
发表于 2013-07-22 00:32 |只看该作者
本帖最后由 jackarain 于 2013-07-22 00:41 编辑
if(str==NULL)

总有一些人鼓吹要检查str是否NULL,还觉得自己这种行为是严谨细致的表现,其实是个半吊子。



说的太对了, 因为有些东西, 不是半吊子能掌握的, 半吊子就是半吊子, 写出的代码, 一眼就可以看出半吊子! 还面试人呢!

我已经N次拿memcpy/strcpy跟很多人讲这个问题, 可是, 天朝程序员基本上领味不到我在说什么, 偏偏一意孤行的, 检查这, 检查
那, 最后就是一团"面条代码"而不自知, 这种"面条代码", 无论如何乱来, 怎么调用都保证不会出错! 这就是那些人追求的稳定性!兼容性!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP