常见的面试C++问题

1、C++中struct和class有什么区别
(一) 默认继承权限。 如果不明确指定,来自 class 的继承按照 private 继承处理,来自 struct的继承按照 public 继承处理;
(二)成员的默认访问权限。class 的成员默认是 private 权限,struct 默认是 public 权限。
        除了这两点,class 和 struct 基本就是一个东西。语法上没有任何其它区别
    struct中的成员默认为public,而class中的默认为private;如果不是为了类中由属于自己的私有 成员,我觉得能用class解决的问题都能用struct实现。
2、volitate的作用是什么
    是用来修饰变量的,表明某个变量的值可能会随时被外部改变,因此这些变量的存取不能被缓存到寄存器,每次使用需要重新读取。
下面是volitate的介个例子:
    1). 并行设备的硬件寄存器(如:状态寄存器)
    2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
    3). 多线程应用中被几个任务共享的变量
经常遇到的面试题:
    1). 一个参数既可以是const还可以是volatile吗?解释为什么。
    2). 一个指针可以是volatile 吗?解释为什么。
    3). 下面的函数有什么错误:
int square(volatile int *ptr)
{
    return *ptr * *ptr;
}
下面是答案:
1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修改一个指向一个buffer的指针时。
3). 这段代码有个恶作剧。这段代码的目的是用来返回指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
    int a,b;
    a = *ptr;
    b = *ptr;
    return a * b;
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返回不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
    int a;
    a = *ptr;
    return a * a;
}
3、当一个类A中没有任何成员变量和成员函数时,sizeof(A) = ?
    不是零,而是1,如果是0的话,声明一个classA[10]对象数组,而每一个对象占用的空间都是0;这样就没有办法区分A[0],A[1]...了。
4、hash()函数的作用是什么?
    Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
5、Makefile文件的作用?
    makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个 Shell脚本 一样,其中也可以执行 操作系统 的命令。、
6、static有什么作用?    
    1.限制变量的作用域(文件级的)。
    2.设置变量的存储域(全局数据区)。
     C语言中主要用来定义:
        1. 定义全局静态变量 :在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点:

        (1)在全局数据区内分配内存

        (2)如果没有初始化,其默认值为0

        (3)该变量在本文件内从定义开始到文件结束可见

        2.定义局部静态变量:在局部静态变量前面加上关键字static,该局部变量便成了静态局部变量。静态局部变量有以下特点:

        (1)该变量在全局数据区分配内存

        (2)如果不显示初始化,那么将被隐式初始化为0

        (3)它始终驻留在全局数据区,直到程序运行结束

        (4)其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

        3.定义静态函数:在函数的返回类型加上static关键字,函数即被定义成静态函数。静态函数有以下特点:

        (1) 静态函数只能在本源文件中使用

        (2)在文件作用域中声明的inline函数默认为static

     说明:静态函数只是一个普通的全局函数,只不过受static限制,他只能在文件坐在的编译单位内使用,不能呢个在其他编译单位内使用。

    

    在C++语言中新增了两种作用:定义静态数据成员或静态函数成员

         1.定义静态数据成员。静态数据成员有如下特点:

        (1)内存分配:在程序的全局数据区分配

        (2)初始化和定义:静态数据成员定义时要分配空间,所以不能在类声明中初始化

          2.静态成员函数。静态成员函数与类相联系,不与类的对象相联系。静态成员函数不能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例,静态成员函数主要用于对静态数据成员的操作。

        (1)静态成员函数没有this指针。

7、 纯虚函数是怎样实现的?在编译原 理上讲一下?
     在类内部添加一个虚拟函数表指针,该指针指向一个虚拟函数表,该虚拟函数表包含了所有的虚拟函数的入口地址,每个类的虚拟函数表都不 一样,在运行阶段可以循此脉络找到自己的函数入口 纯虚函数相当于占位符, 先在虚函数表中占一个位置由派生类实现后再把真正的函数指针填 进去。除此之外和普通的虚函数没什么区别。
8、new/malloc,free/delete的区别?    
    delete 会调用对象的析构函数,和 new 对应; free 只会释放内存,new 调用构造函数。malloc 与 free 是 C++/C 语言的标准库函数new/delete 是 C++的运算符。它们都可用于申请动态 内存和释放内存。对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的 要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和 析构函数的任务强加于 malloc/free。因此 C++语言需要一个能完成动态内存分配和初始化 工作的运算符 new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete 不是库函数。
9、tcp/ip协议:
    TCP/IP(传输控制协议/网间协议)是一种网络通信协议,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据往来格式以及传送方式。TCP/IP是INTERNET的基础协议,也是一种电脑数据打包和寻址的标准方法。在数据传送中,可以形象地理解为有两个信封,TCP和IP就像是信封,要传递的信息被划分成若干段,每一段塞入一个TCP信封,并在该信封面上记录有分段号的信息,再将TCP信封塞入IP大信封,发送上网。在接受端,一个TCP软件包收集信封,抽出数据,按发送前的顺序还原,并加以校验,若发现差错,TCP将会要求重发。因此,TCP/IP在INTERNET中几乎可以无差错地传送数据。 对普通用户来说,并不需要了解网络协议的整个结构,仅需了解IP的地址格式,即可与世界各地进行网络通信
    tcp协议是一种面向连接,基于字节流的传输层通信协议。
TCP三次握手的过程如下:
    1.  客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
    2.  服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入 SYN_RECV 状态。
    3.  客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。

IP协议 是用于将多个包交换网络连接起来的,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。
IP的责任就是把数据从源传送到目的地。

10、socket网络编程:
    1)、基本操作:
         1、socket()函数
        2、bind()函数
        3、listen()、connect()函数
        4、accept()函数
        5、read()、write()函数等
        6、close()函数
此文档持续更新中。。。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值