一家公司的笔试题目 欢迎解答

时间:2021-08-01 03:12:17
1.1~1.4 too easy to be ignored.

1.5 Which of the following class DOES NOT need a copy constructor?
    a.A matrix class in which the actual matrix is allocated dynamically 
      within the constructor and is deleted within its destructor.
    b.A payroll class in which each object is provided with a unique ID.
    c.A word class containing a string object and vector object of line 
      and column location pairs.
    d.A library class containing a list of book object.

1.6 What is the color of the pixel at x,y?
    int x = 100,y = 100;
    putpixel(x,y,RED);
    if(getpixel(x,y)==RED)
    {
        putpixel(x,y,GREEN);
    }
    if(getpixel(x,y)==BLUE)
    {
        putpixel(x,y,YELLOW);
    }
    if(getpixel(x,y)==GREEN)
    {
        putpixel(x,y,BLUE);
    }

    a.RED
    b.GREEN
    c.YELLLOW
    d.BLUE
1.7 What is the output of the following code?
    void turn_left(int dir)
    {
        dir = (dir - 1);
    }
    void turn_right(int *p_dir)
    {
        *p_dir = (*p_dir + 1);
    }
    
    int main()
    {
        int dir1 = 3, dir2 = 3;
        turn_left(dir1);
        turn_right(&dir2);
        printf(“%d %d”,dir1,dir2);
        return 0;
    }

    a.3 3
    b.3 4
    c.2 3
    d.none of the above

1.8 Which virtual function redeclarations of the Derived class are correct?
    a. Base* Base::copy(Base*);
       Base* Derived::copy(Derived*);
    b. Base* Base::copy(Base*);
       Derived* Derived::copy(Base*);
    c. ostream& Base::print(int,ostream&=cout);
       ostream& Derived::print(int,ostream&);
    d. void Base::eval() const;
       void Derived::eval();

最近小弟被电话面试 问到了一个问题 在c语言中如何调用c++的代码 反之如何

58 个解决方案

#1


ddddddddddddddddddddddddddddddddd

#2


1.5 B
1.6 D
1.7 B
1.8 B

#ifndef __cplusplus
extern "C"
{
#endif
....

#ifndef __cplusplus
};
#endif

#3


C
D
B
B

#4


jiajun2001(嘉俊)正解:

1.5 B中只有一个id成员,用默认的bitwise copy即可.
1.6 D
1.7 3 4     一个是传值,一个是传址,前者不改变参数,后者会改变
1.8 B 只有B才符合多态机制, 其它的都不是多态了,而是重载.

#5


支持楼上~
1.7实质是考形参和实参关系~

#6


1.5 b each object is provided with a unique ID
如果不提供copy constructor, 用默认的bitwise copy, 那么就存在两个object拥有同样的ID,当然不可以了

#7


接着说一下,我的意识是说1.5 b 需要copy constructor

#8


呵呵,请问楼上的,你提供copy constructor,如何使得ID唯一?
要求是赋值操作,必然需要相同的ID才可以。

#9


1.6 D
1.7 B

我只知道这两个:(

#10


楼上高见,又长见识了!!

#11


b
d
b
b
最后一题知道考多态,但英语有点犯晕,再加上这块熟悉度不高,有点猜的痕迹

#12


英语笔试,--
不过总比英语面试好对付,总还能看懂

#13


我也只知道2个 1.6的D 1.7的B
其他真的是长见识了。

#14


1.5 c
大部分是从c++ primer上的习题

#15


个人认为1.5应该选c.

按照b选项的题意,A payroll class in which each object is provided with a unique ID
默认复制构造的话,则不会有uniqueID了!

c.A word class containing a string object and vector object of line 
and column location pairs.
string object和vector,是有复制构造的,所以vector和string的复制构造将被触发,而不是简单的按位copy。(Inside C++ Object Model)

d没说清楚,list好象也有复制构造..

讨论。

#16


支持 qfeng_zhao(天天向上) :
    1.5 c.
    在1.5 b中, 不自定义拷贝构造函数的话, 势必造成两个对象的ID不唯一. 至于说自定义了拷贝构造函数之后, 如何保证新对象的ID唯一, 那是实现的问题. 方法有多种多样, 比如可以使用当前的系统tick数作为新ID. 当然语义上有损失, 不是完全意义上的拷贝, 但在这儿只能在保持语义和实现目的之间来一个折衷.
    我cd的原因: 使用缺省的拷贝构造, string子对象和vector子对象, 它们的类都是成熟的类, 都有合适的赋值操作/拷贝构造函数(?)来避免"浅拷贝"问题.

#17


1.8
overload:重载。指同一个类中不同参数的相同方法。
override:重写。指子类中重新定义父类中的同名同参方法。
多态:父类的指针指向子类的实例,从使用虚函数表来确定动态连编到哪一个方法指针

a, c ,d是重载,(overload),但b绝不是重写(override),当然更加不是多态!

#18


1.5 B//只要有指针,就需有copy construction,else it only can be  浅-Copy
1.6 D
1.7 B
1.8 B//B符合重载.
    a. Base* Base::copy(Base*);
       Base* Derived::copy(Derived*);//多态--参数类型不同
    b. Base* Base::copy(Base*);
       Derived* Derived::copy(Base*);//重载不看return value
    c. ostream& Base::print(int,ostream&=cout);//---既可用作一个参数,也可用于2个参数
       ostream& Derived::print(int,ostream&);//拥有2个参数//二义
    d. void Base::eval() const;
       void Derived::eval();//[const] can distinct multi-态

#19


什么叫virtual function redeclaration? 
:-(

#20


mark

#21


1.5  C

如果m是类C中类型为T的非静态数据成员,并且C没有声明拷贝构造函数(赋值运算符),m将会通过类型T的拷贝构造函数(赋值运算符)被拷贝构造(赋值)---- 如果T有拷贝构造函数(赋值运算符)的话。如果没有,规则递归应用到m的数据成员,直至找到一个拷贝构造函数(赋值运算符)或固定类型(例如,int,double,指针,等)为止..

#22


哎呀,只学过C,只能看懂中间的两个。。。。
答案都贴出来了,我就不贴了^()^

#23


1.5 b

我觉得c中用默认的copy constructor就可以了

#24


靠,说反了,收回我上面的回答,应该是 1.5 c

#25


learning

#26


大家都错了: 1.8 c
问的是哪个派生类的虚函数再声明是对的. 
a是重载;b会导致编译错误;c是真正的多态;d是重载.

#27


agree with wanguodu.

#28


补充一下;
    我是在VC6下测的, 在G++下, 1.8 b也是多态. 看了VC6的帮助, 它明确指出了覆盖的虚函数必须返回类型与父类的同名函数一致, 但是张*那本书上说只要返回的多态指针一致就可以了. 哪位熟悉标准的大虾帮忙解释一下这到底是咋回事?

#29


我被搞糊涂了,看看书先

另外,纠正楼主一个错误:
1.1~1.4 too easy to be ignored.//

too ... to do something 

好象不是你说的那个意思




#30


derived class的虚函数的返回类型可以是base class中对应虚函数的返回类型的public derived class.
而VC6.0不支持..

#31


补充的补充:
    所谓多态指针的一致, 是指"子类虚函数返回的多态指针的静态类型是父类虚函数所返回的多态指针的动态类型集合中的某个类型", 张老师的原话.

#32


到底1.5 和1.8是谁说得对阿 小弟糊涂了
还有就是 怎么样在c中调用c++代码 好像没人回答

#33


list(   const _list& _Right);
vector(   const _vector& _Right);

考虑天天向上的意见(当然我也想到了,只是引用别人的话,要说一声,版权呀):
如果不提供copy constructor, 用默认的bitwise copy, 那么就存在两个object拥有同样的ID,当然不可以了。
============================================================================
感觉c,d都不需要copy constructor。b的情况不好说,因为如果提供copy constructor,保证ID唯一,则不能以传值方式传递参数,只能以传引用方式传递参数,否则,传进去之后ID变了,用户程序员对这种情况是很难适应的,因此程序容易出错。再者,这也不符合copy constructor的语义。所以我认为b还是不应该有copy constructor,可以在缺省高燥函数里保证ID的唯一性,且应该把ID这个成员变量设为const,例如const int m_ID,一旦在初始化表达式中赋值,就不能更改,防止以后有变化又危害ID的唯一性。

#34


天书!
郁闷~

#35


问题:在c语言中如何调用c++的代码 反之如何
嘉俊网友给出了在C++中调用C的方法:
#ifndef __cplusplus
extern "C"
{
#endif
....

#ifndef __cplusplus
};
#endif
在c语言中如何调用c++的代码是很难的,因为C++的name mangling导致C++ DLL导出的类的方法或函数都被改了名字(除了函数前有extern "C"的情况),如果硬要用,只能根据dependency walker(depends.exe)显示的导出函数名和原先的头文件写一个新的头文件,用于在C工程中包含,但谁会这么做呢?

#36


1.5 b
1.5 c应该需要一个拷贝构造函数!基本的思想好像类似于*写的设计模式中给出的那个面向对象的文本编辑器的那个例子!

#37


singlton?!

#38


个人觉得1.5应该选c

#39


deping_chen(小平),我犯了一个错误,你都不给我纠正,真是的;)。我自己来纠正吧

C中调用C++的函数应该是
#ifdef __cplusplus
extern "C"
{
#endif

......

#ifdef __cplusplus
}
#endif

这种情况下,不管是C还是C++都可以调用的。但是如果遇到类怎么办呢?
我这里有一个方法,请大家参考:
类起始跟结构很相似的,如果把类的指针传给C程序,这样,C程序看见的将是一个结构,就可以从这个“结构”里面取道函数地址。这样做是没有问题的,能把这个函数的地址取出来,而且给他赋一个this指针以后,就能在C中调用C++的成员函数。下面是一个简单的例子。
class class_abc
{
     void fun( int a, int b, int c );
}

extern "C" class_abc_func( void *lpthis, int a, int c )
{
     ( (class_abc *)lpthis)->fuc( int a, int b, int c );
}

int main( int argc, char* argv[] )
{
    int a = 1, b = 2, c =3;
    class_abc abc

    class_abc_fuc( ( void *)&abc, a, b, c );

    return 0;
}

#40


最后更正 1.7 选 C

#41


嘉俊老弟这次绝对不改啦?

#42


不改了;)

#43


...

#44


又长见识了

#45


#ifdef __cplusplus
extern "C"
{
#endif

......

#ifdef __cplusplus
}
#endif
这个是c++的代码调用c函数的用法

最后一题太叩门了,而且ostream& Base::print(int,ostream&=cout);很明显的语法错误

#46


mark

#47


mark

#48


mark

#49


to jiajun2001(嘉俊):

jiajun2001(嘉俊) ( ) 信誉:101  2005-9-29 20:30:56  得分: 0  
   
最后更正 1.7 选 C
==============

显然选B阿, 为什么选c? 
  
 

#50


1.5

1.8

不明白

#1


ddddddddddddddddddddddddddddddddd

#2


1.5 B
1.6 D
1.7 B
1.8 B

#ifndef __cplusplus
extern "C"
{
#endif
....

#ifndef __cplusplus
};
#endif

#3


C
D
B
B

#4


jiajun2001(嘉俊)正解:

1.5 B中只有一个id成员,用默认的bitwise copy即可.
1.6 D
1.7 3 4     一个是传值,一个是传址,前者不改变参数,后者会改变
1.8 B 只有B才符合多态机制, 其它的都不是多态了,而是重载.

#5


支持楼上~
1.7实质是考形参和实参关系~

#6


1.5 b each object is provided with a unique ID
如果不提供copy constructor, 用默认的bitwise copy, 那么就存在两个object拥有同样的ID,当然不可以了

#7


接着说一下,我的意识是说1.5 b 需要copy constructor

#8


呵呵,请问楼上的,你提供copy constructor,如何使得ID唯一?
要求是赋值操作,必然需要相同的ID才可以。

#9


1.6 D
1.7 B

我只知道这两个:(

#10


楼上高见,又长见识了!!

#11


b
d
b
b
最后一题知道考多态,但英语有点犯晕,再加上这块熟悉度不高,有点猜的痕迹

#12


英语笔试,--
不过总比英语面试好对付,总还能看懂

#13


我也只知道2个 1.6的D 1.7的B
其他真的是长见识了。

#14


1.5 c
大部分是从c++ primer上的习题

#15


个人认为1.5应该选c.

按照b选项的题意,A payroll class in which each object is provided with a unique ID
默认复制构造的话,则不会有uniqueID了!

c.A word class containing a string object and vector object of line 
and column location pairs.
string object和vector,是有复制构造的,所以vector和string的复制构造将被触发,而不是简单的按位copy。(Inside C++ Object Model)

d没说清楚,list好象也有复制构造..

讨论。

#16


支持 qfeng_zhao(天天向上) :
    1.5 c.
    在1.5 b中, 不自定义拷贝构造函数的话, 势必造成两个对象的ID不唯一. 至于说自定义了拷贝构造函数之后, 如何保证新对象的ID唯一, 那是实现的问题. 方法有多种多样, 比如可以使用当前的系统tick数作为新ID. 当然语义上有损失, 不是完全意义上的拷贝, 但在这儿只能在保持语义和实现目的之间来一个折衷.
    我cd的原因: 使用缺省的拷贝构造, string子对象和vector子对象, 它们的类都是成熟的类, 都有合适的赋值操作/拷贝构造函数(?)来避免"浅拷贝"问题.

#17


1.8
overload:重载。指同一个类中不同参数的相同方法。
override:重写。指子类中重新定义父类中的同名同参方法。
多态:父类的指针指向子类的实例,从使用虚函数表来确定动态连编到哪一个方法指针

a, c ,d是重载,(overload),但b绝不是重写(override),当然更加不是多态!

#18


1.5 B//只要有指针,就需有copy construction,else it only can be  浅-Copy
1.6 D
1.7 B
1.8 B//B符合重载.
    a. Base* Base::copy(Base*);
       Base* Derived::copy(Derived*);//多态--参数类型不同
    b. Base* Base::copy(Base*);
       Derived* Derived::copy(Base*);//重载不看return value
    c. ostream& Base::print(int,ostream&=cout);//---既可用作一个参数,也可用于2个参数
       ostream& Derived::print(int,ostream&);//拥有2个参数//二义
    d. void Base::eval() const;
       void Derived::eval();//[const] can distinct multi-态

#19


什么叫virtual function redeclaration? 
:-(

#20


mark

#21


1.5  C

如果m是类C中类型为T的非静态数据成员,并且C没有声明拷贝构造函数(赋值运算符),m将会通过类型T的拷贝构造函数(赋值运算符)被拷贝构造(赋值)---- 如果T有拷贝构造函数(赋值运算符)的话。如果没有,规则递归应用到m的数据成员,直至找到一个拷贝构造函数(赋值运算符)或固定类型(例如,int,double,指针,等)为止..

#22


哎呀,只学过C,只能看懂中间的两个。。。。
答案都贴出来了,我就不贴了^()^

#23


1.5 b

我觉得c中用默认的copy constructor就可以了

#24


靠,说反了,收回我上面的回答,应该是 1.5 c

#25


learning

#26


大家都错了: 1.8 c
问的是哪个派生类的虚函数再声明是对的. 
a是重载;b会导致编译错误;c是真正的多态;d是重载.

#27


agree with wanguodu.

#28


补充一下;
    我是在VC6下测的, 在G++下, 1.8 b也是多态. 看了VC6的帮助, 它明确指出了覆盖的虚函数必须返回类型与父类的同名函数一致, 但是张*那本书上说只要返回的多态指针一致就可以了. 哪位熟悉标准的大虾帮忙解释一下这到底是咋回事?

#29


我被搞糊涂了,看看书先

另外,纠正楼主一个错误:
1.1~1.4 too easy to be ignored.//

too ... to do something 

好象不是你说的那个意思




#30


derived class的虚函数的返回类型可以是base class中对应虚函数的返回类型的public derived class.
而VC6.0不支持..

#31


补充的补充:
    所谓多态指针的一致, 是指"子类虚函数返回的多态指针的静态类型是父类虚函数所返回的多态指针的动态类型集合中的某个类型", 张老师的原话.

#32


到底1.5 和1.8是谁说得对阿 小弟糊涂了
还有就是 怎么样在c中调用c++代码 好像没人回答

#33


list(   const _list& _Right);
vector(   const _vector& _Right);

考虑天天向上的意见(当然我也想到了,只是引用别人的话,要说一声,版权呀):
如果不提供copy constructor, 用默认的bitwise copy, 那么就存在两个object拥有同样的ID,当然不可以了。
============================================================================
感觉c,d都不需要copy constructor。b的情况不好说,因为如果提供copy constructor,保证ID唯一,则不能以传值方式传递参数,只能以传引用方式传递参数,否则,传进去之后ID变了,用户程序员对这种情况是很难适应的,因此程序容易出错。再者,这也不符合copy constructor的语义。所以我认为b还是不应该有copy constructor,可以在缺省高燥函数里保证ID的唯一性,且应该把ID这个成员变量设为const,例如const int m_ID,一旦在初始化表达式中赋值,就不能更改,防止以后有变化又危害ID的唯一性。

#34


天书!
郁闷~

#35


问题:在c语言中如何调用c++的代码 反之如何
嘉俊网友给出了在C++中调用C的方法:
#ifndef __cplusplus
extern "C"
{
#endif
....

#ifndef __cplusplus
};
#endif
在c语言中如何调用c++的代码是很难的,因为C++的name mangling导致C++ DLL导出的类的方法或函数都被改了名字(除了函数前有extern "C"的情况),如果硬要用,只能根据dependency walker(depends.exe)显示的导出函数名和原先的头文件写一个新的头文件,用于在C工程中包含,但谁会这么做呢?

#36


1.5 b
1.5 c应该需要一个拷贝构造函数!基本的思想好像类似于*写的设计模式中给出的那个面向对象的文本编辑器的那个例子!

#37


singlton?!

#38


个人觉得1.5应该选c

#39


deping_chen(小平),我犯了一个错误,你都不给我纠正,真是的;)。我自己来纠正吧

C中调用C++的函数应该是
#ifdef __cplusplus
extern "C"
{
#endif

......

#ifdef __cplusplus
}
#endif

这种情况下,不管是C还是C++都可以调用的。但是如果遇到类怎么办呢?
我这里有一个方法,请大家参考:
类起始跟结构很相似的,如果把类的指针传给C程序,这样,C程序看见的将是一个结构,就可以从这个“结构”里面取道函数地址。这样做是没有问题的,能把这个函数的地址取出来,而且给他赋一个this指针以后,就能在C中调用C++的成员函数。下面是一个简单的例子。
class class_abc
{
     void fun( int a, int b, int c );
}

extern "C" class_abc_func( void *lpthis, int a, int c )
{
     ( (class_abc *)lpthis)->fuc( int a, int b, int c );
}

int main( int argc, char* argv[] )
{
    int a = 1, b = 2, c =3;
    class_abc abc

    class_abc_fuc( ( void *)&abc, a, b, c );

    return 0;
}

#40


最后更正 1.7 选 C

#41


嘉俊老弟这次绝对不改啦?

#42


不改了;)

#43


...

#44


又长见识了

#45


#ifdef __cplusplus
extern "C"
{
#endif

......

#ifdef __cplusplus
}
#endif
这个是c++的代码调用c函数的用法

最后一题太叩门了,而且ostream& Base::print(int,ostream&=cout);很明显的语法错误

#46


mark

#47


mark

#48


mark

#49


to jiajun2001(嘉俊):

jiajun2001(嘉俊) ( ) 信誉:101  2005-9-29 20:30:56  得分: 0  
   
最后更正 1.7 选 C
==============

显然选B阿, 为什么选c? 
  
 

#50


1.5

1.8

不明白