新足迹

 找回密码
 注册

精华好帖回顾

· 对不起了,馋死人不偿命的扣肉来了 (2007-12-18) hattie · 出月子后做的第一餐饭! (2009-4-16) tinanakoo
· 别了10~11赛季 (2011-5-29) tld128 · 难忘一刻征文:亲爱的小孩 (2005-1-24) sail
Advertisement
Advertisement
查看: 1616|回复: 17

C++高手请进 [复制链接]

发表于 2010-8-4 21:04 |显示全部楼层
此文章由 juncom 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 juncom 所有!转贴必须注明作者、出处和本声明,并保持内容完整
正在准备IKM测试。请大家看看这几道题。

Question: Protected, or private, inheritance, as opposed to public inheritance, models which type of relationship in C++?

        A.         Has-a
        B.         Is-implemented-in-terms-of
        C.         Was-a
        D.         Can-only-have-one-of
        E.         Shares-a-relationship-with
我选A。因为Protected and private inheritance类似composition的作用,所以是Has-a的关系。但不太确定B是否也正确。


Question: Which of the following statements describe correct methods of handling C++ exceptions?
        A.         Once an exception is thrown, the compiler unwinds the heap, freeing any memory dynamically allocated within the block from which the exception was thrown.
        B.         In a hierarchy of exception classes, the order of handling exceptions can be from the most specific class to the most general class.
        C.         If an exception is caught by its address or pointer, it is the responsibility of the thrower to release the memory occupied by the exception.
        D.         Catching an exception by reference is preferable to catching it by value.
        E.         To write an exception handler, it is essential to know the concrete class of exception to catch.

感觉B和D是对的。但对A不太确定。如果try clause里有new operator, 程序不能自己释放内存。况且程序unwinds the stack, not the heap.

[ 本帖最后由 juncom 于 2010-8-4 20:35 编辑 ]
Advertisement
Advertisement

发表于 2010-8-4 21:12 |显示全部楼层
此文章由 fishyoyo 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fishyoyo 所有!转贴必须注明作者、出处和本声明,并保持内容完整
LZ理解正确,答案是A

发表于 2010-8-4 21:16 |显示全部楼层
此文章由 cynosure 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cynosure 所有!转贴必须注明作者、出处和本声明,并保持内容完整
第一题:A (相当于composition)

参考: http://www.parashift.com/c++-faq-lite/private-inheritance.html , Inheritance — private and protected inheritance

[ 本帖最后由 cynosure 于 2010-8-4 20:18 编辑 ]

发表于 2010-8-4 21:23 |显示全部楼层
此文章由 cynosure 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cynosure 所有!转贴必须注明作者、出处和本声明,并保持内容完整
第二题为什么D是错的?我一般都是扔出/捕获一个引用。参考:
http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.7 : Given all this flexibility, how do you decide what to catch? Simple: unless there's a good reason not to, catch by reference. Avoid catching by value, since that causes a copy to be made and the copy can have different behavior from what was thrown. Only under very special circumstances should you catch by pointer.

发表于 2010-8-4 21:34 |显示全部楼层
此文章由 juncom 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 juncom 所有!转贴必须注明作者、出处和本声明,并保持内容完整
呵呵,看来有不少C++专家。

再来看看这道题。
Question: Which of the following statements regarding functions' default arguments in C++ are correct?

        A.         Default arguments cannot be of pointer type.
        B.         Default arguments cannot be of a user-defined type.
        C.         Default arguments can never precede non-default arguments.
        D.         Default arguments exist in the global heap and not on the function's stack.
        E.         Default arguments are not considered for generating the function's signature.

C应该是对的。但不确定D和E。it doesn't make sense to store default arguments in global heap. 而E含意不清,不知它是仅指default values还是整个参数定义。defualt values 不会被包含在signature中。但the type of dafault argument 应该包括在signature中。

发表于 2010-8-4 21:36 |显示全部楼层
此文章由 juncom 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 juncom 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 cynosure 于 2010-8-4 20:23 发表
第二题为什么D是错的?我一般都是扔出/捕获一个引用。参考:
http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.7 : Given all this flexibility, how do you decide what to catch? Simple: unless there's ...


不好意思,我输入错误。D应该是对的。
Advertisement
Advertisement

发表于 2010-8-5 14:13 |显示全部楼层
此文章由 cynosure 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cynosure 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 juncom 于 2010-8-4 20:34 发表
呵呵,看来有不少C++专家。

再来看看这道题。
Question: Which of the following statements regarding functions' default arguments in C++ are correct?
。。。
        D. Default arguments exist in the global heap and not on the function's stack.
        E. Default arguments are not considered for generating the function's signature.


D应该是错的,一个可能的验证方法:把一个临时对象当作默认参数,如果函数调用以后此对象析构,则它应该在栈中而不是在堆中。

E可能是对的,一个可能的验证方法:overload一个含有默认参数的函数,比如:
class A
{
    void foo(int i, int j=0);
    void foo(int i);
};
编译器应该会报错说重复定义,如果真的如此报错了,就说明int j=0并不是signature的一部分。

以上两个答案和方法都基于记忆,并没有测试过,你自己试验看看。

发表于 2010-8-6 00:42 |显示全部楼层
此文章由 juncom 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 juncom 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 cynosure 于 2010-8-5 13:13 发表


D应该是错的,一个可能的验证方法:把一个临时对象当作默认参数,如果函数调用以后此对象析构,则它应该在栈中而不是在堆中。

E可能是对的,一个可能的验证方法:overload一个含有默认参数的函数,比如:
class A
{
    void foo( ...



刚试了一下。没有报错。所以应该包括在signature中。(但在调用foo(10)时,会有“ambiguous call to overloaded function”报错)

发表于 2010-8-6 01:18 |显示全部楼层
此文章由 garysmith 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 garysmith 所有!转贴必须注明作者、出处和本声明,并保持内容完整
高人!

什么考试会这么缺德? C++是用的,不是记的,而且这些特性在平时能用上几回? 对不对上机一编译不都知道了。

发表于 2010-8-6 09:27 |显示全部楼层
此文章由 garysmith 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 garysmith 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 cynosure 于 2010-8-4 20:16 发表
第一题:A (相当于composition)

参考: http://www.parashift.com/c++-faq-lite/private-inheritance.html , Inheritance — private and protected inheritance



私有继承似乎平时很少用,既然相当与组合,直接用组合最简单。

似乎C++式微的原因在于一个功能可由多个方法实现,太复杂了。现在只用boost,STL,类, 引用和结构,连指针都不用了。那些高级方法在实际中没大用,除非你本身是作c++系统库的。

[ 本帖最后由 garysmith 于 2010-8-6 08:29 编辑 ]

发表于 2010-8-6 10:10 |显示全部楼层
此文章由 rogerk 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rogerk 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 cynosure 于 2010-8-5 13:13 发表


D应该是错的,一个可能的验证方法:把一个临时对象当作默认参数,如果函数调用以后此对象析构,则它应该在栈中而不是在堆中。

E可能是对的,一个可能的验证方法:overload一个含有默认参数的函数,比如:
class A
{
    void foo( ...


函数的signature中不包括default argument. 这个意思是说,如果你这样写两个函数
void foo(int i, int j = 0)
void foo(int i, int j = 10)
他们其实是一个。因为函数的signature其实是 foot_int_int, 不管你default的值是多少。

像你上面例子里那两个函数,当然是两个,因为参数表都不一样。但是你调用的时候,如果你写foo(5), 编译器不知道你到底要调用的是哪一个,因为两个都能套上,所以才会报错误。
Advertisement
Advertisement

发表于 2010-8-6 10:35 |显示全部楼层
此文章由 rogerk 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rogerk 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 juncom 于 2010-8-4 20:34 发表 [url=http://www.oursteps.com.au/bbs/redirect.php?Question: Which of the following statements regarding functions' default arguments in C++ are correct?

        A.         Default arguments cannot be of pointer type.
        B.         Default arguments cannot be of a user-defined type.
        C.         Default arguments can never precede non-default arguments.
        D.         Default arguments exist in the global heap and not on the function's stack.
        E.         Default arguments are not considered for generating the function's signature.

C应该是对的。但不确定D和E。it doesn't make sense to store default arguments in global heap. 而E含意不清,不知它是仅指default values还是整个参数定义。defualt values 不会被包含在signature中。但the type of dafault argument 应该包括在signature中。



D说的不确切,所以也是不对的。default value其实无所谓在哪里,只要你在声明函数的时候能够访问到就可以了。这个value可以存在在static data里,也可以在heap里,但是不能是stack上的值,因为这样没法声明。stack上的值一般是在一个scope里面,但是default argument value你在声明函数的时候就应该能够访问,所以,至少没有简单直接的办法这么做。


随便写了点例子给你看看:

// Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

//value in static data

static int static_value = 10;
void foo (int i, int j = static_value)
{
        printf("%d, %d\n", i, j);
}


//object in static data
class StaticClass
{
public:
        int value;

        StaticClass(int value)
        {
                this->value = value;
        }
};

static StaticClass static_class(20);
void foo1 (int i, StaticClass& s = static_class)
{
        printf("%d, %d\n", i, s.value);
}

//object in global heap as default argument
static StaticClass* static_class_heap = new StaticClass(30);
void foo2 (int i, StaticClass* s = static_class_heap)
{
        printf("%d, %d\n", i, s->value);
}

// using member variable as default value is NOT permitted.
// Also, since declaring function inside function is not allowed,
// I am not aware of any way to use stack value as default argument value since you must have access to the default value when you
// declare the function.

class StackClass
{
public:
        int value;
        StackClass(int value)
        {
                this->value = value;
        }

// error C2648: 'StackClass::value' : use of member as default parameter requires static member
        //void foo(int i, int j = value)
        //{
        //        printf("%d, %d\n", i, j);
        //}
};

int _tmain(int argc, _TCHAR* argv[])
{
        foo(5);

        foo1(6);

        foo2(7);

        //StackClass s(40);
        //s.foo(5);

        return 0;
}

[ 本帖最后由 rogerk 于 2010-8-6 09:37 编辑 ]

发表于 2010-8-6 12:46 |显示全部楼层
此文章由 juncom 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 juncom 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rogerk 于 2010-8-6 09:35 发表



D说的不确切,所以也是不对的。default value其实无所谓在哪里,只要你在声明函数的时候能够访问到就可以了。这个value可以存在在static data里,也可以在heap里,但是不能是stack上的值,因为这样没法声明。stack上的值一 ...


谢谢rogerk。我稍微修改了下你的代码,用一个临时对象做default value (按照cynosure的建议)。发现在函数结束之后,此对象的析构函数被调用。所以default参数也可以在堆栈中的。

class StaticClass
{
public:
        int value;

        StaticClass(int value)
        {
                this->value = value;
        }

        virtual ~StaticClass() {
                cout << "destructor is called" << endl;
        }
};

void foo1 (int i, StaticClass& s = StaticClass(10))
{
        printf("%d, %d\n", i, s.value);
}

调用foo1(2);
输出:

2, 10
destructor is called

发表于 2010-8-6 12:49 |显示全部楼层
此文章由 rogerk 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rogerk 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 juncom 于 2010-8-6 11:46 发表


谢谢rogerk。我稍微修改了下你的代码,用一个临时对象做default value (按照cynosure的建议)。发现在函数结束之后,此对象的析构函数被调用。所以default参数也可以在堆栈中的。

class StaticClass
{
public:
        i ...


恩,你这个是对的,那就是说default value其实无所谓在哪里,只要你在声明函数的时候能够访问到就可以了。这个default value不是编译期的东西,而是runtime的变量。编译期其实不处理这个default值的。

发表于 2010-8-6 12:49 |显示全部楼层
此文章由 juncom 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 juncom 所有!转贴必须注明作者、出处和本声明,并保持内容完整
ANYWAY, 谢谢大家。昨晚已经做了IKM测试。题目和网上流传的非常相似,说明IKM题库量很小。为了避免得高分,还得故意做错几道题。

发表于 2010-8-6 17:11 |显示全部楼层
此文章由 bigwood 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bigwood 所有!转贴必须注明作者、出处和本声明,并保持内容完整
哪里有网上流传的题目?
Advertisement
Advertisement

发表于 2010-8-7 02:45 |显示全部楼层
此文章由 juncom 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 juncom 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你GOOGLE IKM C++, 在第一页的百度文库链接里。

发表于 2010-8-7 04:49 |显示全部楼层
此文章由 kawara 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kawara 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原来你们的高分是这么来的

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部