前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【编程基础】如何赢得C++面试

【编程基础】如何赢得C++面试

作者头像
程序员互动联盟
发布2018-03-12 11:42:35
1.4K0
发布2018-03-12 11:42:35
举报
文章被收录于专栏:程序员互动联盟

1.new、delete、malloc、free关系

delete会调用对象的析构函数,和new对应的是free,free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。

2.delete与delete []区别

delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。

3.有哪些性质(面向对象特点)

封装,继承和多态。

4.子类析构时要调用父类的析构函数吗?

析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了。定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数

5.C++中的class和struct的区别

从语法上,在C++中(只讨论C++中)。class和struct做类型定义时只有两点区别:

(一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;

(二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。

除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别。

求下面函数的返回值(微软)

int func(x){

int countx = 0;

while(x){

countx ++;

x = x&(x-1);

}

return countx;

}

假定x = 9999。答案:8

思路:将x转化为2进制,看含有的1的个数。

6.什么是“引用”?申明和使用“引用”要注意哪些问题?

引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。

7.“引用”与多态的关系?

引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例

a)

#include <stdio.h>

union{

int i;

char x[2];

}a;

void main(){

a.x[0] = 10;//2进制就是0000 1010(0AH)

a.x[1] = 1 ;//2进制就是0000 0001(01H)

printf("%d",a.i); //结果就是0000 0001 0000 1010=266

}

答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)

b)

main(){

union{ /*定义一个联合*/

int i;

struct{ /*在联合中定义一个结构*/

char first;

char second;

}half;

}number;

number.i=0x4241; /*联合成员赋值*/

printf("%c%cn", number.half.first, mumber.half.second);

number.half.first='a'; /*联合中结构成员赋值*/

number.half.second='b';

printf("%xn", number.i);

getch();

}

答案:AB (0x41对应'A',是低位;Ox42对应'B',是高位)

6261 (number.i和number.half共用一块地址空间)

8.多态的作用?

主要是两个:

1.隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;

2.接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

12.描述内存分配方式以及它们的区别?

1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。

3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

BOOL : if ( !a ) or if(a)

int : if ( a == 0)

float : if ( a < 0.00001&& a >-0.00001)

pointer : if ( a != NULL) or if(a == NULL)

9.请说出const与#define相比,有何优点?

答案:

Const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

10.简述数组与指针的区别?

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。

11.类成员函数的重载、覆盖和隐藏区别?

答案:a.成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

12.求出两个数中的较大值

There are two int variables: a and b, don’t use“if”,“? :”,“switch”or other judgement statements, find out the biggest one of the two numbers.

答案:( ( a + b ) + abs( a - b ) ) / 2

13.如何判断一段程序是由C编译程序还是由C++编译程序编译的?

答案:

#ifdef __cplusplus

cout<<"c++";

#else

cout<<"c";

#endif

14.堆栈溢出一般是由什么原因导致的?

答、1.没有回收垃圾资源

2.层次太深的递归调用

15.什么函数不能声明为虚函数?

答、constructor

16.用两个栈实现一个队列的功能?要求给出算法和思路!

答、设2个栈为A,B,一开始均为空.

入队:

将新元素push入栈A;

出队:

(1)判断栈B是否为空;

(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;

(3)将栈B的栈顶元素pop出;

17.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。

#define MIN(A,B) ((A) <= (B)? (A) : (B))

18.交换两个数的宏定义

交换两个参数值的宏定义为:. #defineSWAP(a,b) (a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b);

19.用变量a给出下面的定义

a)一个整型数(An integer)

b)一个指向整型数的指针(A pointer to an integer)

c)一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)

d)一个有10个整型数的数组(An array of 10 integers)

e)一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)

f)一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer

argument and return an integer)

答案是:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

20.关键字static的作用是什么?

这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:

1).在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2).在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3).在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

感谢shengliz的分享,部分内容摘自csdn博客

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档