全面的C++面试题(共7篇)
全面的C++面试题 篇1
1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?
virtual修饰符会被隐形继承的,private 也被集成,只事派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual ,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。
--------------------------------------------------------------------------
2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)
#include
using namespace std;
void main
{
char a[50];memset(a,0,sizeof(a));
int i=0,j;
char t;
cin.getline(a,50,“”);
for(i=0,j=strlen(a)-1;i { t=a[i]; a[i]=a[j]; a[j]=t; } cout< } //第二种 string str; cin>>str; str.replace; cout< -------------------------------------------------------------------------- 3.请简单描述Windows内存管理的方法。 内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~ 我先说个大概,希望能够抛砖引玉吧 当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。 内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理 块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。 页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。 段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。 段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。好处就很明显,不用我多说了吧。 各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似。 这只是一个大概而已,不足以说明内存管理的皮毛。无论哪一本操作系统书上都有详细的讲解 -------------------------------------------------------------------------- 4. #include “stdafx.h” #define SQR(X) X*X int main(int argc, char* argv[]) { int a = 10; int k = 2; int m = 1; a /= SQR(k+m)/SQR(k+m); printf(“%d”,a); return 0; } 这道题目的结果是什么啊? define 只是定义而已,在编择时只是简单代换X*X而已,并不经过算术法则的 a /= (k+m)*(k+m)/(k+m)*(k+m); =>a /= (k+m)*1*(k+m); =>a = a/9; =>a = 1; -------------------------------------------------------------------------- 5. const 符号常量; (1)const char *p (2)char const *p (3)char * const p 说明上面三种描述的区别; 如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量; 如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。 (1)const char *p 一个指向char类型的const对象指针,p不是常量,我们可以修改p的值,使其指向不同的char,但是不能改变它指向非char对象,如: const char *p; char c1=“a”; char c2=“b”; p=&c1;//ok p=&c2;//ok *p=c1;//error (2)char const *p (3)char * const p 这两个好象是一样的,此时*p可以修改,而p不能修改。 (4)const char * const p 这种是地址及指向对象都不能修改。 -------------------------------------------------------------------------- 6.下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么? int n; if (n == 10) // 第一种判断方式 if (10 == n) // 第二种判断方式 如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了= -------------------------------------------------------------------------- 7.下面的代码有什么问题? void DoSomeThing(...) { char* p; ... p = malloc(1024); // 分配1K的空间 if (NULL == p) return; ... p = realloc(p, 2048); // 空间不够,重新分配到2K if (NULL == p) return; ... } A: p = malloc(1024); 应该写成: p = (char *) malloc(1024); 没有释放p的空间,造成内存泄漏。 -------------------------------------------------------------------------- 8.下面的代码有什么问题?并请给出正确的写法。 void DoSomeThing(char* p) { char str[16]; int n; assert(NULL != p); sscanf(p, “%s%d”, str, n); if (0 == strcmp(str, “something”)) { ... } } A: sscanf(p, “%s%d”, str, n); 这句该写成: sscanf(p, “%s%d”, str, &n); -------------------------------------------------------------------------- 9.下面代码有什么错误? Void test1() { char string[10]; char *str1=“0123456789”; strcpy(string, str1); } 数组越界 -------------------------------------------------------------------------- 10.下面代码有什么问题? Void test2() { char string[10], str1[10]; for(i=0; i<10;i++) { str1[i] =“a”; } strcpy(string, str1); } 数组越界 -------------------------------------------------------------------------- 11.下面代码有什么问题? Void test3(char* str1) { char string[10]; if(strlen(str1)<=10) { strcpy(string, str1); } } ==数组越界 ==strcpy拷贝的结束标志是查找字符串中的 因此如果字符串中没有遇到 的话 会一直复制,直到遇到 ,上面的123都因此产生越界的情况 建议使用 strncpy 和 memcpy -------------------------------------------------------------------------- 12.下面代码有什么问题? #define MAX_SRM 256 DSN get_SRM_no() { static int SRM_no; //是不是这里没赋初值? int I; for(I=0;I { SRM_no %= MAX_SRM; if(MY_SRM.state==IDLE) { break; } } if(I>=MAX_SRM) return (NULL_SRM); else return SRM_no; } 系统会初始化static int变量为0,但该值会一直保存,所谓的不可重入... -------------------------------------------------------------------------- 13.写出运行结果: {// test1 char str[] = “world”; cout << sizeof(str) << “: ”; char *p = str; cout << sizeof(p) << “: ”; char i = 10; cout << sizeof(i) << “: ”; void *pp = malloc(10); cout << sizeof(p) << endl; } 6:4:1:4 -------------------------------------------------------------------------- 14.写出运行结果: {// test2 union V { struct X { unsigned char s1:2; unsigned char s2:3; unsigned char s3:3; } x; unsigned char c; } v; v.c = 100; printf(“%d”, v.x.s3); } 3 -------------------------------------------------------------------------- 15.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数 A1: 16位的系统下, int i = 65536; cout << i; // 输出0; int i = 65535; cout << i; // 输出-1; 32位的系统下, int i = 65536; cout << i; // 输出65536; int i = 65535; cout << i; // 输出65535; A2: int a = ~0; if( a>65536 ) { cout<<“32 bit”< } else { cout<<“16 bit”< } -------------------------------------------------------------------------- 16.C和C++有什么不同? 从机制上:c是面向过程的(但c也可以编写面向对象的程序);c++是面向对象的,提供了类。但是, c++编写面向对象的程序比c容易 从适用的方向:c适合要求代码体积小的,效率高的场合,如嵌入式;c++适合更上层的,复杂的; llinux核心大部分是c写的,因为它是系统软件,效率要求极高。 从名称上也可以看出,c++比c多了+,说明c++是c的超集;那为什么不叫c+而叫c++呢,是因为c++比 c来说扩充的东西太多了,所以就在c后面放上两个+;于是就成了c++ C语言是结构化编程语言,C++是面向对象编程语言。 C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。 -------------------------------------------------------------------------- 17.在不用第三方参数的情况下,交换两个参数的值 #include void main() { int i=60; int j=50; i=i+j; j=i-j; i=i-j; printf(“i=%d”,i); printf(“j=%d”,j); } 方法二: i^=j; j^=i; i^=j; 方法三: // 用加减实现,而且不会溢出 a = a+b-(b=a) -------------------------------------------------------------------------- 18.有关位域的面试题(为什么输出的是一个奇怪的字符) a.t = “b”;效果相当于 a.t= “b” & 0xf; “b” -->01100010 “b” & 0xf -->>00000010 所以输出Ascii码为2的特殊字符 char t:4;就是4bit的字符变量,同样 unsigned short i:8;就是8bit的无符号短整形变量 -------------------------------------------------------------------------- 19.int i=10, j=10, k=3; k*=i+j; k最后的值是? 60 -------------------------------------------------------------------------- 20.进程间通信的方式有? 进程间通信的方式有 共享内存, 管道 ,Socket ,消息队列 , DDE等 -------------------------------------------------------------------------- 21. struct A { char t:4; char k:4; unsigned short i:8; unsigned long m; } sizeof(A)=?(不考虑边界对齐) 7 struct CELL // Declare CELL bit field { unsigned character : 8; // 00000000 ???????? unsigned foreground : 3; // 00000??? 00000000 unsigned intensity : 1; // 0000?000 00000000 unsigned background : 3; // 0???0000 00000000 unsigned blink : 1; // ?0000000 00000000 } screen[25][80]; // Array of bit fields 二、位结构 位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构 比按位运算符更加方便。 位结构定义的一般形式为: struct位结构名{ 数据类型 变量名: 整型常数; 数据类型 变量名: 整型常数; } 位结构变量; 其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整 数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。 变量名是选择项, 可以不命名, 这样规定是为了排列需要。 例如: 下面定义了一个位结构。 struct{ unsigned incon: 8; /*incon占用低字节的0~7共8位*/ unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/ unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/ unsigned blink: 1; /*blink占用高字节的第7位*/ }ch; 位结构成员的访问与结构成员的访问相同, 例如: 访问上例位结构中的bgcolor成员可写成: ch.bgcolor 注意: 1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长 度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。 2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针, 如果是指针, 其成员访问方式同结构指针。 3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字 节。 4. 位结构成员可以与其它结构成员一起使用。 例如: struct info{ char name[8]; int age; struct addr address; float pay; unsigned state: 1; unsigned pay: 1; }workers; 上例的结构定义了关于一个工人的信息。其中有两个位结构成员, 每个位结 构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工 人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。 -------------------------------------------------------------------------- 22.下面的函数实现在一个固定的数上加上一个数,有什么错误,改正 int add_n(int n) { static int i=100; i+=n; return i; } 答: 因为static使得i的值会保留上次的值。 去掉static就可了 -------------------------------------------------------------------------- 23.下面的代码有什么问题? class A { public: A() { p=this; } ~A() { if(p!=NULL) { delete p; p=NULL; } } A* p; }; 答: 会引起无限递归 -------------------------------------------------------------------------- 24. union a { int a_int1; double a_double; int a_int2; }; typedef struct { a a1; char y; } b; class c { double c_double; b b1; a a2; }; 输出cout< 答: VC6环境下得出的结果是32 另: 我(sun)在VC6.0+win2k下做过试验: short - 2 int-4 float-4 double-8 指针-4 sizeof(union),以结构里面size最大的为union的size ---------------------------------------------------------------------------------- 25.i最后等于多少? int i = 1; int j = i++; if((i>j++) && (i++ == j)) i+=j; 答: i = 5 -------------------------------------------------------------------------- 26. unsigned short array[]={1,2,3,4,5,6,7}; int i = 3; *(array + i) = ? 答: 4 -------------------------------------------------------------------------- 27. class A { virtual void func1(); void func2(); } Class B: class A { void func1(){cout << “fun1 in class B” << endl;} virtual void func2(){cout << “fun2 in class B” << endl;} } A, A中的func1和B中的func2都是虚函数. B, A中的func1和B中的func2都不是虚函数. C, A中的func2是虚函数.,B中的func1不是虚函数. D, A中的func2不是虚函数,B中的func1是虚函数. 答: A -------------------------------------------------------------------------- 28. 数据库:抽出部门,平均工资,要求按部门的字符串顺序排序,不能含有“human resource”部门, employee结构如下:employee_id, employee_name, depart_id,depart_name,wage 答: select depart_name, avg(wage) from employee where depart_name “human resource” group by depart_name order by depart_name -------------------------------------------------------------------------- 29. 给定如下SQL数据库:Test(num INT(4)) 请用一条SQL语句返回num的最小值,但不许使用统计功能,如MIN,MAX等 答: select top 1 num from Test order by num desc -------------------------------------------------------------------------- 30. 输出下面程序结果。 #include class A { public: virtual void print(void) { cout<<“A::print()”< } }; class B:public A { public: virtual void print(void) { cout<<“B::print()”< }; }; class C:public B { public: virtual void print(void) { cout<<“C::print()”< } }; void print(A a) { a.print(); } void main(void) { A a, *pa,*pb,*pc; B b; C c; pa=&a; pb=&b; pc=&c; a.print(); b.print(); c.print(); pa->print(); pb->print(); pc->print(); print(a); print(b); print(c); } A: A::print() B::print() C::print() A::print() B::print() C::print() A::print() A::print() A::print() -------------------------------------------------------------------------- 31. 试编写函数判断计算机的字节存储顺序是开序(little endian)还是降序(bigendian) 答: bool IsBigendian() { unsigned short usData = 0x1122; unsigned char *pucData = (unsigned char*)&usData; return (*pucData == 0x22); } -------------------------------------------------------------------------- 32.简述Critical Section和Mutex的不同点 答: 对几种同步对象的总结 1.Critical Section A.速度快 B.不能用于不同进程 C.不能进行资源统计(每次只可以有一个线程对共享资源进行存取) 2.Mutex A.速度慢 B.可用于不同进程 C.不能进行资源统计 3.Semaphore A.速度慢 B.可用于不同进程 C.可进行资源统计(可以让一个或超过一个线程对共享资源进行存取) 4.Event A.速度慢 B.可用于不同进程 C.可进行资源统计 -------------------------------------------------------------------------- 33.一个数据库中有两个表: 一张表为Customer,含字段ID,Name; 一张表为Order,含字段ID,CustomerID(连向Customer中ID的外键),Revenue; 写出求每个Customer的Revenue总和的SQL语句。 建表 create table customer ( ID int primary key,Name char(10) ) go create table [order] ( ID int primary key,CustomerID int foreign key references customer(id) , Revenue float ) go --查询 select Customer.ID, sum( isnull([Order].Revenue,0) ) from customer full join [order] on( [order].customerid=customer.id ) group by customer.id -------------------------------------------------------------------------- 34.请指出下列程序中的错误并且修改 void GetMemory(char *p){ p=(char *)malloc(100); } void Test(void){ char *str=NULL; GetMemory=(str); strcpy(str,“hello world”); printf(str); } A:错误--参数的值改变后,不会传回 GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。 strcpy(str, “hello world”);将使程序崩溃。 修改如下: char *GetMemory(){ char *p=(char *)malloc(100); return p; } void Test(void){ char *str=NULL; str=GetMemory(){ strcpy(str,“hello world”); printf(str); } 方法二:void GetMemory2(char **p)变为二级指针. void GetMemory2(char **p, int num) { *p = (char *)malloc(sizeof(char) * num); } -------------------------------------------------------------------------- 35.程序改错 class mml { private: static unsigned int x; public: mml(){ x++; } mml(static unsigned int &) {x++;} ~mml{x--;} pulic: virtual mon() {} = 0; static unsigned int mmc(){return x;} ...... }; class nnl:public mml { private: static unsigned int y; public: nnl(){ x++; } nnl(static unsigned int &) {x++;} ~nnl{x--;} public: virtual mon() {}; static unsigned int nnc(){return y;} ...... }; 代码片断: mml* pp = new nnl; .......... delete pp; A: 基类的析构函数应该为虚函数 virtual ~mml{x--;} -------------------------------------------------------------------------- 36.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。 答: 101个先取出2堆, 33,33 第一次称,如果不相等,说明有一堆重或轻 那么把重的那堆拿下来,再放另外35个中的33 如果相等,说明假的重,如果不相等,新放上去的还是重的话,说明假的轻(不可能新放上去的轻) 第一次称,如果相等的话,这66个肯定都是真的,从这66个中取出35个来,与剩下的没称过的35个比 下面就不用说了 方法二: 第3题也可以拿A(50),B(50)比一下,一样的话拿剩下的一个和真的比一下。 如果不一样,就拿其中的一堆。比如A(50)再分成两堆25比一下,一样的话就在 B(50)中,不一样就在A(50)中,结合第一次的结果就知道了。 -------------------------------------------------------------------------- 37.static变量和static 函数各有什么特点? 答: static变量:在程序运行期内一直有效,如果定义在函数外,则在编译单元内可见,如果在函数内,在在定义的block内可见; static函数:在编译单元内可见; -------------------------------------------------------------------------- 38.用C 写一个输入的整数,倒着输出整数的函数,要求用递归方法 ; 答: void fun( int a ) { printf( “%d”, a%10 ); a /= 10; if( a <=0 )return; fun( a ); } -------------------------------------------------------------------------- 39.写出程序结果: void Func(char str[100]) { printf(“%d”, sizeof(str)); } 答: 4 分析: 指针长度 -------------------------------------------------------------------------- 40.int id[sizeof(unsigned long)]; 这个对吗?为什么?? 答: 对 这个 sizeof是编译时运算符,编译时就确定了 可以看成和机器有关的常量。
微软的面试题 篇2
一个求职者应聘微软的部门经理,面试官抛出一道考题:一天晚上,结伴同行的4个人要由一座小桥的一边到达另一边,过桥时必须用到手电筒,但手电筒只有一支,而小桥每次最多只可以通过两人。4个人的过桥时间分别为1分钟、2分钟、5分钟、10分钟。要让所有人安全通过小桥。最少需要多长时间?
听完,求职者立即埋头计算。来微软之前,他曾经在别的公司做过项目经理,他想,这完全是一个考查优化的问题。
聪明的人马上就能想到这样的方法:先让1、2过去,1回来,5、10再过去,2回来,1、2再过去,总共17分钟。
可是,求职者算来算去,总比标准答案的时间多。看他左右为难的样子,面试官问要不要提示,他立马说不,又埋头做了5分钟,结果还是没做出来。
面试官点评说:“其实你解题的思路很好,可惜你没有理解清楚我的问题,最关键的是,你没有问我手电筒能照多远?如果将手电筒放在桥中间,朝左朝右各能照到桥的一半,那就不需要来回在桥上走了。
最后,面试官重申:出这样一道面试题,当然不是为了考求职者的数学水平,而是有没有理清问题细节的能力。这对一个项目经理来说,是非常重要的素质。
c++工程师面试题目 篇3
(1)C++不是纯面向对象的语言,C++是面向对象和过程的,因为C++支持类和过程。
(2)虚函数(virtual)具有传递性,即子类中对父类的虚函数的重写,也是一个虚函数 ,不过函数的参数表也要一样。
(3)可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时,基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,而不是基类中定义的成员函数(只要派生类改写了该成员函数)。若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都会调用基类中定义的那个函数。
2、 谈谈指针和引用的区别?
指针用操作符“_”和“->”,引用使用操作符“&”.
相同点是:指针与引用都是让你间接引用其他对象。
区别:(1). 指针是一个实体,指向一块内存,它的内容是所指内存的地址;而引用仅是个别名,是某块内存的别名。
(2). 引用使用时无需解引用(_),指针需要解引用;
(3). 引用只能在定义时被初始化一次,之后不可变,“从一而终”;指针可变;
(4). 引用没有 const类型,指针有 const类型,const 的指针不可变;
(5). 引用不能为空,指针可以为空;
(6). “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。
(7). 指针和引用的自增(++)运算意义不一样;
3. int m = 100,n = 101;
int &k = m;
k = n; //此时K,m值分别是多少 ?
k和m的值都是101,因为k是对m的引用,k值发生变化,m值也发生着变化。
4、 c++中 const修饰符一般用于那几种情况,具体作用是什么?
(1).用常量定义 const int n = 100;
用于常量参数 即 fn(const int & a)
用于常量函数,即类的该函数不修改其状态。
用于返回值
(2).可以定义const常量,具有不可变性; 便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患; 可以保护被修饰的东西,防止意外的修改,增强程序的健壮性;为函数重载提供了一个参考; 可以节省空间,避免不必要的内存分配;提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
5、 你在程序代码中用assert吗?assert一般用于做什么?
(1) 是我常用。
(2)主要用于DEBUG下断言,即假设一定是这样的,否则就是错误的。例如 asser ( a > 100 );
6、 i++ 相比 ++i 哪个更高效?为什么?
答:(1)++i 比 i++效率高。
(2)i++要多调用一次类的构造和析够函数
7、 windows平台下网络编程有哪几种网络编程模型?你最熟悉的是哪种?并对他们作个比较?
(1)有阻塞,,基于窗体的事件模型,事件模型,重叠模型,完成端口模型。
(2)我最熟悉的是事件模型。
(3)除了阻塞模型外,其他都是非阻塞模型,其中效率最高的是完成端口模型,尤其在windows下服务器最合适了。
做客户端一般用事件模型了,,在window和like unix都可以使用。
8、 tcp进行传输时,接收方怎么告诉发送方“我已经处理不过来了,先不要再发数据给我。”
答:接受方给发送方发一个通知数据包,该通知包让发送方暂停数据的发送,或方慢发送。等接受方处理完毕后,再发一个恢复的通知数据包。
9、 设计udp网络协议包设计 包多大合适,为什么?
答:最好设计成MTU的大小,MTU是Maximum Transmission Unit的缩写。意思是网络上传送的最大数据包。这样的话传输速度会快。
10、win/win个有几个版本,每个版本最新系统补丁包是什么?
11、DNS的实现方法?
12、WEB服务器的负载均衡?
13、请问目前市面上常用几种网络操作系统的优缺点?
14、请问你用过那些服务器?请讲述raid0、1、5的特点和优点?
15、请列出下列协议的段口号:HTTP、HTTPS、DNS、FTP、TELNET、PPTP、SMTP、POP3?
16、请问局域网内想要通过UNC路径或者NETBIOS名称访问对方计算机,需要在对方计算机上开放什么协议或者端口?
17、OSI七层模型?TCP/IP模型?
18、能否将WIN2000P升级成WIN2000S?
经典c++面试题
1. C++的类和C里面的struct有什么区别?
struct成员默认访问权限为public,而class成员默认访问权限为private
2. 析构函数和虚函数的用法和作用
析构函数是在对象生存期结束时自动调用的函数,用来释放在构造函数分配的内存。
虚函数是指被关键字virtual说明的函数,作用是使用C++语言的多态特性
3. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
1) 全局变量的作用用这个程序块,而局部变量作用于当前函数
2) 前者在内存中分配在全局数据区,后者分配在栈区
3) 生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在
4) 使用方式不同:通过声明后全局变量程序的各个部分都可以用到,局部变量只能在局部使用
4. 有N个大小不等的自然数(1–N),请将它们由小到大排序.要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。
void sort(int e[], int n)
{
int i;
int t;
for (i=1; i {
t = e[e[i]];
e[e[i]] = e[i];
e[i] = t;
}
}
5. 堆与栈的去区别
A. 申请方式不同
Stack由系统自动分配,而heap需要程序员自己申请,并指明大小。
B. 申请后系统的响应不同
Stack:只要栈的剩余空间大于申请空间,系统就为程序提供内存,否则将抛出栈溢出异常
Heap:当系统收到程序申请时,先遍历操作系统中记录空闲内存地址的链表,寻找第一个大于所申请空间的堆结点,然后将该结点从空间结点链表中删 除,并将该结点的空间分配给程序。另外,大多数系统还会在这块内存空间中的首地址处记录本次分配的大小,以便于delete语句正确释放空间。而且,由于 找到的堆结点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表。
C. 申请大小限制的不同
Stack:在windows下,栈的大小是2M(也可能是1M它是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
Heap:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
D. 申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。
E. 堆和栈中的存储内容
栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器 中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开 始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
6. 含参数的宏与函数的优缺点
宏: 优点:在预处理阶段完成,不占用编译时间,同时,省去了函数调用的开销,运行效率高
缺点:不进行类型检查,多次宏替换会导致代码体积变大,而且由于宏本质上是字符串替换,故可能会由于一些参数的副作用导致得出错误的结果。
函数: 优点:没有带参数宏可能导致的副作用,进行类型检查,计算的正确性更有保证。
缺点:函数调用需要参数、返回地址等的入栈、出栈开销,效率没有带参数宏高
PS:宏与内联函数的区别
内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数的程序处将它展开(在编译期间完成的);宏同样是;
不同的是:内联函数可以在编译期间完成诸如类型检测,语句是否正确等编译功能;宏就不具有这样的功能,而且宏展开的时间和内联函数也是不同的(在运行期间展开)
7. Windows程序的入口是哪里?写出Windows消息机制的流程
Windows程序的入口是WinMain函数。
Windows应用程序消息处理机制:
A. 操作系统接收应用程序的窗口消息,将消息投递到该应用程序的消息队列中
B. 应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息,取出消息后,应用程序可以对消息进行一些预处理。
C. 应用程序调用DispatchMessage,将消息回传给操作系统。
D. 系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理。
8. 如何定义和实现一个类的成员函数为回调函数
A.什么是回调函数?
简而言之,回调函数就是被调用者回头调用调用者的函数。
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个被调用函数。而该被调用函数在需要的时候,利用传递的地址调用回调函数。
回调函数,就是由你自己写的,你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。
B.如何定义和实现一个类的成员函数为回调函数
要定义和实现一个类的成员函数为回调函数需要做三件事:
a.声明;
b.定义;
c.设置触发条件,就是在你的函数中把你的回调函数名作为一个参数,以便系统调用
如:
一、声明回调函数类型
typedef void (_FunPtr)(void);
二、定义回调函数
class A
{
public:
A();
static void callBackFun(void) //回调函数,必须声明为static
{
cout<<“callBackFun”<
}
virtual ~A();
};
三、设置触发条件
void Funtype(FunPtr p)
{
p();
}
void main(void)
{
Funtype(A::callBackFun);
}
C. 回调函数与API函数
回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反, 他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它 通过一个函数指针来保存这个回调函数,在需要调用时,只需引用这个函数指针和相关的参数指针。
其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。
1、局部变量能否和全局变量重名?
能,局部会屏蔽全局。要用全局变量,需要使用“::”
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
2、如何引用一个已经定义过的全局变量?
extern
可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。
4、语句for( ;1 ;)有什么问题?它是什么意思?
无限循环,和while(1)相同。
5、do……while和while……do有什么区别?
前一个循环一遍再判断,后一个判断以后再循环。
6、请写出下列代码的输出内容
#include
main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10_a++;
printf(“b,c,d:%d,%d,%d”,b,c,d);
return 0;
}
答:10,12,120
7、请找出下面代码中的所以错误
说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
#include “string.h”
main()
{
char_src=”hello,world”;
char_ dest=NULL;
int len=strlen(src);
dest=(char_)malloc(len);
char_ d=dest;
char_ s=src[len];
while(len–!=0)
d++=s–;
printf(“%s”,dest);
return 0;
}
答:
方法1:
int main()
{
char_ src = “hello,world”;
int len = strlen(src);
char_ dest = (char_)malloc(len+1);//要为分配一个空间
char_ d = dest;
char_ s = &src[len-1];//指向最后一个字符
while( len– != 0 )
_d++=_s–;
_d = 0;//尾部要加
printf(“%sn”,dest);
free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
return 0;
}
方法2:
#include
#include
main()
{
char str[]=”hello,world”;
int len=strlen(str);
char t;
for(int i=0; i {
t=str[i];
str[i]=str[len-i-1]; str[len-i-1]=t;
}
printf(“%s”,str);
return 0;
面试官最爱问的面试题 篇4
这是为了了解求职者如何客观分析自己,并测试求职者的表达能力和组织能力的。应避免抽象的陈述,而以具体的体验增添吸引力。除了陈述自己的优点以外,还要注意说话的礼貌,这也会列入评分的项目内,最好加入“朋友们曾这样说。”等周围人对自己的看法。
你认为你自己有什么缺点?
许多应聘者把自己的缺点说得模棱两可,希望人家会看作是你的优点。例如回答说:“我性子急。”希望主考人认为你干劲十足,这类话主考人早听腻了。你应该正视自己的缺点,以你的诚实和你的勇气,来赢得考官的认同和欣赏。
谈谈你的人际关系经验?
这是想考察你的应对能力及决断能力。你可以围绕下面的问题从侧面来回答:“遇到与朋友冲突的时候,你是怎么处理的t”、“与别人意见相冲突的时候,你会用什么方式让别人接受你的意见t”。每一个公司需要的不是力争到底的坚持,而是需要更进一步地搜集资料,透过人际关系来积聚力量,找寻正确的工作决策和方法。
你什么时候可以来上班?
大多数企业会关心就职时间,最好是回答:如果被录用的话,到职日可按公司规定上班。但如果还有一些私人的问题还没有处理完毕,按时上班会有些困难,应进一步说明原因,公司一般会通融的。
你还有什么问题吗?
假如你笑笑说“没有”,那才是犯了一个大错误。这往往被理解为你对该公司、对这份工作没有太深厚的兴趣。回答这个问题时,你可以以一些侧面的问题来试探一下考官,推断一下自己入围有几成希望。
“另类”的面试题 篇5
当时几个同学放弃了原先的教师工作,相约南下到深圳闯荡一番。我已经找了一份做培训的工作,但我几个朋友工作暂时还没有着落。一天,同学小W、小G、小L,三人相约去某教育培训机构面试。由于大家都有一些当教师的经验,小G和小L去的时候自信满满的,回来时却像是霜打的茄子,沉默不语。原来他们三个,只有小W一个人通过面试,并可在下周一报到上班。而小W性格内向,无论在学校学习,还是在教师岗位,都不出色。小G、小L在大学做学生会干部,在过去的学校教书也得到过很多荣誉,相对于小W来说他们有足够的优势。当他们得知只有小W被录用的时候,写了一脸的凝惑。
当时大家年轻气盛,有股不服输的劲,于是小G和小L去找到了面试官,面试官对他们说:“首先我对你们表示感谢,感谢你们对我们公司的青睐,同时对于我们公司没有录取你们表示歉意。我承认你们都很优秀,不知道你们是否还记得面试时问过你们这样一个问题;你们曾说过你们是最好的兄弟,而我所问的问题是:如果你们三个只有一个可以留下,你会选择谁?你们两位都选择了你们自己,都只说了自己的优势以及你兄弟的缺点;并且想方设法的抵毁别人。只有小W他向我同时推荐了你们,他心中充满了对你们的信任,并希望我们能找到最好的员工。而就是我选择他的原因,处处为别人想的人,他才能站在公司、以及客户的角度去考虑更多的问题,从而不断的提高自己技能。这就是我的回答”说完这些面试官就离开了,看着面试官远去的背影;他们却沉默了许久。
有时候我们常常只想到自己,而忘了身边最亲近的人;也常常为达到目的,而选错了方法,也常过高估了自己的能力,忘了去发现自己的不足。
“烧脑”的牛津大学面试题 篇6
经管学
面试官问申请经管类专业的学生:“你认为银行家是否真值得拥有那么高的收入?政府是否应该限制他们的收入?”牛津大学对设计这个问题的解读是:一个好的面试者应该想,为什么银行家要比其他行业的从业者赚得更多,他们比后者更有技能吗?牛津大学希望学生从收入经济学的角度来回答这个问题,而不是单从社会学上的是否公平问题上来解答。
文学
面试官问申请文学专业的学生:“J.K.罗琳刚出版了一本写给成人的书,但没有像《哈利·波特》那样成功,你认为给成人写的书和给儿童写的书有什么不同?”对于这个问题,牛津大学表示,就算没看过J.K.罗琳的书也能回答这个问题。其实面试官最想知道的是面试者在读什么书,是否读得很深入,是否能辩证地思考他们所读的东西。
材料学
对申请材料学专业的学生,面试官会问:“热气球要被加热到什么地步,才能够把大象带上天空?”其实面试官没指望学生能够就这个问题给出一个精准的答案。他们就想看看学生是怎么处理难题的,他们的思考方式是什么样的,以及他们的基础知识学得如何。
音乐学
对申请修读音乐专业的学生,面试官问过这么一个问题:“如果你要发明一个新的乐器,它的声音会是什么样的?”这个问题可以引发面试者很多的奇思妙想。牛津大学期待学生能引述到制作声音的器材和技法,以及他们自己对声音的理解。
【素材运用】牛津大学的面试题看似奇葩,但其中却蕴含着面试官对学生综合素质的考查。面试并不是想要一个所谓的正确答案,而是要在回答过程中全面了解一个学生是否是有思想、有态度、有见解的人,有了这些,学生们在各自的领域才有可能有真正的突破和成就。
【速用名言】
1.伟大的思想能变成巨大的财富。
——古罗马哲学家 塞内加
2.没有思想自由,就没有科学,没有真理。——法国画家 勒南
【适用话题】综合素质;思想;考试
高中招生的面试题 篇7
2、你初中是哪个学校毕业的?上学期间吃不吃早餐?一般怎么解决早餐?你初中学校的午餐口味如何?请对初中学校的午餐提出2点建议。3、假期里你一般几点起床?假期里你吃不吃早饭?
4、请描述一下你最好的朋友(特点、习惯、成绩、爱好、他的家庭)5、请说一下,你的父母各是一个什么样的人?
6、请描述一个真实发生过的你与父母最温馨的场景。
7、你有手机吗?什么品牌、型号的?买了多长时间了?当时花了多少钱? 8、你一般用手机主要来干什么?
A、网络游戏 B、聊天 C、单机小游戏 D、9、你觉得多长时间不接触手机就会疯掉?
A、0-3个月 B、3个月-6个月 C、6个月-1年 D、没有手机无所谓 10、你最喜欢吃的零食是什么?
11、你最喜欢的运动是什么?假期里,多长时间能进行一次这样的运动?
12、你与爷爷、奶奶、姥姥、姥爷在一起的时间长,还是和父母在一起的时间长?
1、你进入高中的初衷是什么?
2、你进入高中是自愿来的,还是被迫来的?
3、你是否因为情绪激动,有与同学动手的冲动?你当时是怎么解决的? 4、初中时,你是否因为挫折耽误自己的学习?如果是,你是否愿意高中时也遇到类似挫折时接受别人的干预,以促进你的成长?
5、为了保证你的健康,我们不允许带零食和吃零食,你有什么看法? 6、你想住宿吗?为什么?你父母想让你住宿吗?为什么? 7、这个学校不让带手机,你对此有什么看法?
8、你认为你与初中班主任关系如何?你与班主任之间发生的哪件事情让你印象深刻?
1、当老师批评你的时候,如果误解你了,你会有什么反应? 2、操场上一张纸,全班数十人走过没人捡起,你怎么看? 3、如果有个同学课堂上睡觉、不听讲,你怎么看?
4、你认为高中的星期六,是上课好,还是上自习好?为什么?
1、你与父母吵过架吗?因为什么?
2、在你生活中,有没有帮助过陌生人?当时什么感受? 3、你喜欢什么类型的班主任?严厉的还是温和的?为什么? 4、餐厅给你把饭盛好,你发现吃不了,你将怎样处理?
【全面的C++面试题】推荐阅读:
长在岩石下面的小花的语文阅读题及答案07-04
最新电子工程师面试题(收集了各大公司常见面试试题)07-05
C、C++程序员常见面试题深入剖析10-15
行政助理面试的经典测试题07-27
看各地面试题目社区工作者面试主要面试哪些方面的问题呢06-19
主观题试题05-16
暖通试题计算题06-02
假设型面试试题05-18
教师面试常见试题06-05
执法类面试试题07-13