笔试题总结

1.inline的作用

为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。

 inline仅是一个对编译器的建议

建议:inline函数的定义放在头文件中

2.constant的作用

1)   修饰成员变量:

const定义的常量编译器可以对其进行数据静态类型安全检查。

const修饰指针变量时:

  (1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。

  (2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。

  (3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。

2)修饰函数形参:

当输入参数为用户自定义类型和抽象数据类型的时候(就是自己定义的类),应该将“值传递”改为“const &传递”,可以提高效率。

3)修饰函数返回值:

返回值的类型必须也是constant类型的。

4)修饰类的成员函数:

int GetCount(void) const;

void function()const; //常成员函数, Const成员函数不能改变类的成员变量。  

(1)const修饰的成员函数不能修改任何的成员变量(mutable修饰的变量除外)

(2)const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量

3.Linux系统中,unint64_t,uint32_t, uint16_t, uint8_t哪些需要从网络字节序转换到主机字节序,转换的接口是什么,请分别实现:

所谓字节序是指多字节数据的存储顺序,比如0x1234要放在0000H和0001H两存储单元,有两种存储方式:大端格式为[0000H]=12,[0001H]=34和小端格式为[0000H]=34,[0001H]=12。

       大端格式:将高位字节数据存储在低地址,低位字节数据存储在高地址

       小端格式:将高位字节数据存储在高地址,低位字节数据存储在低地址

网络协议指定了通讯的字节序为大端格式,而本机对应的字节序不论大端格式还是小端格式都统称为主机序。

在需要字节序转换时,一般使用linux系统下arpa/inet.h头文件特定的转换函数。具体见如下:

主机字节序 => 网络字节序

将32位主机字节序数据转换成网络字节序数据: uint32_t htonl(uint32_t hostint32);

将16位主机字节序数据转换成网络字节序数据: uint16_t htons(uint16_t hostint16);

       int main(int argc, char *argv[])

       {

              int  a = 0x01020304;

              short  b = 0x0102;

              printf("###:htonl(0x%08x)=0x%08x\n" ,a ,htonl(a));

              printf("###:htons(0x%04x)=0x%04x\n" ,b ,htons(b));

              return 0;

       }

2.

#include <arpa/inet.h>

网络字节序 => 主机字节序

将32位网络字节序数据转换成主机字节序数据:  uint32_t ntohl(uint32_t netint32);

将16位网络字节序数据转换成主机字节序数据: uint16_t ntons(uint16_t netint16);

uint32_t htonl(uint32_t hostint32);

功能:

将 32 位主机字节序数据转换成网络字节序数据

参数:

hostint32:需要转换的 32 位主机字节序数据,uint32_t 为 32 为无符号整型

返回值:

成功:返回网络字节序的值

 

uint16_t htons(uint16_t hostint16);

功能:

将 16 位主机字节序数据转换成网络字节序数据

参数:

hostint16:需要转换的 16 位主机字节序数据,uint16_t,unsigned short int

返回值:

成功:返回网络字节序的值

uint32_t ntohl(uint32_t netint32);

功能:

将 32 位网络字节序数据转换成主机字节序数据

参数:

netint32:待转换的 32 位网络字节序数据,uint32_t,unsigned int

返回值:

成功:返回主机字节序的值

 

uint16_t ntohs(uint16_t netint16);

功能:

将 16 位网络字节序数据转换成主机字节序数据

参数:

netint16:待转换的 16 位网络字节序数据,uint16_t,unsigned short int

返回值:

成功:返回主机字节序的

4.应用层传输协议,传输层传输协议:

应用层协议:http,smtp,ftp,dns,mq;

传输层位于OSI七层网络模型中的第四层,协议有TCP · UDP · TLS · DCCP · SCTP ·RSVP · PPTP。

七层网络模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层;

5.socket通信中,何时断开连接:

客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。

建立连接需要三次握手,断开连接需要四次握手,可以形象的比喻为下面的对话:

  • [Shake 1] 套接字A:“任务处理完毕,我希望断开连接。”
  • [Shake 2] 套接字B:“哦,是吗?请稍等,我准备一下。”
  • 等待片刻后……
  • [Shake 3] 套接字B:“我准备好了,可以断开连接了。”
  • [Shake 4] 套接字A:“好的,谢谢合作。”

6.多线程的启动函数是createThread还是_beginThread:

_beginthreadex和CreateThread在功能上完全可替代 

CreateThread()函数是Windows提供的API接口,在C/C++语言另有一个创建线程的函数_beginthreadex()

7. 函数指针:

int* fun():这是指针函数,返回值是指针类型的

(int*p) ():函数指针

8.this指针的作用,private?protected?

this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。

this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象。全局仅有一个this指针,当一个对象被创建时,this指针就存放指向对象数据的首地址。

全局函数,静态函数都不能使用this。

9.可重载运算符和不可重载运算符:

下面是可重载的运算符列表:

双目算术运算符+ (加),-(减),*(乘),/(除),% (取模)
关系运算符==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)
逻辑运算符||(逻辑或),&&(逻辑与),!(逻辑非)
单目运算符+ (正),-(负),*(指针),&(取地址)
自增自减运算符++(自增),--(自减)
位运算符| (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)
赋值运算符=, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
空间申请与释放new, delete, new[ ] , delete[]
其他运算符()(函数调用),->(成员访问),,(逗号),[](下标)

下面是不可重载的运算符列表:

  • .:成员访问运算符
  • .*, ->*:成员指针访问运算符
  • :::域运算符
  • sizeof:长度运算符
  • ?::条件运算符
  • #: 预处理符号

10. 引用传值

引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作;

 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

引用的声明方法:类型标识符 &引用名=目标变量名;

float a; float &b = a; b是a的引用;

引用的一个重要作用就是作为函数的参数。以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。

使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。


引用和多态  
引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。
class  A;
class  B:public A{……};
B  b;
A  &Ref = b;  // 用派生类对象初始化基类对象的引用
Ref 只能用来访问派生类对象中从基类继承下来的成员,是基类引用指向派生类。如果A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过Ref产生多态效果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值