首页 > 编程语言 >c++一些面试题目

c++一些面试题目

时间:2024-08-22 23:29:44浏览次数:7  
标签:题目 函数 int c++ 面试 析构 基类 ostream const

摘自:https://www.cnblogs.com/lidabo/p/3284921.html

1、What is achieved by prefixing the 'static' keyword to a file-level function or file-level variable declaration?

 

使用static关键字修饰文件级的函数和变量起到什么作用?

 

key:对变量来说,不允许文件外的程序访问;对函数来说,该函数的实现必须在这个文件内完成,并且不允许文件外的程序调用。

 

2、Describe the difference between the IS A and HAS A object relationships. Which is the stronger relationship and why?

 

IS A在编译期就决定了对象的行为,但是HAS A可以在运行的时候改变"A"所指向的对象,从而可以在运行时改变其行为;

HAS A可以有IS A提供的所有特性(至于访问权限,如果需要,可以赋予friend的关系)

 

3、Java & C# support interfaces directly with the interface keyword.

C++ does not have an interface keyword.

How do you create an interface in C++?

Where/when is the use of interfaces especially helpful?

 

C++ uses pure virtual class to emulate interfaces.

 

4、If a program requires a large number of execution contexts, what can be done to minimise thread scheduling overhead?

 

题目意思是:如果一个程序需要巨大的运行上下文,怎样来最小化线程调度的开销?

 

我不知道怎么回答,如果你知道,能告诉我么?

 

5、What does it mean to say that a function is reentrant?

What are some of the ways of achieving re-entrancy?

 

函数可重入是指无论什么时候,对于输入相同的参数,得到的结果都一致。

要使函数可重入,就要避免在函数中使用静态变量,全局变量(在这里是广义的全局变量,包括全局变量,类的静态变量,以及类的数据成员)

如果要在多线程环境下也保证re-entrancy的话,还需要安装互斥锁。

 

6、抛出异常和返回错误值有什么不同?什么时候得处理抛出异常?

 

有些情况下必须作异常处理,如程序出现除0的情况,如果不作异常处理的话程序就出现运行时错误。

 

7、函数参数声明为引用的好处

 

不需要创建临时变量,创建一个临时变量会增加开销。

 

8、异常处理的catch里边能不能再抛出异常?

 

能,这种抛出称为“重抛出”(rethrow),异常将由更外边一层异常处理程序来处理。

 

9、析构函数是否允许抛出异常?

 

允许,但这样的话析构函数的执行就在throw处结束,这样析构可能就不完整。

如果实在要使用throw(),那么在析构函数内用catch()处理所有的异常可认为是安全的。

 

10、构造函数是否允许为虚函数?析构函数呢?

 

构造函数不允许为虚函数,析构函数可以。

看这种情况:

BaseClass *p = new DerivedClass();

delete p;

如果基类析构函数不为virtual,那么只会调用基类的析构函数,子类的析构函数是不被调用的,所以一般来说我们要把基类的析构函数声明为virtual。

 

11、什么是多态,如何实现?

 

经常问的问题,但有时候太紧张思维受阻,还真回答不出来……

其实如果要咬文嚼字的话:“多态(polymorphism)是一种将不同的特殊行为和单个泛化记号相关联的能力”。

回答:

通过虚函数和模版来实现,前者是动态多态,后者是静态多态。

 

12、什么是虚基类?

 

其实不应该这样问的,不过我也是碰到这个问题之后才了解到“虚继承”,回答:

被子类虚继承的基类称为虚基类。(e……虚基类和一般的类毫无分别,只是被别人“虚继承”就称为虚基类了,可恶,哪有这样定义的?但他硬是这么问)

虚继承所能达到的目的是:无论继承了多少个基类的实例,只存在一份基类的共享实例,通常用于多重继承(又是很少用的东西,我只建过接口的实现用多重继承,接口接口,该死的Java,该死的面向对象),它可以避免基类实例重复出现而引起的冲突。

 

13、阐述一下iostream

对“iostream”来说:

cin 是 istream类的对象,istream类 来自 basic_istream模版

cout 是 ostream类的对象,ostream类 来自 basic_ostream模版

cerr 同 cout

 

对“iostream.h”来说:

没有使用模版,

cin 是 ostream_withassign类的对象,ostream_withassign是istream的子类,istream虚继承于ios类(ios类就是根了)

cout 是 ostream_withassign类的对象,ostream_withassign是ostream的子类,ostream虚继承于ios类

cerr 同 cout

 

14、阐述STL(复习下STL)

 

……

 

15、用聚合还是继承

和第二题差不多

 

16、函数指针的声明

typedef int (*FUN)(int, int);

FUN fp;

 

也可以直接定义一个叫fp的函数指针:

int (*fp)(int, int);

 

typedef int (*FUN)(int, int);

FUN fp[10]; //函数指针数组

 

 

int (*fp[10])(int, int);

 

17、关于const

const int a = 10; //a恒为10

int const a = 10; //(同上)

const int *a = &b; //a指向的数为恒值,但a可变

int * const a = &b; //a的值不可变,a指向的值可变

//可能你已经想到了,要使得a及*a的值都不可变:

int const * const a = &b;

 

18、关于volatile

 

这个问题我还真的遇到了,并且我几乎答不出,我只说了,这是跟硬件比较相关的一个概念……

如果没做过嵌入式开发的话是不会使用到这个关键字的。当一个变量被定义为volatile的时候,这个关键字告诉优化器,改变量的值可能会不经意地改变,每次使用到该变量的值,都必须重新获取。

 

19、++的细节

(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);

C是错误的表达式,因为“=”左边不是一个有效值。

 

20、extern "C"的作用

一般都能回答,但标准的答案是:

函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。

 

21、关于类型安全

 

……

 

22、简述Windows线程同步的几个方法

1)关键代码段,InitializeCriticalSection(),EnterCriticalSection(),LeaveCriticalSection(),不能跨越进程,速度很快,又称为用户方式同步。

2)除了用户方式同步就是内核对象同步了。WaitForSingleObject(),WaitForMultiObject()……

       注意:如果是一个线程对象,它处于“有信号”的时候说明它“可调度”,比如它结束了。

2-1)事件Event:CreateEvent(),SetEvent(),ResetEvent(),注意:Event对象可以设置为自动,那么Wait之后它会自动转变为无信号。

2-2)信标Semaphore:CreateSemaphore(),ReleaseSemaphore(),WaitForSingleObject(smph)的时候Count--,ReleaseSemaphore(smph)的时候Count++。

2-3)互斥体Mutex:CreateMutex(),ReleaseMutex(),和信标类似,但没有“资源计数”这一概念。

 

23、进程间通信

1)Windows消息

2)共享内存,用CreateFileMapping()或者dll

3)网络

4)命名管道

5)邮槽

 

24、函数参数传递中,数组参数将退化为指针

 

这点经常考,千万注意

 

25、程序分析

void getmemory(char *p)

{

    p=(char *)malloc(100);

    strcpy(p,"hello world");

}

 

int main( )

{

    char *str=NULL;

    getmemory(str);

    printf("%s/n",str);

    free(str);

    return 0;

}

 

这段程序是不能正常打印出“hello world”的,因为指针的值不能正常返回,如果要正确返回指针的值,那么请使用指针的指针,或者引用。

void getmemory(char* & p)

{

    p=(char *)malloc(100);

    strcpy(p,"hello world");

}

 

这样就OK了。

标签:题目,函数,int,c++,面试,析构,基类,ostream,const
From: https://www.cnblogs.com/LiuYanYGZ/p/18374939

相关文章

  • C++模板的细节改进
    emsp;emsp;C++11改进了编译器的解析规则,尽可能的将多个右尖括号(>)解析称模板参数结束符,方便我们编写模板相关的代码。1.模板的右尖括号emsp;emsp;在C++98/03的泛型编程中,模板实例化有一个很繁琐的地方,那就是连续两个右尖括号(>>)会被变异器解释称右移操作符,而不是模板参数表的结束......
  • Spring---频率最高面试题1
    01.Spring框架的基本理解     •关键字:核心思想IOC\AOP、作用(解耦、简化),简单描述框架组成·     Spring框架是一款轻量级的开发框架,核心思想是IOC(控制反转)和AOP(面向切面编程),为Java应用程序开发提供组件管理服,用于组件之间的解耦,以及简......
  • 【面试】一文搞懂MySQL的分库分表!
            MySQL分库分表是一种数据库优化手段,通常用于应对数据量巨大、并发量高的场景。随着系统数据的增长,单个数据库可能难以承受高负载,进而影响性能和可扩展性。分库分表的目标是将数据分散到多个库或表中,从而减少单一库或表的压力,提高系统性能。目录一我们为什......
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector(模拟实现)
    1.存储结构namespacezone{ template<classT>//需要模板 classvector { public:private: iterator_start; iterator_finish; iterator_endofstorage;};}可见,vector内核是由三个指针实现的2.默认成员函数 2.1.构造函数1.初始化列......
  • MySQL面试问题(二)
    MySQL面试问题(二)文章目录MySQL面试问题(二)为什么要使用索引索引是不是越多越好MySQL索引机制什么是聚簇索引没有主键innodb如何处理联合索引批量向MySQL中导入1000w数据如何优化分页时偏移量很大效率很差如何优化大数据量高并发访问数据库优化方法为什么要使用索引......
  • C++初学(14)
    14.1、while循环和for循环相比,while循环没有初始化和更新部分,它只有测试条件和循环体。while(text-condition)body首先程序计算圆括号内的测试条件(text-condition)表达式。如果该表达式为ture,则执行循环体中的语句。和for循环一样,循环体也由一条语句或两个花括号定义的......
  • CMake编译不同文件目录下的C++文件
        由于我们构建一个项目的时候,通常不会将所有的源文件放在一个文件目录下,这样既不方便开发,也不方便源码阅读,我们通常会对项目文件进行分层,比如分为include、src、res、lib这些目录,src下又分为model、controller、view这些目录。所以跨文件编译C++文件就相当必要了,如......
  • C++设计模式1:单例模式(懒汉模式和饿汉模式,以及多线程问题处理)
    饿汉单例模式        程序还没有主动获取实例对象,该对象就产生了,也就是程序刚开始运行,这个对象就已经初始化了。 classSingleton{public: ~Singleton() { std::cout<<"~Singleton()"<<std::endl; } staticSingleton*get_instance() { return&sin......
  • 【C/C++ 软件开发模拟面试 集】cmake 相关知识点模拟面试
    摘自:https://zhuanlan.zhihu.com/p/662623216第一轮:基础知识 1.1什么是CMake? 面试官: 请问你能简单描述一下CMake是什么,以及它通常用来做什么吗? 面试者: CMake是一个跨平台的自动化构建系统,主要用来管理软件构建的过程,它使用一个名为CMakeLists.txt的配置文件来指导编......
  • c++矩阵旋转问题
    问题有一个MxN的矩阵,设计函数将其顺时针旋转90度。打印示例Originalmatrix:123456789Rotatedmatrix(90degreesclockwise):741852963代码#include<iostream>#include<vector>usingnamespacestd;voidrotateMatrix90Clockwise(constv......