| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3352 人关注过本帖, 1 人收藏
标题:一个c++程序改错的面试题
只看楼主 加入收藏
佳嘉
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:534
专家分:1383
注 册:2009-11-8
结帖率:96.55%
收藏(1)
已结贴  问题点数:100 回复次数:13 
一个c++程序改错的面试题
第一次看到这个题目,觉得很简单,可仔细一看,发现自己不会做,感觉自己太菜了!
题目的要求是改正程序中的错误:
#include <iostream>
using namespace std;
class Test{
public:
    int *p;
    Test(int value){
        p=new int(value);
    }
    ~Test(){
        delete p;
    }
    void PrintValue()
    {
        cout<<"The value is"<<*p<<endl;
    }
};
void Func(Test t)

{
   cout<<"In the Func"<<endl;
}
int main(){
    Test t1=33;
    Func(t1);
    t1.PrintValue();  

    return 0;
}

我的问题是:
1,程序有几个错误,该如何改正;
2,为什么Test t1=33;没有错误;
3,这个程序运行结果为
   In the Func
   The value is-572662307
如果去掉Func(t1);
运行结果为:
   The value is33


看到这个题目,觉得自己C++太差了,九月份就该找工作了,该如何是好?~~~~~~~~~~


搜索更多相关主题的帖子: include public return 
2014-02-08 18:39
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:100 
主要是缺少一个拷贝构造函数,加上就行了
    Test(const Test& t)
    {
        p = new int;
        *p = *t.p;
    }

因为Func(t1); 这个地方就会调用会有一个临时变量产生,就会调用了默认的拷贝构造函数的,而默认的拷贝函数会复用t1的p,在这个参数的临时变量析构时候,该地址就被delete掉了,之所以The value is-572662307 就是因为该地址被delete了,一个非法的地址。同时,t1的析构会重复delete这块地址。

还有一个题目,就是叫写一个cstring 类似的类,考点和这个差不多。一般都是要实现构造函数、析构函数、拷贝函数、赋值函数。缺一不可(因为如果没有写,在调用时候可能调用了默认的,这样就隐瞒了bug了,比如该题目)。同时算法要正确,高效最好。

[ 本帖最后由 yuccn 于 2014-2-8 21:02 编辑 ]

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2014-02-08 20:52
佳嘉
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:534
专家分:1383
注 册:2009-11-8
收藏
得分:0 
回复 2楼 yuccn
恩,谢谢,有点懂了
那Test t1=33;是如何转换的?
2014-02-09 10:32
蓝色的blue
Rank: 1
等 级:新手上路
帖 子:35
专家分:7
注 册:2013-10-19
收藏
得分:0 
为什么不用c++的编程风格呢

低调的卓越.........
2014-02-09 11:41
佳嘉
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:534
专家分:1383
注 册:2009-11-8
收藏
得分:0 
回复 4楼 蓝色的blue
怎样算c++风格?
2014-02-09 14:45
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
以下是引用佳嘉在2014-2-9 10:32:00的发言:

恩,谢谢,有点懂了
那Test t1=33;是如何转换的?

由于有 test(int ),而没有重载=运算符,编译器就自动掉了test(int)构造函数,可以用反汇编去看下。
他等价于Test t1(33)了

[ 本帖最后由 yuccn 于 2014-2-10 11:26 编辑 ]

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2014-02-09 18:06
佳嘉
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:534
专家分:1383
注 册:2009-11-8
收藏
得分:0 
回复 6楼 yuccn
谢谢你,有点明白了,我自己再研究研究
2014-02-09 18:45
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
以下是引用yuccn在2014-2-8 20:52:06的发言:

主要是缺少一个拷贝构造函数,加上就行了
    Test(const Test& t)
    {
        p = new int;
        *p = *t.p;
    }
 
因为Func(t1); 这个地方就会调用会有一个临时变量产生,就会调用了默认的拷贝构造函数的,而默认的拷贝函数会复用t1的p,在这个参数的临时变量析构时候,该地址就被delete掉了,之所以The value is-572662307 就是因为该地址被delete了,一个非法的地址。同时,t1的析构会重复delete这块地址。
 
还有一个题目,就是叫写一个cstring 类似的类,考点和这个差不多。一般都是要实现构造函数、析构函数、拷贝函数、赋值函数。缺一不可(因为如果没有写,在调用时候可能调用了默认的,这样就隐瞒了bug了,比如该题目)。同时算法要正确,高效最好。
佩服
2014-02-10 08:45
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
有一个关键字叫explicit,有一个名词叫隐式类型转换、

离恨恰如春草,更行更远还生。
2014-02-10 14:29
相互学习啊
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-2-17
收藏
得分:0 
去百度面试,也是让我改错。。我是菜鸟,不懂啊,被鄙视的一塌糊涂。。。

我是老菜鸟。。。
2014-02-20 17:50
快速回复:一个c++程序改错的面试题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018233 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved