前言:因为c++基础打得不牢,所以准备花点时间再学一下c++的基础知识,主要是看网易云课堂里面的免费课程,把一些知识点做个笔记记下来。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1:编程规范

1        头文件

1.1    使用头文件保护
使用#define进行头文件保护,而不使用微软的#pragma once。
为了保证唯一性,头文件保护的命名需要基于项目代码路径,比如Project\Src\Area\File.h 则文件的保护应该像这样:
#ifndefine         PROJECT_SRC_AREA_FILE_H
#define PROJECT_SRC_AREA_FILE_H

#endif

 1.2    头文件依赖

使用前置声明减少头文件的所要包含的文件数量,也就减少了需要重新编译文件的几率。
对于需要在头文件里使用其他文件中定义的类时,如果只是使用类的声明而不是具体定义,应该是用前置声明代替包含整个文件,如下:
使用class SomeClass;
不使用 #include “SomeClass”。
 
1.3    包含头文件的顺序
顺序如下:C库、C++库、其他库.h、项目内的.h,如果次文件是cpp文件,那么要首先包含其对应的头文件,然后再按前述顺序。每个层级用空行分隔,同一层级的文件顺序按英文字母先后顺序排列,如下:
#include“MyFile.h”  (如果次文件是cpp文件,首先包含自己的头文件)

#include<stdio.h>
#include<unistd.h> #include<iostream>
#include<map>
#include<string> #include“lib/Alpha.h”
#include“lib/Beta.h”
#include“other/zoo.h” #include“bar.h”
#include“foo.h”

 2        作用域

2.1    全局变量
尽量不要使用全局变量,根据经验,全局变量起的作用往往仅是一个静态变量。如果非要使用全局变量,考虑使用单例模式代替。
多线程中使用的全局变量,不要使用class类型(包括STL容器),避免class内部的实现非线程安全而导致bug。
 
3        类
3.1    声明顺序
成员先后顺序:typedef、enum、常量、构造析构函数、成员函数,成员变量。
域先后顺序:public、protected、private。
 
比如:
Class MyClass
{
public: public:
voidFoo(); protected:
voidBar(); private:
voidFunc(); public:
intm_nCommonVar; private:
intm_nMyVar;
};

3.2    构造函数

构造函数只负责简单的初始化功能,如果需要进行有意义的初始化,请使用Init()函数。
*严禁在构造函数中调用虚函数。
 
3.3    拷贝构造函数
仅需要拷贝一个对象时才定义拷贝构造函数,否则明确在private域中使用声明DISALLOW_COPY_AND_ASSIGN,避免编译器隐式声明的拷贝构造函数导致的不确定行为。如下:
private:
DISALLOW_COPY_AND_ASSIGN(MyClass);

3.4    结构体和类

只有数据时,使用结构体,否则使用类。
 
3.5    继承
尽量使用组合代替继承。
如果类中有一个virtual函数,则析构函数必须声明为virtual。
所有继承必须为public,私有继承使用其它实现方式替代。
 
3.6    多重继承
尽量避免使用多重继承,除非是COM。
 
3.7    模板
尽量不要使用模板,确定使用模板时确保一年后回头你还能看懂你的代码,并且调试这段模板无压力。
 
3.8    操作符重载
尽量避免使用操作符重载。
 
4        其它特性
4.1    异常处理
不要使用异常处理。
 
4.2    RTTI(运行时类型识别)
不要使用RTTI,也就是dynamic_cast,非要使用只能说明设计有缺陷。
原因:dynamic_cast会失败,而且不安全,难维护。
 
4.3    前置自增和自减
不考虑结果使用的情况下,尽量使用++i代替i++,因为++i效率更高。
 
4.4    const使用
尽量使用const修饰变量。                                                    
 
5        注释
5.1    头文件注释
头文件开头部分必须使用注释,说明此文件的作者、作用等信息。
即可证明你有多叼,也可让后人叼你。
格式如下:
/************************************************************************
*
* @description: XLBrowserAppSupport的Lua接口封装
*
* @author: Gaoyunxiang
* @date: 2015.11.10
*
* @last modified author:
* @last modified date:
*
* @ copyright Xunlei Network 2015 -
*
*************************************************************************/

5.2    类注释

声明类之前需要使用类注释,说明此类的使用用途及注意事项
如下:
// 浏览器类。
// 实现浏览器的常用功能,如导航等。
// 需由浏览器工厂类来创建实例。
class Browser{};
5.3    函数注释

重要或难理解的函数,需要在函数声明前加上注释。
比如:
// 做加法
// nVar1:第一个加数
// nVar2:第二个加数
// 返回值:相加结果
int Add(int nVar1, int nVar2);

  

5.4    逻辑注释

对于很难理解、重要、实现精彩的部分必须加上注释。
 
5.5    TODO注释
对于那些来不及实现、暂未实现、需要去实现的地方加上TODO注释。
如下:
// TODO: Fly to the moon.
 
6        编码风格
6.1    命名规则
尽量不要使用缩写,严禁使用不明单词的缩写。
类名:大写字母开头,每个单词首字母大写。
函数名:大写字母开头,每个单词首字母大写
变量名:首字母(通常为前缀)小写,用下划线分割
 
6.2    变量前缀
前缀为小写,后面第一个字母为大写
前缀的结尾为_时(如m_..),后面第一个字母为小写
short/int/size_t..,加n,如int nVal =1;
long,加l
float/double..,加f
bool/BOOL..,加b
DWORD,加dw
char*,加sz,如char *szVal= “abc”;
wchar_t*,加wsz
string,加str
wstring,加wstr
指针,加p
long指针,加lp
函数指针,加pfunc
vector,加vec
list,加list
map,加map
句柄类,加h
类成员变量,加m_,如HWND m_hParentWnd= 0x66666666;
全局变量,加g_
静态变量,加s_
常量,全部字母大写
类名,加C
 
6.3    缩进和换行
使用空格代替table,在VS里将table设置成4个空格。每个级别进行4个空格的缩进。
不要连续使用多于一次的换行。
 
6.4    花括号
另起一行使用。
 
6.5    条件、循环、开关等语句
关键字后面加空格再使用。
比如:
If ();
while ();
switch语句后的case:部分加作用域{}。
7        其它注意事项
7.1    堆分配和释放
new/delete等堆操作,必须成对出现。
尽量遵从谁分配谁释放的原则。
 
7.2    引用计数
AddRef()/Release()必须成对出现。
尽量遵从谁分配谁释放的原则。
 
7.3    指针、句柄使用完释放后必须设置成NULL。
7.4    函数功能要单一,避免耦合多功能,严禁CreateAndNavigate这种函数。
7.5    指针的空值比较使用NULL,而不是0。
7.6    浮点数的零值比较严禁使用== 0。
7.7    避免直接使用微软二次定义的数据类型,比如DWORD,使用其原始的unsigned long,方便跨平台。
 
2:C++的编译和执行

流程图如下:

从.cpp文件到.exe文件可以用   g++ -o  HelloWorld  HelloWorld.cpp 一步到位生成HelloWorld.exe可执行文件。下面图是整个过程按照上图的拆分,了解一下即可。

 3:课程作业

 /*
* 文件名: Charpter2
* 描 述: 输出寒冰射手.艾希的详细信息
* 作 者:刘雷
* 时 间:2019/10/9
* 版 权:version 1.0
*/
#include <iostream> using namespace std; int main()
{
cout << "名称:寒冰射手.艾希" << endl;
cout << "伤害:56\t\t攻击距离:600" << endl;
cout << "护甲:15.5(+3.4)\t魔抗:30(+0.0)\n"
<< "生命值:395(+79)\t生命回复:0.9(+0.11)\n"
<< "法力值:280(+32)\t法力回复:1.26(+0.08)\n"
<< "移速: 325\t\t" << "定位:ADC 辅助\n"
<< "点券:450" << endl;
return ;
}

C++编程规范和编译过程详解的更多相关文章

  1. Android编译过程详解(一)

    Android编译过程详解(一) 注:本文转载自Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359 ...

  2. cegui-0.8.2编译过程详解

    cegui 编译过程详解(cegui-0.8.2) cegui配置整了好长时间了,在一位大牛帮助下终于搞定了,网上的教程大多是老版本的,cegui-0.8.2版的配置寥寥无几,现在总结一下,献给正在纠 ...

  3. GCC 概述:C 语言编译过程详解

    Tags: C Description: 关于 GCC 的个人笔记 GCC 概述 对于 GCC 6.1 以及之后的版本,默认使用的 C++ 标准是 C++ 14:使用 -std=c++11 来指定使用 ...

  4. uboot主Makefile分析(t配置和编译过程详解)

    1.编译uboot前需要三次make make distcleanmake x210_sd_configmake -j4 make distclean为清楚dist文件. make x210_sd_c ...

  5. uboot配置和编译过程详解【转】

    本文转载自:http://blog.csdn.net/czg13548930186/article/details/53434566 uboot主Makefile分析1 1.uboot version ...

  6. uboot配置和编译过程详解

    根据朱有鹏老师讲解整理 一.uboot主Makefile分析 1.uboot version确定(Makefile的24-29行) include/version_autogenerated.h文件是 ...

  7. C语言编译过程详解

    前言 C语言程序从源代码到二进制行程序都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程. 编写hello world C程序: // hello.c #include ...

  8. Android编译过程详解(三)

    前面两节讲解了自定义Android编译项和创建Product产品配置文件,除了编译和定义产品相关环境变量外,还需要定义Board相关环境变量. 1. build/core/config.mk 109 ...

  9. gcc 编译过程详解-(转自CarpenterLee)

    前言 C语言程序从源代码到二进制行程序都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程. 编写hello world C程序: // hello.c #include ...

随机推荐

  1. 20140315 模板类pair的用法 2、visual 2010调整代码格式是ctrl+k+

    1.模板类pair的用法 包含头文件#include<utility>   http://blog.csdn.net/laixingjun/article/details/9005200 ...

  2. DRF的序列化组件

    目录 DRF的序列化组件 Serializer组件 序列化 反序列化 ModelSerializer组件 序列化和反序列化 自定义Response方法 基表相关 DRF中ORM的多表关联操作 外键设计 ...

  3. HDU 4325 离散化+树状数组 或者 不使用树状数组

    题意:给出一些花的开放时间段,然后询问某个时间点有几朵花正在开放. 由于ti<1e9,我们需要先将时间离散化,然后将时间点抽象为一个数组中的点,显然,我们需要进行区间更新和单点查询,可以考虑线段 ...

  4. JDBC_数据库连接池c3p0

    /** * @Description: TODO(这里用一句话描述这个类的作用) * @Author aikang * @Date 2019/8/26 20:12 */ /* 1.数据库连接池: 1. ...

  5. C# 创建DataTable并添加行和列

    DataTable dt=new DataTable dt.Columns.Add("numview", typeof(Int32)); dt.Columns.Add(" ...

  6. 安装rubygems

    转载 http://blog.csdn.net/huanghai200911/article/details/51251472 1,下载rubygems-2.4.8.tar包,下载地址:https:/ ...

  7. K8S之部署Dashboard

    转载声明 本文转载自:ASP.NET Core on K8S深入学习(2)部署过程解析与部署Dashboard 1.Yaml安装 下载yaml文件 wget https://raw.githubuse ...

  8. Sublime Text自定制代码片段(Code Snippets)

    在编写代码的整个过程中,开发人员经常会一次又一次的改写或者重用相同的代码段,消除这种重复过程的方法之一是把我们经常用到的代码保存成代码片段(snippets),这使得我们可以方便的检索和使用它们. 为 ...

  9. [JZOJ2865]【集训队互测 2012】Attack

    题目 题目大意 平面上有一堆带权值的点.两种操作:交换两个点的权值,查找一个矩形的第\(k\)小 \(N<=60000\) \(M<=10000\) \(10000ms\) 思考历程&am ...

  10. C++ 贪吃蛇二维

    #include <iostream> #include <conio.h> #include <windows.h> #include <time.h> ...