每日面经(五)

1.static的用法和作用

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)

当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

3.static的第三个作用是默认初始化为0(static变量)

其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

4.static的第四个作用:C++中的类成员声明static

  1. 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

  2. 在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其它函数访问;

  3. 在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;

  4. 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

  5. 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

类内:

  1. static类对象必须要在类外进行初始化,static修饰的变量先于对象存在,所以static修饰的变量要在类外初始化;

  2. 由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数不能访问非static的类成员,只能访问 static修饰的类成员;

  3. static成员函数不能被virtual修饰,static成员不属于任何对象或实例,所以加上virtual没有任何实际意义;静态成员函数没有this指针,虚函数的实现是为每一个对象分配一个vptr指针,而vptr是通过this指针调用的,所以不能为virtual;虚函数的调用关系,this->vptr->ctable->virtual function

2.public,protected和private访问和继承权限/public/protected/private的区别

  • public的变量和函数在类的内部外部都可以访问。

  • protected的变量和函数只能在类的内部和其派生类中访问。

  • private修饰的元素只能在类内访问。

(一)访问权限

派生类可以继承基类中除了构造/析构、赋值运算符重载函数之外的成员,但是这些成员的访问属性在派生过程中也是可以调整的,三种派生方式的访问权限如下表所示:注意外部访问并不是真正的外部访问,而是在通过派生类的对象对基类成员的访问。

派生类对基类成员的访问形象有如下两种:

  • 内部访问:由派生类中新增的成员函数对从基类继承来的成员的访问
  • 外部访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问

(二)继承权限

public继承

公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,都保持原有的状态,而基类的私有成员任然是私有的,不能被这个派生类的子类所访问

 

protected继承

保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元函数访问,基类的私有成员仍然是私有的,访问规则如下表 

 

private继承

私有继承的特点是基类的所有公有成员和保护成员都成为派生类的私有成员,并不被它的派生类的子类所访问,基类的成员只能由自己派生类访问,无法再往下继承,访问规则如下表

总结

一、访问权限

访问权限外部派生类内部
public
protected
private

public、protected、private 的访问权限范围关系:

public > protected > private

二、继承权限

  1. 派生类继承自基类的成员权限有四种状态:public、protected、private、不可见
  2. 派生类对基类成员的访问权限取决于两点:一、继承方式;二、基类成员在基类中的访问权限
  3. 派生类对基类成员的访问权限是取以上两点中的更小的访问范围(除了 private 的继承方式遇到 private 成员是不可见外)。例如:
  • public 继承 + private 成员 => private
  • private 继承 + protected 成员 => private
  • private 继承 + private 成员 => 不可见

3.浏览器输入一个网站按下回车之后发生什么

  1. 浏览器会先在自己的缓存中查找该网站是否存在缓存版本,如果存在且未过期,则直接从缓存中获取网站资源。如果缓存过期,则需要向服务器发送请求。
  2. 浏览器根据域名解析出该网站所对应的IP地址,这个过程涉及到DNS的解析,一般情况下是通过本地host文件或ISP提供的DNS服务完成的。
  3. 浏览器与该IP地址对应的服务器建立TCP连接,这个过程通过TCP的三次握手完成,确保稳定的连接建立。
  4. 浏览器向服务器发送HTTP请求,请求中包含有浏览器发送请求的方法(如GET、POST)、请求头(如Accept、Accept-Encoding、User-Agent等)和请求体(请求需要提交的数据,可能为空)。
  5. 服务器接收到请求后,解析请求头和请求体,根据请求内容和对应的处理逻辑返回HTTP响应,响应中包含响应头和响应体。响应头中包含一些重要的信息,如状态码、日期、服务器类型、内容编码方式等,响应体则为服务器返回的数据,可以是HTML、CSS、JavaScript、图片、视频等类型的数据。
  6. 浏览器接收到响应后,根据响应头中的状态码判断请求是否成功,状态码200表示成功,400表示客户端错误,500表示服务器错误等。
  7. 浏览器会根据响应头中的内容类型(Content-Type)解析响应体中的数据,判断响应的数据类型。
  8. 浏览器解析数据,并根据网站中的资源链接继续请求需要的其他资源,如CSS、JS、图片等,重复上述请求过程,直到最后获取到所有需要的资源。
  9. 浏览器通过HTML和CSS渲染引擎将获取到的HTML、CSS和JS等文件解析为网页,并在屏幕上呈现出来。

4.https协议和http有什么不同,怎么加密的,在哪一层,加密过程是什么,是对称还是非对称的?

HTTPS(HyperText Transfer Protocol Secure)协议与 HTTP 协议的最大不同在于其具备安全性。HTTPS 是在 HTTP 协议的基础上,使用 SSL/TLS 实现了数据加密传输,并且进行了服务器认证。所以,HTTPS 能够保证通信的安全性,以防止数据被窃听、篡改或伪造等。

HTTPS 协议的加密过程是在应用层与传输层之间插入了一层 SSL/TLS 协议,数据先通过 SSL/TLS 协议进行加密,再进行 HTTP 通信,从而实现传输的加密。

SSL/TLS 的加密过程一般是采用非对称密钥加密与对称密钥加密相结合的方式:

  1. 通信双方首先通过非对称密钥加密进行握手,确定一些信息,如对称密钥加密算法、密钥长度等。
  2. 通过握手确定的对称密钥加密算法和密钥长度等参数,通信双方协商一个对称密钥,并将这个对称密钥通过非对称密钥加密后,发给对方。
  3. 通信双方接收到对称密钥后,开始使用对称密钥加密算法对传输的数据进行加密,并使用对称密钥解密算法对接收到的数据进行解密。

HTTPS 协议的加密过程主要是在 SSL/TLS 协议层进行的,即在传输层与应用层之间。所以,当我们使用 HTTPS 协议访问网站时,数据会在应用层与传输层之间进行加密传输,并且只有服务器和客户端之间才能够解密传输的数据。

5.引用计数放在shared_ptr的泛型中还是特化中

引用计数是一个智能指针的关键组成部分、是用来记录对象的引用数量,根据引用计数的变化决定是否销毁对象。一般情况下,引用计数的实现都是将其放在智能指针实现中,而非特化中。

在 C++ 中,智能指针最常见的类型是 std::shared_ptr,因为它是一个计数器类型的智能指针,内部包含引用计数的信息。每当用一个新的 shared_ptr 对象指向一个已有对象时,被指向对象的引用计数就会加一,当 shared_ptr 被销毁或 reset() 被调用时,引用计数器就会减一。只有当引用计数器为 0 时,才会销毁被指向的对象。

因此,引用计数放在shared_ptr的泛型实现中,是因为shared_ptr能够确保在所有分配内存的对象不再被引用时自动回收内存,智能指针自身管理内存的特性很好地解决了内存管理的问题。而特化中则往往是指定类型的一些特殊实现方式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值