注册 登录
编程论坛 C++教室

一个c++程序改错的面试题

佳嘉 发布于 2014-02-08 18:39, 3352 次点击
第一次看到这个题目,觉得很简单,可仔细一看,发现自己不会做,感觉自己太菜了!
题目的要求是改正程序中的错误:
#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++太差了,九月份就该找工作了,该如何是好?~~~~~~~~~~


13 回复
#2
yuccn2014-02-08 20:52
主要是缺少一个拷贝构造函数,加上就行了
    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 编辑 ]
#3
佳嘉2014-02-09 10:32
回复 2楼 yuccn
恩,谢谢,有点懂了
那Test t1=33;是如何转换的?
#4
蓝色的blue2014-02-09 11:41
为什么不用c++的编程风格呢
#5
佳嘉2014-02-09 14:45
回复 4楼 蓝色的blue
怎样算c++风格?
#6
yuccn2014-02-09 18:06
以下是引用佳嘉在2014-2-9 10:32:00的发言:

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

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

[ 本帖最后由 yuccn 于 2014-2-10 11:26 编辑 ]
#7
佳嘉2014-02-09 18:45
回复 6楼 yuccn
谢谢你,有点明白了,我自己再研究研究
#8
tlliqi2014-02-10 08:45
以下是引用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了,比如该题目)。同时算法要正确,高效最好。
佩服
#9
玩出来的代码2014-02-10 14:29
有一个关键字叫explicit,有一个名词叫隐式类型转换、
#10
相互学习啊2014-02-20 17:50
去百度面试,也是让我改错。。我是菜鸟,不懂啊,被鄙视的一塌糊涂。。。
#11
华子hear2014-02-26 22:39
回复 10楼 相互学习啊
好厉害都去百度了!
#12
华子hear2014-02-26 22:41
回复 2楼 yuccn
到位
#13
相互学习啊2014-03-17 16:52
回复 11楼 华子hear
我仅仅去面试。。。。。
#14
xlhcy20142014-03-17 23:49
也可以把  Void Func(Test t)  改成  Void  Func(Test &t), 不构造副本就行了。
1