名企C++面试题及答案(4)

2019-03-15 19:51

extern \#endif //C++实现文件 cppExample.cpp 文章来源 草根IT网(www.caogenit.com) #i nclude \int add( int x, int y ) { return x + y; } /* C实现文件 cFile.c /* 这样会编译出错:#i nclude \extern int add( int x, int y ); int main( int argc, char* argv[] ) { add( 2, 3 ); return 0; } 15.extern “C”含义

extern \包含双重含义,其一:被它修饰的目标是“extern”的;其二:被它修饰的目标是“C”的。 1)被extern “C”限定的函数或变量是extern类型的; extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其他模块中使用。 注意:extern int a;

仅仅是在声明一个变量,并不是定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。

通常,在模块的头文件中对模块提供给其他模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错,它会在连接阶段中从模块A编译生成的目标代码中找到此函数。

与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern \修饰。 2)被extern \修饰的变量和函数是按照C语言方式编译和连接的

作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo(int x, int y);

该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能产生的名字不同,但是都采用了相同的机制)。_foo_int_int这样的名字包含了函数名、函数参

数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo(int x, int y)与void foo(int x, float y)编译产生的符号是不相同的,后者为_foo_int_float。 extern \作用:实现C++与C及其它语言的混合编程。

3)extern \的惯用法

A)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理: extern \ {

#include \ }

而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern \声明,在.c文件中包含了extern \时会出现编译语法错误。 例如:

/*c语言头文件:cExample.h*/ #ifndef C_EXAMPLE_H #define C_EXAMPLE_H

extern int add(int x, int y); #endif

/*c语言实现文件:cExample.c*/ #include \ int add(int x, int y) {

return x+y; }

//c++实现文件,调用add:cppFile.cpp extern \ {

#include \ }

int main(int argc, char *argv[]) {

add(2,3); return 0; }

B)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern \,但是在C语言中不能直接引用声明了extern \的头文件,应该仅将C文件中将C++中定义的extern \函数声明为extern类型。 例如:

//C++头文件 cppExample.h #ifndef CPP_EXAMPLE_H #define CPP_EXAMPLE_H

extern \ #endif

//C++实现文件 cppExample.cpp

#include \ int add(int x, int y) {

return x+y; }

/*C实现文件cFile.c

/*这样会编译出错:#include \ extern int add(int x, int y); int main(int argc, char *argv[]) {

add(2,3); return 0; } 16. 关联、聚合(Aggregation)以及组合(Composition)的区别?

涉及到UML中的一些概念:关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表示has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:

从实现的角度讲,聚合可以表示为: class A {...} class B { A* a; .....}

而组合表示contains-a的关系,关联性强于聚合:组合类与被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形表示组合关系: 实现的形式是:

class A{...} class B{ A a; ...}

17.面向对象的三个基本特征,并简单叙述之? 1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private, protected,public)

2. 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。

3. 多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

18. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?

常考的题目。从定义上来说:重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。 重写:是指子类重新定义复类虚函数的方法。

从实现原理上来说:重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:

int_func、str_func.对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关! 重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。

19. 多态的作用?

主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

20. Ado与Ado.net的相同与不同?

除了“能够让应用程序处理存储于DBMS 中的数据”这一基本相似点外,两者没有太多共同之处。但是Ado使用OLE DB 接口并基于微软的COM 技术,而ADO.NET 拥有自己的ADO.NET 接口并且基于微软的。NET 体系架构。众所周知。NET 体系不同于COM 体系,ADO.NET 接口也就完全不同于ADO和OLE DB 接口,这也就是说ADO.NET 和ADO是两种数据访问方式。ADO.net 提供对XML 的支持。

一、选择题 (每小题2分,共12分) 1 C++源文件的缺省扩展名为()A A.cpp B.exe C.obj D.lik

2 程序运行中需要从键盘上输入多于一个数据时,各数据之间应该使用()符号作为分隔符 A A.空格或逗号 B.逗号或回车 C.逗号或分号 D.空格或回车

3 在每个C++程序中都必须包含有这样一个函数,该函数的名称为()A A.main B.MAIN C.name D.function

4 假定a 为一个短整型(short int)数组名,则元素a[8]的地址为()B

A.a+4 B.a+8 C.a+16 D.a+32

5 假定AB 为一个类,则执行“ABa(4),b[4],*p[5]”语句时,自动调用该类够造函数的次数为()B A.4 B.5 C.8 D.13

6 当需要使用istrstream流类定义一个流类对象并联系一个字符串时,应在文件开始使用#include命令,使之包含()文件A A.iostream.h B.iomanip.h C.fstream.h D.ststrea.h

二 填空题(每小题3分,共30分)

1. 在C++中,函数的参数有两种传递方式,它们是值传递和(址传递)。

2. 当一个成员函数被调用时,该成员函数的(this指针)指向调用它的对象。

3. 在公有继承的情况下,基类数据成员在派生类中的访问权限 (私有不可以访问,其他同基类一致) 。 4. 用new申请某一个类的动态对象数组时,在该类中必须能够匹配到 (无参) 构造函数,否则应用程序会产生一个编译错误。

5. 静态数据成员在类外进行初始化,且静态数据成员的一个拷贝被类的所有对象 (共享)。

6. 面向对象的程序设计有四大特征,它们是(封装,多态,继承,抽象) 。

7. 在C++类中,有一种不能定义对象的类,这样的类只能被继承,称之为 (虚基类) ,定义该类至少具有一个 (虚函数) 。

8. 在C++类中,const关键字可以修饰对象和成员函数,const对象不能 (作为左值)。 9.假定一个枚举类型的定义为“enum

RB{ab,ac,ad,ae}x=ad;”则x的值为(2)

10.若需要把一个类AB定义一个类CD的友元素,则应在类CD的定义中加入一条语句为(friend class AB)。 三 给出下列程序运行后的输出结果(每小题5分,共20分)

1. 下面程序的运行结果是(3) 。 #include void main() {

char a=’a',b=’j'; float x;

x=(b-a)/(’F'-’A');//文章来源 草根IT网(www.caogenit.com)

printf(”%d\\n”,(int)(3.14*x)); }

2. 下面程序的运行结果是()。 #include “iostream.h” void main( ) {

int i=1; while (i<=15){ i++;

if (i%3!=2) continue;

else cout <<”i=”<

3. 下面程序的运行结果是()。 #include “iostream.h” class test {

private: int num; float fl; public: test( );

int getint( ){return num;} float getfloat( ){return fl;} ~test( ); };

test::test( ) {

cout << “Initalizing default” << endl; num=0;fl=0.0; }

test::~test( ) {

cout << “Desdtructor is active” << endl; }

void main( ) {

test array[2];

cout << array[1].getint( )<< ” ” << array[1].getfloat( ) <

Initalizing defaul Initalizing defaul

0 0.0

Desdtructor is active Desdtructor is active

4. 下面程序的运行结果是()。 #include class A {

public:

A(){cout<<”A::A() called.\\n”;}

virtual ~A(){cout<<”A::~A() called.\\n”;} };

class B:public A {

public: B(int i){

cout<<”B::B() called.\\n”; buf=new char[i];} virtual ~B() {

delete []buf;

cout<<”B::~B() called.\\n”; }

private: char *buf; };

void fun(A *a) {

delete a; }

void main() {

A *a=new B(15); fun(a); }

A::A() called. B::B() called. B::~B() called. A::~A() called.

5. 下面程序的运行结果是()。 #include int a[ ]={1,3,5,7,9};

int *p[ ]={a,a+1,a+2,a+3,a+4}; void main( ) {

printf(”%d\\t%d\\t%d\\n”,a[4],*(a+2),*p[1]);

printf(”%d\\t%d\\t%d\\n”,**(p+1)+a[2],*(p+4)-*(p+0),*(a+3)%a[4]); } 9 5 3 8 4 7

四、 问答题(每小题5分,共20分)

1. 若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能会产生什么问题?

浅拷贝问题,主要原因为类中如果有指针成员变量时,当调用拷贝构造函数时只拷贝地址从而使两个对象的指针变量指向了一个地址空间。

2. 简述成员函数、全局函数和友元函数的差别。 成员函数只能由该类所实例化的对象来进行调用。[静态成员除外]

全局函数可以在任意位置进行调用。 友元函数可以让本类和友元类对象调用。

3. 简述结构化的程序设计、面向对象的程序设计的基本思想。

结构化程序设计为从程序代码的开始处按照顺序方式执行至代码的结束位置。是一种顺序的方式,函数与变量没有明显的联系

面向对象主要把处理事情的事物和方法结合为一体成为一个类,一个类具备处理一件事情的数据变量和处理方法,把数据和方法有机的结合为了一体,使每一件事情都具备一定的独立性,形成一个模块。增加了内聚性,降低了耦合性。同时也增加了代码的可读性以及代码的重用性。

4. 结构struct和类class有什么异同? 在c语言中struct只能对数据进行聚合,而c++的class把数据以及对数据的处理方法也同时聚合为一体,增加了内聚性。

此外class拥有可再生性和可抽象性,实现的代码的复用。集中体现在派生的功能和多态的功能。

同时class也比struct具备更好的封装性,体现在三种访问权限上。

在C++ 中的struct和class的结构基本一致,只是struct的默认权限为Public而class为private。 五 下列shape类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。请从shape类派生三角形类(triangle)、矩形类(rectangle),并给出具体的求面积函数(18分) Class Shape {

Public: Shape(){} ~shape(){}

Virtual int area(); }

/* 求所有面积 */

Int total( Vector< Shape*> vecshape);

Vector< Shape*> vecShape;

Int total(Vector< Shape*> vecshape) {

Vector< Shape*>::iterator VecIt; Int ntotal = 0;

For( VecIt=vecShape.begin(); VecIt!=vecShape.end(); VecIt++) {

ntotal += (*VecIt)->area(); }

Return ntotal; }

Class trangle :public shape {

Public:

Trangle(){} ~trangle(){} Int area(); Private:

Int m_nheigh; Int m_nwidth; }

/* 求三角形面积 */ Int Trangle::area() {

Return m_nheigh*m_nwidth/2; }

Class rectangle :public shape {

Public:

Rectangle(){} ~rectangle(){} Int area(); Private:

Int m_nheigh; Int m_nwidth; }

/* 求矩形面积 */ Int Rectangle::area() {

Return m_nheigh*m_nwidth; }

威盛公司软件C++英文笔试题面试题

1.How good do you see yours programming skills?Please circle your answe rs

C: Fair/Good/Excellent C++: Fair/Good/Excellent

2.Please estimate your programming experince: How many lines of code are your biggest C Program ever written exclud ing the

standard linked library? How many lines of code are your biggest C++ program ever written excl uding the

standard linked library?

3.Please explain the following terms Data Encapsulation Inheritance Polymorphism

4.What is a virtual base class?How do you declare such a class?How woul d you use

it in a design?

5.What is a template or container class?How do you declare such a class ?

6.Which are the access control levels for C++ language?

7.What is RTTI?How do you achieve RTTI in your design?

8.What are the major differences between static and non-static member f unctions?

9.How do you call a regular member function from a static member functi on?

Please use psendo-code to provide your answer 10.How do you declare/define a type of pointer to a class member functi on?

Please use psendo-code to provide your answer 11.Please explain the following tyoes:

Here is a short lise of combinations and their meanings:

1.Reference-Can change the referenced object 2.Const-Reference 3.Const-Pointer- 4.Pointer-Const-

5.Const-Pointer-Const- CFoo Instance

CFoo &ReferenceToInstance=Instance; //1

const CFoo &ConstReferenceToInstance=Instance; //2

const CFoo *pConstPointer=&Instance; //3


名企C++面试题及答案(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:低温罐ATG系统技术方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: