软件岗位常见面试题分析

1. 比较值传递和引用传递的相同点和不同点。

      值传递是发生在函数调用过程中,将实参传递给形参过程,完成的是一个赋值操作的过程,完成以后,形参值发生变化后不影响实参;而引用,是实参取得一个别名,操作引用和操作实参没有区别
2 什么叫内联函数?它有哪些特点?

内连函数是用inline关键字标识的一类函数,在调用处编译器直接用函数体来替换,节省参数传递,控制转移等开销;内连函数不内部不能使用循环或switch控制语句;内联函数的定义必须在第一次调用改内联函数之前,且不能对异常接口进行声明;
3 什么叫复制构造函数?复制构造函数何时被调用?

复制构造函数是一种特殊的构造函数,它是用类的一个对象去初始化另一个对象,函数的形参是本类的一个对象的引用;通常在初始化类的另一个对象时调用,或者函数的形参是类的对象,或者函数的返回值是类的一个对象;
4 复制构造函数与赋值运算符(=)有何不同?

复制构造函数本质上是构造函数,形如classtype(const &class type),而赋值构造函数这是对类的对象进行赋值操作的,形如classtype&classtype :operator(const classtype& )本质意义上是重载=操作符,便于连续对类的对象赋值;
5 什么叫作用域?有哪几种类型的作用域

作用域表示的是表示符号在程序文本中的作用范围,通常有block scope  file scope  function scope namespace scope;
6 什么叫做可见性?可见性的一般规则是什么?

可见性是指标识符是否可以引用的问题;一般来讲:标识符的定义声明一定需要在使用前,并且同一作用域内,不能定义同名的标识符;当程序包含多重(两重)作用域关系时,内层作用如果没有定义与外层作用域同名的标识符,外层的标识符在内层任然可见,如果内层定义了同名标识符,外层的标识符在内层不可见;
7 什么叫静态数据成员?他有何特点?

静态数据成员,是区别于类内部普通数据成员。用关键字static声明,在类内部声明,外部初始化;对于类的不同对象,每个对象都拷贝了一份普通的数据成员,并且普通数据的值(状态)由对象自己维护,同一类的不同对象的普通数据的状态可能不同;但是静态数据成员为类所有的对象共有,静态数据的状态由所有对象共同维护,因此可以实现类对象之间的数据共享和信息传递;
8 什么叫静态函数成员?他有何特点?

静态成员函数区别于普通函数,同样是用关键字static声明,类的静态成员函数只能访问类的静态数据,同样静态函数也归类所有对象共有;
9 什么叫友元函数?什么叫友元类?

友元函数 是用关键字 friend 声明在类内部,但不是类的成员函数,定义在类外部,由于带有friend 标识,可以访问类的所有成员(public、protect、private);友元类,声明在其他类中,可以访问该类的所有成员(数据和函数);友元关系不能被继承,友元关系的传递是单向的,友元关系也不能传递;
10 在函数内部定义的普通局部变量和静态局部变量在功能上有何不同?计算机底层对这两类变量做了怎样的不同处理导致了这种差异?

普通局部变量,存放在栈内,声明时,系统在栈上给该变量分配空间,函数执行操作该变量所在的作用域时,变量销毁被系统收回,局部变量初始化时系统不给指定初始值; 静态局部变量:存在于系统的静态内存区,只需要定义一次,静态变量不随作用域的消失而消亡,静态局部变量系统默认为0,当程序退出时,静态局部变量才销毁;
11 引用和指针有何区别?何时只能使用指针而不能使用引用?

引用是变量的一个别名,本质和变量本身没有区别,再内存中没有额外的空间;指针有自己的内存空间;引用不能再赋值,二指针可以赋值,甚至为NULL;通常需要将变量修改成为其他地址或者赋值为NULL时,必须使用指针;
12 比较类的 3 种继承方式之间的差别?

public继承:基类中的public、protect,private在子类中都不变,子类只能访问基类中的public、protect类型变量;

protect继承:基类中的public、protect在子类中都变成protect类型的变量,privaet变量不变,子类只能访问基类中的public、

                      protect类型变量;

private继承:基类中的public、protect在子类中都变成private类型的变量,子类只能访问基类中的public、

                      protect类型变量;
13 什么叫虚基类?有何作用?

多路继承时,各个继承路线交汇到一个基类,会产生多个基类的实例对象,若只想保留一个基类的对象,在继承时添加关键字 virtual;虚基类主要用在多重继承时,只产生一个基类给派生类使用,解决了多重继承的二义性问题;
14 组合与继承有什么共同点和差异?通过组合生成的类与被组合的类之间的逻辑关系是什 么?继承呢?

组合和继承都将一个类与另外一个类结合在一起,实现了代码的重用(复用);组合生成的类标识了一种包含关系,A类包含了B类的一些属性和操作;继承形成的类标识类与类之间的一种隶属关系,子类B是基类A的一种(派生);
15 基类与派生类的对象,指针或引用之间,哪些情况下可以隐含转换,哪些情况下可以显 示转换?在涉及多重继承或虚继承的情况下,在转换时会面临哪些新问题?

派生类的指针可以隐式转换成基类的指针;基类的指针必须得显示转换成子类指针;但是基类对象无法显示地转换成派生类的对象;多重继承时,基类的指针显示转换成派生类指针的时候,需要调整一下派生类的指针指向的内存地址,才能得到新指针的值;如果基类时虚基类,派生类的指针可隐式地转换成基类的指针,但基类的指针却不能送过static_cast转换方式转换成派生类的指针;
16 什么叫做多态性?在 C++种是如何实现多态的?

C++类的多态性是指基类的函数通过关键字virtual声明,派生类重写了该函数;程序执行时,根据实际定义的对象决定执行基类或者是父类的函数;实现了动态绑定(迟绑定);
17 什么叫抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数的实现?

C++中抽象类是指成员函数中有用关键字virtual声明的纯虚函数,抽象类的纯虚函数只是作为接口,实现交给派生类;抽象类不能实例化对象,只能作为基类;抽象类的派生类不一定要给出纯虚函数的实现,这样派生类依然是抽象函数;
18 在 C++中,能否声明虚构造函数?为什么?能否声明虚析构函数?有何用途?

C++中不能声明虚的构造函数,构造函数需要为虚函数生产虚函数表,因此定义虚构造函数就会存在逻辑错误;但是可以定义虚的析构函数,主要是用于当基类的指针指向派生类时,删除基类的指针,会先调用派生类的析构函数,防止内存泄漏(动态调用各个派生类对象的析构函数);
19 什么叫做流?流的提取和插入是指什么?I/O 流在 C++中起着怎样的作用?

流是指负责数据产生者和数据消费者之间数据的管理、流向和控制的一种称谓,流的提取标识数据的读取,流的插入标识数据的写入;操作系统把键盘、显示器、打印机、端口当成一种扩充文件类处理,I/O 流就是实现这些扩充文件之间的数据交互,实现数据的输入和输出;
20 什么叫做异常?什么叫做异常处理?

异常是指程序在运行过程中出现了无意义或者未意料到的情况,系统无法处理的状态;异常处理是通过系统提供的throw抛出一个异常的对象,然后通过catch抓取改异常状态,分析异常产生的原因和位置,是操作系统提供的一种比较好的预防程序出错的机制;
21 C++的异常处理机制有何优点?

C++异常处理的机制可以让异常的抛出和异常的处理不在同一个函数里,这样就使得底层程序设计时着重考虑函数的功能,上层调用时,适当地做异常抓取及处理工作;
22 比较函数重载和虚函数在概念和使用方式方面有什么区别?
23 比较 class 和 struct 结构体的异同
24 浅拷贝和深拷贝的区别?

对象的成员数据的内存是动态申请,给新对象赋值时,对象成员安位拷贝时,导致新对象的成员并没有申请一块新的内存,删除原对象时,成员数据在内存上的空间被销毁,导致新对象成员存在野指针的情况;而深拷贝就是在赋值时,给新的对象成员新申请一片内存,删除原来的对象对新对象没有任何影响;
25 const 和 static 作用:
26 析构函数带 virtual 和 不带 virtual 的区别

构造函数不能写成虚函数,但析构函数可以写成虚函数;如果基类会被派生的话,基类的析构函数一定要写成虚函数,否则基类的指针指向派生类时,删除该指针,并不会释放派生类的空间,派生类的析构函数也不会执行;

析构函数不带virtual 的情况:1.不做基础类,或者不被public继承,不做接口类;2.做基类时,派生类的析构函数没有执行的内容 3.不将基类的指针指向派生类 
27 重写,重载和隐藏的区别?

重写:是指子类对父类带有virtual 关键标识符的虚函数重写的一种操作,子类的函数与父类函数同名且参数列表一致,重写是实现多态的关键,实现在编译过程中迟绑定

重载:发生在类内部对同名函数处理的操作,通常重载函数与已有的函数同名,但参数列表一定不同(参数的个数、类型或者返             回值不一样)

隐藏:是发生子类和父类之间,子类定义了与父类同样的函数(参数列表都一样),这样使用子类实例化对象后,对象只执行子            类的这个函数,从而隐藏了父类中同名的函数;
28 C++中的四个默认的函数

构造函数、复制构造函数、赋值构造函数、析构函数
29 不可以被重载的运算符--五个

类属关系运算符、成员指针运算符“、作用域运算符、 sizeof 运算符和三目 运算符
. .* :: sizeof() ?:

30 三种字符数组初始化的方法

char str[5] ={"hello"};

char str[6] ={'h','e','l','l','o','\0'"};

char str[] = {"'h','e','l','l','o'"};
31 哪些操作符必须重载为成员函数

+,=,[],new;
32 什么是“else 摇摆问题”,举例说明

else摇摆问题是指编写程序时,如果没有再if后面加大括号,导致编译器常常会将else与最近的if关联在一起,导致程序的逻辑错误;
33 函数模板和函数重载的区别与联系

函数重载是指在类的内部,定义同名函数,但参数的类型个数、顺序或者返回值不一样实现同类型参数实现同样功能;

模板函数并不是具体的函数,而是对一类同构方法的抽象,编译时不同类型的参数都能实现一类方法;

联系:函数重载不同类型参数实现类似方法这一功能可以通过模板函数实现;
34 怎样区别虚函数和纯虚函数?两者都有什么作用

虚函数是用关键字 virtual声明的函数,同时会给出函数的定义;而纯虚函数则是 形如 virtual fun() = 0;虚函数和类的继承构成了C++多态的基础;纯虚函数通常用与声明接口类以及接口函数,具体的实现交由派生类;
35 面向对象程序“接口与实现方法分离”,有什么作用(好处)

接口和实现方法分离是面向对象编程的要求,这样能能很好的将程序的业务逻辑和与外界的接口参数分离,便于软件系统架构的确立,功能模块划分,方便各个模块协作一起推进,加快了软件开发迭代的速度,隔离了接口与实现,方便在模块出问题时,不至于对系统架构进行修改;
36 列出所有与字符串处理有关的头文件
37 C++中显示类型转换
38 delete 和 delete [] 的区别?

delete 用于删除指针指向的内存空间,delere[]用于删除一组连续分配的内存空间;对于普通 的数据类型 如:int a[10] ;char b[10];等 delete 和delete[] 功能一样;但是对于类对象数组,delete 则不会低啊用对象的析构函数,通常会造成数据泄露;
39 存储类别说明符可划分为两类。
40 什么是运算符重载,它如何增强 C++的扩展性?
41 为什么说”继承是 C++面向对象的主要特征之一”?请简要说明.?
42 作用域辨析有哪些?
43.STL 是什么?组成部分和区别。

STL是C++提供的标准的模板库,包括:容器、算法、迭代器、空间配置器、配接器、仿函数器六部分组成
44 如何声明和使用虚函数。说明它在多态性中的作用和意义。
44.什么是逻辑错误?什么是语法错误?请举例说明。
45 编写语句说明枚举类型是如何定义和使用的。
46 ADT是什么?简述你对“数据抽象”和“信息隐藏”的认识。
47 简述你对“面向对象”和“面向过程”编程思想的理解和认识。
50 写出递归函数定义以及相应的优缺点
51 写出包含输入输出的标准库
52 怎样区别虚函数和纯虚函数?两者都有什么作用

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值