• 音视频编解码 入职系列-2


    入职计划&&每日总结



    入职第二天(8.2)

    昨日巩固

    1. 工作电脑,开发环境和Jira账号准备OK。
    2. 熟悉公司大致业务方向、三大产品线业务方向。
    3. 了解视频产品线组织架构。

    基础课程

    1. 视频产品业务和专业术语培训
      第一节课看不清也听不明白,有点难受,大致了解视频产品业务的方向,对产品线的组织架构也有所了解。
    2. 租赁产品介绍
      租赁产品占据产品线相关业务的一部分,对租赁和固装有更深的认识。
    3. 视频切换功能讲解+实操演示

    现代C++编码规范

    1.命名约定

    1. 文件命名
    main.cpp
    
    • 1
    1. 类与结构体
    class UrlTable {};
    //不管是静态的还是非静态的,类数据成员前面加下划线
    struct Pool {};
    class Tableinfo 
    {
    private:
    	std::string _tableName;
    	static Pool* _pool;//下划线
    };
    struct UrlTables {};
    struct UrlTableProperties
    {
        std::string name;
        int numEntries;
        static Pool* pool;//无下划
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 引用(别名)
    using PropertiesMap = std::map<std::string, UrlTables*>;
    
    • 1
    1. 枚举
    enum class UrlTableErrors {};//大驼峰(首字母大写)
    enum CoLorSet { Red, Blue, White, Black }; //小驼峰(eg:redBlue) 定义枚举类型
    enum Week { Sun, Mon, Tue, Wed, Thu, Fri, Sat }; // 定义枚举类型week
    
    • 1
    • 2
    • 3
    1. 函数命名
    bool addTableEntry();//小驼峰
    
    • 1
    1. 常量命名
    const int MAX_NUM1 = 100;
    constexpr int MAX_NUM2 = 200;
    
    • 1
    • 2
    1. 全局变量
    int g_Count = 0;//尽量少用,有构造函数的类不能作为全局变量
    
    • 1
    1. 命名空间
    //using namespace std;
    namespace zhang{}//张公子的命名空间
    //顶级命名空间的名称应当是项目名或者是该命名空间中的代码所属的团队的名字。【建议】
    //命名空间中的代码, 应当存放于和命名空间的名字匹配的文件夹或其子文件夹中。【建议】
    //命名空间结尾的}后面应该加注释。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 常见缩写
    table-- > tbl
    argument-- > arg
    buffer-- > buf
    clock-- > clk
    command-- > cmd
    config-- > cfg
    device-- > dev
    error-- > err
    message-- > msg
    maximum-- > max
    minimum-- > min
    parameter-- > para
    previous-- > prev
    register -- > reg
    statistic-- > stat
    initialize-- > init
    synchronize-- > sync
    communication-- > comm
    internationalization-- >i18n 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    入职第三天(8.3)

    2.头文件

    • 头文件应该自包含
    • 头文件包含顺序
      1. 源文件同名.h文件
      2. 本项目定义的其他头文件
      3. 系统头文件
      4. 引用的库文件
    • eg:
    #include "ncpcore.h"       // 优先位置
    #include "ncp/ncpplugin.h" // 本项目头文件
    #include  // 系统头文件
    #include 
    #include     // 库头文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 尽可能减少包含的头文件
    • 不可重复包含
    • 不在头文件公开using namespace:以前练习最常用:using namespace std;

    3.类

    • 不能在构造函数和析构函数中调用虚函数:先构造基类,调用子类虚函数时子类部分数据成员还没初始化,不安全。先析构子类,再析构基类的时候对象已经被销毁了,没有意义。
    • 不能在构造函数中执行可能失败的操作。
    • 不使用的构造函数要明确的删除 =delete。
    • 直接使用编译器生成构造函数要显式的声明 =default。
    • 不想被用于隐式类型转换的单参数构造函数,用 explicit 明确的拒绝。

    1.结构体

    • struct与class 语义几乎相同,区别是结构体默认是 public 。
    • 尽量用类
    • 定义成员变量时就初始化

    2.访问级别

    • 所有数据成员声明为private或protected

    3.成员函数

    成员函数后面加const,不仅语义更清晰,而且函数可以被常量对象 const T& 调用。

    4.函数

    • 函数长度不能超过 50 行
    • 内置类型,采用值传递
    • 类对象,采用引用传递(const T &)
    • 数组对象,采用容器(std::array & 或 std::vector&等)进行传递
    • 参数个数不能过多,一般不超过5个
    • 慎用函数重载
    • 在指针被初次传入(通常是接口函数),或者初次生成的地方(内存申请时)检查指针
    • 对于函数中临时存在的对象或数组,尽量在栈中创建
    • 尽早退出函数
    • 代码块嵌套一般不超过4层

    5.宏规范

    • 禁止宏定义常量,应该用const、constexpr
    • 不要为了提高性能而使用函数式宏:#define sqr(x) ((x) * (x))
    • 使用函数宏,对所有的宏参数加上括号()保护
    • nullptr代替NULL

    入职第四天(8.4)

    6.智能指针

    详见:

    7.容器

    详见:

    8.多线程

    • 尽量减少线程的使用
    • 不要频繁创建和销毁线程
    • 使用锁时要防止死锁

    9.注释

    • 头文件注释:版权信息和其他重要信息
    • 不在文件头中增加作者信息
    • 不在文件头中增加修改记录
    • 不要加无用的注释
    • 较长的代码块结尾加注释

    10.风格

    • using代替typedef
    • 使用auto接收返回值
    • 使用范围for:
    std::vector<int> vec;
    	for (int i = 1; i < 5; ++i)
    	{
    		vec.push_back(i);
    	}
    	for (const auto& p : vec)
    	{
    		std::cout << p;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 不抛出异常

    11.最佳实践

    • 尽量缩小符号存在的名字空间和生命周期
    • 不要重复造轮子
    • 使用printf风格的打印语句
    • 在循环中慎用无符号整数\
    • 使用标志变量是坏代码的表现:
    bool hasDog = false //坏代码
    
    • 1

    12.大五原则

    当一个类实现了以下五项之一时,也应该实现其他四项:

    1. 析构函数
    2. 拷贝构造函数
    3. 赋值运算符
    4. 移动构造函数
    5. 移动赋值运算符
  • 相关阅读:
    OData WebAPI实践-Non-EDM模式
    关于Halcon中variation_model模型的快速解读。
    SpringBoot+Mybaits搭建通用管理系统实例七:访问接口Api层功能实现
    Mysql数据库操作指令
    伦敦金的走势高低的规律
    u盘格式化后数据能恢复吗?
    导外库失败显示错误:Failed to resolve
    springboot网络招聘服务系统毕业设计源码121727
    【css 动画】css实现奔跑的北极熊
    十年架构五年生活-09 五年之约如期而至
  • 原文地址:https://blog.csdn.net/kris_paul/article/details/126121427