前言:因为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. 20130330 printf数组改变 数组指针便利二维数组 二级指针遍历二维数组 ZigZag

    1.为什么printf之后数组的值会改变? #include<stdio.h> ; int * Zigzag() { ,j=,limit=; ; ; int a[N][N]; int (* ...

  2. spark集群进入 bin 下面目录./spark-shell 出现Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

    spark集群启动的时候可以正常,进入 ./spark-shell 就会出现如下错误 配置文件:spark-env.sh export JAVA_HOME=/usr/java/jdk1.7.0_51e ...

  3. 来个我一起学习Python把!!!(新手共同努力)

    <初识Python> 大家好,让我们一起来学习Python,因本人也是个新手但我会把我所学的东西分享出来,并记录自己的经验学习过程,不单单是分享代码,会详细的讲解,如有错误地方希望大家指点 ...

  4. 15-MySQL-Ubuntu-数据表的查询-聚合函数(四)

    聚合函数 (1)count() 统计总数 查询男性总数 select count(*) as 男性 from students where gender=1; (2)max() 最大值 查询男性中年龄 ...

  5. iOS进阶五-RunLoop

    简介 RunLoop 运行循环.跑圈 RunLoop的作用主要体现在三方面: 1.保持程序持续运行 2.处理App中的各种事件(比如触摸事件.定时器事件.Selector事件) 3.节省CPU资源,提 ...

  6. 两个table合并

    1.两个一样的table合并用Merge函数即可合并(但要求table要有主键id) DataTable1.Merge(DataTable2); 2.没写完,以后继续补充(只有经过笔者验证,能用的才会 ...

  7. delphi 还原窗口

    1.格局还原procedure TFrmStyleProp.btnNewClick(Sender: TObject); //声明var iniFile : TIniFile; idx : intege ...

  8. Java 基础 - instanceof关键字

    instanceof 父类子类 结论: 子类 instanceof 父类 == true 父类 instanceof 子类 == false public class Test { public st ...

  9. Python: map和reduce

    可以先google一篇论文:MapReduce: SImplified Data Processing on Large Clusters 1. map map()函数接收2个参数:一个是函数,一个是 ...

  10. Windows shutdown

    用法: shutdown [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/soft] [/fw] [/f]    ...