前言:因为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. [kuangbin带你飞]专题一 简单搜索 - N - Find a way

    正确代码: #include<iostream> #include<queue> #define N 210 #define inf 0xffffff using namesp ...

  2. 浅析AIDL的使用和工作原理

    AIDL是一种接口定义语言,用于生成可在Android设备上两个进程之间进行进程间通信(IPC)的代码. AIDL的使用 新建一个aidl文件,定义进程间通信的接口 // IStudentManage ...

  3. 8分钟带你深入浅出搞懂Nginx

    Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 图基本上说明了当下流行的技术架构,其中Nginx有点入口网关的味道. 反向代 ...

  4. QT5+Pylon

    VS+QT+Pylon:配置一下包含文件和libs,具体参考pylon说明文档. Windows下  Qtcreator+Pylon:建议把include和libs文件夹拷贝至工作目录,然后修改.pr ...

  5. Web UI 设计(网页设计)命名规范

    Web UI 设计命名规范 一.网站设计及基本框架结构: 1.    Container“container“ 就是将页面中的所有元素包在一起的部分,这部分还可以命名为: “wrapper“, “wr ...

  6. python 模块间的引入

    转载来自: https://www.cnblogs.com/whitemouseV2-0/p/9925344.html https://www.cnblogs.com/whitemouseV2-0/p ...

  7. thinkphp 批量配置

    C配置方法支持批量配置,例如: $config = array('WEB_SITE_TITLE'=>'ThinkPHP','WEB_SITE_DESCRIPTION'=>'开源PHP框架' ...

  8. flink提交文件出现java.io.IOException:unable to close file because the last block does not have enough number of replicas异常

    当提交已经打包好的jar包时候,控制台出现以下的错误.

  9. webpack官方文档学习

    一.webpack是什么? webpack是一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理. 二.安装 前提条 ...

  10. react 16更新

    1.render新的返回类型 render方法支持两种新的返回类型:数组(由React元素组成)和字符串 2.错误处理 16之前,组件在运行期间如果执行出错,就会阻塞整个应用的渲染,这时候只能刷新页面 ...