C/C++基础知识点(四)

37.静态变量什么时候初始化

静态变量存储在虚拟地址空间的数据段和bss段,C语言中其在代码执行之前初始化,属于编译期初始化。而C++中由于引入对象,对象生成必须调用构造函数,因此C++规定全局或局部静态对象当且仅当对象首次用到时进行构造。

38.HTTP和HTTPS的区别

HTTP协议和HTTPS协议的区别如下:

  • HTTP协议是以明文的方式在网络中传输数据,而HTTPS协议传输的数据经过TLS加密后,HTTPS具有更高的安全性
  • HTTPS在TCP三次握手阶段之后,还需要进行SSL的handshake,协商加密使用的对称加密密钥
  • HTTPS协议需要服务端申请证书,浏览器端安装对应的根证书
  • HTTP协议的端口是80,HTTPS的协议端口是443
39.HTTPS的优缺点

优点:

  • 传输数据过程中使用秘钥进行加密,所以安全性更高
  • 可交易认证用户和服务器,确保数据发送到正确的用户和服务器

缺点:

  • 握手阶段延时较高,由于在进行会话之前还需要进行SSL握手,因此HTTPS协议握手阶段延时增加
  • 部署成本高,一方面HTTPS协议需要使用证书来验证自身的安全性,所以需要购买CA证书,另一方面由于采用HTTPS协议需要进行加解密的计算,占用CPU资源较多,需要的服务器配置或数目高。
40.IP地址和MAC地址的作用

MAC地址是一个硬件地址,用来定义网络设备的位置,主要由数据链路层负责。
IP地址是IP协议提供的一种统一的地址格式,为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

41.GET和POST的区别

对于GET方式的请求,浏览器会把http header和data一并发出去,服务器响应200(返回数据)
对于POST方式的请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)

主要区别如下:

  • get参数通过url传递,post放到request body中
  • get请求在url中传递的参数是有长度限制的,post没有
  • get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息
  • get请求只能进行url编码,而post支持多种编码方式
  • get请求参数会被完整保留在浏览历史记录,post中的参数不会被保留
  • get和post本质上就是tcp连接,并无差别,但是由于http的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
  • get产生一个tcp数据包,post产生两个数据包。
42.C++11中的auto不能用于什么情况

auto使用限制:

  • 不能用于函数参数
  • 不能用于非静态成员变量,可以用于静态常量成员变量,如 static const auto a = 0;
  • 无法定义数组,如:auto a[10] = {0};
  • 无法推导出模板参数, 如:Bar<int> bar; Bar<auto> b = bar;

auto仅能用于推到static const的整型或者枚举成员,因为其他静态类型在C++标准中无法就地初始化,虽然C++11中可以接收非静态成员变量的就地初始化,但不支持auto类型非静态成员变量的初始化。

43.类成员函数的重载、覆盖和隐藏区别

成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。

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

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

44.重载(overload)和重写(overried)的区别?

从定义上来说:

  • 重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
  • 重写:是指子类重新定义父类虚函数的方法。

从实现原理上来说:

  • 重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!
  • 重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。
45.父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,能否实现多态?

1.virtual修饰符会被隐形继承的。
2.virtual可加可不加,子类覆盖它的函数不加virtual ,也能实现多态。

46.拷贝构造函数在哪几种情况下会被调用?

1.当类的一个对象去初始化该类的另一个对象时;
2.如果函数的形参是类的对象,调用函数进行形参和实参结合时;
3.如果函数的返回值是类对象,函数调用完成返回时。

47.构造函数和析构函数是否可以被重载,为什么?

构造函数可以被重载,析构函数不可以被重载。因为构造函数可以有多个且可以带参数,而析构函数只能有一个,且不能带参数。

48.TCP/IP 建立连接的过程

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

  • 第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;
  • 第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;
  • 第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luoyayun361

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值