C/C++知识细节整理

1、static有什么用途?
  1) 在函数体,声明为static的变量在这一函数被调用的过程中维持其值不变
  2) 在模块内(在函数体外),声明为static的变量被模块内的所有函数共享,但是它不能被模块外的函数访问。是一个本地化的全局变量
  3)在模块内,声明为static的函数只可被该模块内的其他函数调用。那就是,限制该函数只能在本模块内使用

2、const和#define相比,有何有点?
  1) const常亮有数据类型,#define定义的常亮没有。编译器可以对前者进行类型安全检查,而对后者只能做字符替换,并且字符替换可能会产生意想不到的结果
  2) 编译器可以对const常亮进行调试,但不能对#define宏进行调试

3、volatile的作用
  用来修饰变量,表示该变量可能会被未知的原因改变。遇到volatile声明的变量,编译器对访问该变量就不在进行优化,每次都是从内存中重新读取该变量,而不是使用寄存器中保存的值,从而保证了对该特殊变量的稳定访问。
  volatile int i = 10;
  int a = i;
  ...
  //其他的代码,并没有明确的告诉编译器对i进行操作
  int b = i;
  volatile告诉编译器i的值可能发生改变,所以编译器每次都是从内存中重新读取i的值。而优化的做法是:由于编译器发现两次读取i值的中间并没有对i进行操作,它会自动的把上次读取到i的值复制给b,而不会重新读取。这样一来,如果i表示一个寄存器变量或者一个端口数据就容易出错。所以说volatile可以保证对特殊变量的稳定访问
  一般来说,volatile用在以下几个地方:
   1) 中断服务程序中修改的供其他程序检测的变量
   2) 多线程之间共享的标志
   3) 存储器映射的硬件寄存器,因为每次对它读写都可能有不同的意义

4、指针和引用的区别
  1) 引用必须被初始化,指针不用
  2) 引用初始化之后不能被改变,指针可以改变所指的对象
  3) 不存在指向空值的引用,但存在指向空值的指针

5、描述内存分配方式以及它们的区别
  1) 从静态存储区分配。内存在编译的时候就已经分配好,这块内存在程序的整个运行期间内都存在。例如全局变量、static变量。
  2) 从栈上分配。在执行函数时,函数内部的局部变量都可以在栈上创建,函数执行结束后存储单元被自动释放。
  3) 从堆上分配。亦称动态内存分配。程序在运行时用malloc或new申请任意多少的内存,程序员需要自己负责用delete或free释放内存。

6、malloc/free和new/delete的区别
相同点:都用于动态内存的分配和释放
不同点:
  (1) 操作对象不同
   malloc/free是C语言标准库函数,new/delete是C++的操作符。对于非内部数据类型而言,只用malloc/free不能满足要求,因为对于非内部数据类型,需要在创建的时候调用构造函数,在释放的时候调用析构函数,标准的库函数做不到
  (2) 用法上也不同
   函数malloc的原型为: void *malloc(size_t size);
   int *p = (int *)malloc(sizeof(int) * length);
   我们应该把注意力放在两点上:“类型转换”sizeof
   1、mallo返回值是void *,所以需要显示转换,转换成需要的指针类型
   2、malloc本身并不识别要申请的内存是什么类型,它只关系申请的内存的总字节数

  函数free的原型为:void free(void *ptr);

  new/delete的使用就要简单的多,例如:
  int *p = (int *)malloc(sizeof(int) * length);
  int *p = new int(length);
  因为new内置了类型转换、sizeof以及类型安全检查。

7、有哪几种情况必须使用intialization list而不能使用assignment?
  当类中有const、reference成员变量,基类的构造函数都需要使用初始化表。

8、类成员函数的重载、覆盖和隐藏的区别?
 a、重载的特征?
  1) 相同的范围(同一个类中);
  2) 函数名称相同;
  3) 参数不同;

 b、覆盖是指派生类覆盖基类函数,其特征为:
  1) 不同的范围(分别位于派生类和基类);
  2) 函数名称相同;
  3) 参数相同;
  4) 基类函数必须有virtual关键字;

 c、隐藏是指派生类屏蔽了与其同名的基类函数,规则如下:
  1) 如果派生类和基类的函数同名,但是参数不同。此时,不论有没有virtual关键字,基类的函数被隐藏(注意与重载混淆);
  2) 如果派生类和基类的函数同名,并且参数也相同。但是基类中没有virtual关键字,基类的函数被隐藏(注意和覆盖混淆);

9、TCP/IP建立连接的过程(3-way shake)
  第一次握手:建立连接时,客户端发送syn包(syn = j)到服务器,并进入SYN_SEND状态,等待客户端的响应;
  第二次握手:服务器收到syn包,必须确认客户的SYN(ack = j + 1),同时自己也发送一个syn包(syn = k),即SYN+ACK包,服务器进入SYN_RECV状态;
  第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack = k + 1),此包发送完毕,客户端和服务端进入ESTABLISHED状态,完成三次握手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值