小米C++开发,校招一面,纯C++
公众号:阿Q技术站
来源:https://www.nowcoder.com/feed/main/detail/e584c8b5d5e74f1faf8e8b9cc033dae2
1、说一下http和https的区别?
- 数据加密:
- HTTP:传输的数据是明文的,安全性较低,容易被窃听和篡改。
- HTTPS:通过 SSL/TLS 协议加密传输数据,可以保证数据的机密性,安全性更高。
- 数据完整性:
- HTTP:不提供数据完整性保护,数据在传输过程中可能被篡改。
- HTTPS:使用数字证书和加密算法来验证数据的完整性,保证数据在传输过程中不被篡改。
- 身份验证:
- HTTP:不提供身份验证机制,无法验证通信双方的身份。
- HTTPS:通过 SSL/TLS 协议验证服务器的身份,确保客户端连接的是真实的服务器,防止中间人攻击。
- 端口号:
- HTTP:默认端口号是 80。
- HTTPS:默认端口号是 443。
- SSL/TLS 握手过程:
- HTTPS 在建立连接时需要进行 SSL/TLS 握手过程,包括密钥交换、身份验证和协商加密算法等步骤,而 HTTP 不需要。
2、你用过lambda吗?
它是一种用来创建匿名函数的方式,可以在需要函数的地方直接定义函数,而不必显式地编写函数的名称。
[capture clause] (parameters) -> return_type {
// 函数体
};
其中:
-
capture clause
指定 lambda 表达式可以访问的外部变量。有两种形式:
[ ]
:不捕获任何外部变量。[var1, var2, ...]
:捕获指定的外部变量。捕获的变量可以是值传递或引用传递。
-
parameters
:lambda 函数的参数列表。 -
return_type
:返回类型,可以省略,编译器会根据返回语句自动推断。 -
{}
:函数体。
给个例子:
#include <iostream>
int main() {
// lambda 表达式,捕获外部变量 a,b
int a = 10, b = 20;
auto sum = [a, &b] () -> int {
b = 30; // 修改外部变量 b
return a + b;
};
std::cout << "Sum: " << sum() << std::endl; // 输出:40
std::cout << "b after lambda: " << b << std::endl; // 输出:30
return 0;
}
3、右值引用说一下?
右值引用是 C++11 引入的一种新的引用类型,用于标识临时对象(右值)的引用。右值引用的语法是使用双 && 符号,例如 int&&
。
右值引用的特点和用途:
- 绑定临时对象:右值引用可以绑定到临时对象(右值)上,延长其生命周期,避免临时对象在表达式结束后被销毁。
- 移动语义:右值引用是实现移动语义的基础。通过移动构造函数和移动赋值运算符,可以将资源(如内存、文件句柄等)从一个对象“移动”到另一个对象,避免不必要的资源拷贝,提高效率。
- 完美转发:右值引用可以与模板结合使用,实现完美转发(perfect forwarding),即在传递参数时保持参数的类型信息和引用性质。
例子:
#include <iostream>
void process(int&& value) {
std::cout << "Received rvalue: " << value << std::endl;
}
int main() {
int a = 10;
process(std::move(a)); // 此时 a 被转换为右值
return 0;
}
4、a和&a?
C++ 中,a
表示变量的值,而&a
表示变量的地址(即指针)。
给个例子一清二楚:
#include <iostream>
int main() {
int a = 10; // 定义一个整型变量 a,值为 10
int* ptr = &a; // 定义一个指针 ptr,指向变量 a 的地址
std::cout << "Value of a: " << a << std::endl; // 输出:Value of a: 10
std::cout << "Address of a: " << &a << std::en