C++泛编程
C++泛编程1.autoauto的主要用途:让编译器自动推断变量的类型
代替冗长复杂的变量声明(函数指针)
在模板中,用于声明依赖模板参数的变量
函数模板依赖模板参数的返回值
用于Lambda表达式中
2.函数模板12345template <typename T>void func(T &a,T &b){}
注1:可以为类的成员函数创建模板,但不能是虚函数和析构函数。
注2:使用函数模板时,如果自动类型推导,不会发生隐式类型转换,而如果显式指定了函数模板的数据类型,则可以发生隐式类型转换。
编译器使用各种函数的规则:
普通函数>具体化>常规模板
如果希望使用函数模板,可以用空模板参数强制使用函数模板
123456789101112131415161718192021222324#include <iostream>// 普通函数void show(int a) { std::cout << "普通函数: " << a << std:: ...
C++八股4
1.malloc、realloc、calloc的区别
malloc函数:
用于分配指定大小的内存块,并返回指向该内存块的指针。如果分配失败,则返回 NULL。
使用 malloc 分配的内存不会被初始化,其中的数据是随机的。
calloc 函数:
原型为 void* calloc(size_t n, size_t size);
第一个参数 n 表示要分配多少个元素;第二个参数 size 表示每个元素的大小(以字节为单位)。
calloc 会将分配的内存初始化为零。
realloc 函数:
原型为 void* realloc(void *p, size_t new_size);
realloc 函数用来改变已经分配的内存块的大小。它可以扩大或缩小已有的内存块。如果新的内存大小大于原来的大小,那么新增的部分内容未定义(即可能包含任何值)。如果缩小内存块,超出部分会被丢弃。
注:C++中可以通过使用STL容器来避免使用realloc的情况,可以减少由于手动管理内存而引发错误的可能。
2.类成员初始化方式?构造函数的执行顺序 ?为什么用成员初始化列表会快一些?类成员 ...
C++八股3
1.什么是大小端存储?大端存储:数据的最高有效字节存放在内存地址的最低位置
小端存储:最低有效字节被存放在内存地址的最低位置
注:在网络协议中通常使用大端序
2.volatile、mutable和explicit关键字的用法
volatile:
volatile关键字用于告诉编译器,该变量的值可能会在程序控制之外被改变(如硬件中断、操作系统、其他线程等)。因此,编译器不应该对涉及该变量的操作进行优化。
每次访问volatile变量时,都会从内存重新读取数据,而不是使用寄存器中的缓存副本。(这样可以防止变量被其他线程修改后读到错误的变量值)
注:现代编译器为了提高性能,通常会将经常访问的变量值保存在CPU寄存器中,以便快速访问。
mutable: mutable关键字用于允许对象的某些成员变量即使在const成员函数内也可以被修改。
12345678910111213141516171819202122232425262728#include <iostream>class Person {private: int age; // 年龄 muta ...
C++八股2
C++八股21.C++中const和static的作用static:
不考虑类的情况
隐藏:当使用static修饰全局变量或函数时,它们将仅在定义它们的文件内可见(即具有内部链接性),而没有static修饰的全局变量和函数则可以在其他文件中通过声明来引用。
注:当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
默认初始化为0:无论是未初始化的全局静态变量还是局部静态变量,默认情况下都会被初始化为0,并且这些变量都存储在全局未初始化区。
持久存在与记忆性:如果在函数内部定义了静态变量,那么这个变量在整个程序运行期间一直存在,只会被初始化一次,并且即使函数退出后仍然存在,但它的作用域是局部的。
考虑类的情况
static成员变量:必须在类外部进行初始化
static成员函数:没有this指针,不能访问类的非静态成员变量或调用非静态成员函数。
const:
不考虑类的情况:
不可变性:一旦定义了一个const常量,就必须同时对其进行初始化,之后其值不能再被修改。
参数传递:用const修饰传入参数,则函数保证传入参数不发生改变
考虑 ...
CMake
CMakeCMake编译过程
创建CMakeLists.txt文件:touch CMakeLists.txt
使⽤cmake,生成makefile文件
使⽤make命令编译,生成了可执行程序
PROJECT
PROJECT:来指定工程的名称
1PROJECT (HELLO)
add_executable:定义工程会生成一个可执行程序
1add_executable(可执行程序名 源文件名称)
SET
显示地指定变量
SET(SRC_LIST main.cpp) SRC_LIST变量就包含了main.cpp
多个cpp文件:SET(SRC_LIST main.cpp t1.cpp t2.cpp)
在 CMakeLists.txt 中通过 set 命令指定所使用的C++标准:
123456#增加-std=c++11set(CMAKE_CXX_STANDARD 11)#增加-std=c++14set(CMAKE_CXX_STANDARD 14)#增加-std=c++17set(CMAKE_CXX_STANDARD 17)
指定输出的路径:
12set(HOME /home/robin/ ...
Protobuf
ProtobufProtobuf序列化的步骤protobuf中的数据类型 和 C++ 数据类型对照:
使用protobuf进行序列化的步骤:
定义.proto文件: .proto文件来描述要序列化的数据结构
12345678//声明所使用的protobuf版本号syntax = "proto3";message Person { string name = 1; int32 id = 2; string email = 3;}
注:等号后面的编号要从1开始,每个成员都有一个唯一的编号,不能重复,一般连续编号即可。
编译.proto文件:使用protoc编译器将user_info.proto文件编译成C++代码
1protoc -I path <user_info.proto> --cpp_out=输出路径(存储生成的c++文件)
注1:-I: 参数后面可以跟随一个或多个路径,用于告诉编译器在哪些路径下查找导入的文件或依赖的文件,如protoc -I path1 -I path2 或 protoc -I path1:pa ...
Shell基础
Shell基础shell是一个命令行解释器,用于接收用户(应用程序)命令来调用系统内核。
脚本格式:以#!/bin/bash开头(指定解析器)
执行方式:
1.bash/sh + 绝对路径(相对路径)
2.绝对路径(相对路径)
需要可执行(x)权限
3.source + 绝对路径(相对路径): 在当前的shell下执行
子shell:在子shell中设置的当前的环境变量,对于父shell不可见
1.变量1.1 常用系统变量常用系统变量:$HOME、$PWD、$USR、$SHELL、$PATH
env: 列出当前 shell 的所有环境变量
set: 显示所有 shell 变量(包括环境变量和局部变量)
printenv+环境变量名: 输出某个环境变量的值
$PATH: 保存了搜索系统命令的路径(/usr/bin)
1.2 自定义变量自定义变量(局部变量):变量名=变量值(等号前后不能有空格)
局部变量导出为全局变量:export + 变量名
注:在子shell中修改全局变量对父shell不可见
只读变量:readonly 变量名=变量值
撤销变量:unset + 变量 ...
C++八股1
C++八股1.在main执行之前和之后执行的代码可能是什么
main函数执行之前,主要就是初始化系统相关资源:
设置栈指针
初始化静态static变量和global全局变量
调用构造函数
main函数执行之后:
全局对象的析构函数
2.指针和引用的区别
指针是一个变量,存储的是一个地址,引用是原变量的别名
指针可以为空,引用不能为NULL且在定义时必须初始化
3.在传递函数参数时,什么时候该使用指针,什么时候该使用引用呢?
需要返回函数内局部变量的内存的时候用指针。指针作为函数参数,需要在堆上动态分配内存,在函数外部仍然可以访问这块内存。完要记得释放指针,不然会内存泄漏。
对栈空间大小比较敏感(比如递归)的时候使用引用。使用引用传递不需要创建临时变量,开销要更小
类对象作为参数传递的时候使用引用,这是C++类对象传递的标准方式
4.堆和栈的区别
申请方式不同。
栈由系统自动分配。
堆是自己申请和释放的。
申请大小限制不同。
栈顶和栈底是之前预设好的,栈是向栈底扩展(从高地址向低地址扩展),大小固定
注:栈空间耗尽(例如递归调用过深),会导致 栈溢出
堆向 ...
docker基础
1.docker与VMdocker的作用:实现跨平台的快速运行应用
docker为什么比VM快?
docker有着比虚拟机更少的抽象层:docker 容器共享宿主机的操作系统内核,不需要为每个容器启动一个完整的操作系统实例。而虚拟机需要为每个虚拟机启动一个完整的操作系统实例,这会占用更多的内存和 CPU 资源。
区别:
虚拟机:虚拟机是通过Hypervisor(虚拟机管理系统,常见的有VMWare、workstation、VirtualBox),虚拟出网卡、cpu、内存等虚拟硬件,再在其上建立虚拟机,每个虚拟机是个独立的操作系统,拥有自己的系统内核(GuestOS)。
容器:容器是利用namespace将文件系统、进程、网络、设备等资源进行隔离,利用cgroup对权限、cpu资源进行限制,最终让容器之间互不影响,容器无法影响宿主机。
2.docker基本组成
3.docker常用指令docker images:查看容器列表
启动容器:
docker run [-d] [--name] [-p] [-v] [--network] 容器名(指定) 容器 [-e]
docker run ...
C++设计模式
设计模式1.模板模式应用场景:算法所需的关键步骤已知,但具体实现未知
抽象类:定义算法的主体框架,具体实现由子类完成
具体子类:提供步骤的具体实现
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465#include <iostream>// 抽象类,定义了模板方法和步骤class Beverage {public: // 模板方法,定义了制作饮料的步骤 void prepareRecipe() { boilWater(); brew(); // 抽象步骤,由子类实现 pourInCup(); addCondiments(); // 抽象步骤,由子类实现 } // 基本步骤,不需要子类改变 void boilWater() { ...