面试题汇总

变量的声明和定义的区别:

声明可以多次,有(extern)的才是声明;定义只能有一次;

声明只是告诉编译器变量的类型和名字,定义才会给跟配空间;

class和Struct的区别:在c语言中没有类,只有结构体

class默认成员是私有的,struct默认成员是公有的;

内存存储方式:

静态动态存储方式:编译阶段就需要分配好内存的是静态存储,例如static全局变量,局部变量,普通全局变量;

                                动态存储就是代码运行时开辟的用完就回收的局部变量等;

堆栈存储:在栈上开辟的空间不需要手动释放,读取速度快,但栈内存空间有限,需要谨慎使用(默认1M)例如;局部变量,函数                   参数;

                 堆内存上的数据一般是C++中new出来的,需要自己delete;

单位换算:

1GB==1024MB       1MB==1024KB       1KB==1024字节      1字节==8位

WIN32和WIN64的区别

可寻址的内存空间是32位Win7和64位Win7最为显著的特点;意味着电脑可使用的内存硬件不同,

个人理解:内存就好像一座高楼,如果64位系统可以访问整座楼的话,32系统来访问就会有好多楼层访问不到;

new、delete、malloc、free关系

都可用于申请动态内存和释放内存 ;new/delete是C++的运算符,malloc/free是库函数;delete/new会调用对象的析构(构造)函数

ifndef/define/endif 的作用

预编译头,防止头文件重复编译,同#program once

#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。(强烈推荐)

 #pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。

char * const p    char const * p    const char *p  上述三个有什么区别? 

  • char * const p; //常量指针,p的值不可以修改 (const离p最近,所以p指向的地址不可变,但是其地址中的数据可变)

  • char const * p;//指向常量的指针,就是不能用*p=...来修改值,但是可以从其对应的变量中修改

  • const char *p; //和char const *p 总结就是const离什么进,什么就不可修改(无非就是地址和值)

指针对数组的操作:int arr[?];

无论一维数组还是二维数组,数组名代表的是该数组的首地址,(数组地址是连续内存),等同于arr[0]和arr[0][0];

在程序中可以通过用一个指针接受首地址,然后++跳到下一个位置来实现遍历数组,

数组作为函数参数时,传的是数组地址,所以无所谓形参的中[?][?]的?的大小;

引用:别名

定义:int &a=变量名,这样a就是变量名的别名了;传参是也是直接传a;因为别名是同一块内存,所以是地址传递,一变皆变;指针也是值传递;

值传递和地址传递

传递方式的区别是地址传递方式会改变原有变量的值,值传递不会修改原有值;使用的时候需要理解清楚所开辟的空间和对应值

父子类构造析构函数的调用顺序

父类构造,子类构造,子类析构,父类析构

多态

多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;

在程序编译时多态性体现在函数和运算符的重载上;

虚函数:在基类中冠以关键字 virtual 的成员函数。 它提供了一种接口界面。允许在派生类中对基类的虚函数重新定义。

纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用。

从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。

抽象类中不仅包括纯虚函数,也可包括虚函数。抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。

重写VS重载

重写是父子类中同一个函数的不同实现;重载是不同参数列表的函数的不同实现

求返回值

int func(x) { 

int countx = 0; 

while(x) {        countx ++;           x = x&(x-1); } 

return countx; } 

假定x = 9999。 答案:8

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

经典用法

int  a=4;

int  &f(int  x)

{    a=a+x;

      return  a;}

int main(void)

{    int   t=5;

     cout<<f(t)<<endl;  a = 9

    f(t)=20;             a = 20

    cout<<f(t)<<endl;     t = 5,a = 20  a = 25

     t=f(t);                a = 30 t = 30

    cout<<f(t)<<endl;  }    t = 60}

分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。

答案:

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

int : if ( a == 0)

float : const EXPRESSION EXP = 0.000001

if ( a < EXP && a >-EXP)

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值