头文件
/*
头文件由三部分内容组成
(1)头文件开头处的版权版本声明
A.版权信息
B.文件名称,标示符,摘要
C.当前版本,作者/修改者,完成日期
D.版本历史信息
(2)预处理块
为防止头文件重复使用,应采用#ifndef/#define/#endif结构产生预处理块
用#include<filename.h>格式来引用标准库的文件(编译器将从标准库目录开始搜索)
用#include<filename.h>格式来引用非标准库的文件(编译器将从用户的工作目录开始搜索)
(3)函数和类结构的声明
头文件中只存放"声明",不存放"定义"
不使用全局变量,(尽量不在头文件中出现extern int value这类声明)
*/
/*
*Copyright (c) 2006,事例文档
*All right reserved。
*
*文件名称:头文件.cpp
*文件标示:
*摘 要:版权和版本的
*
*当前版本:xxxxx
*作 者:
*完成日期:
*
*取代版本:xxxxx
*原 作 者:
*完成日期
*/
#ifndef GRAPHICS_H //防止graphics.h被重复引用
#define GRAPHICS_H
#include <math.h> //引用标准库的头文件
#include "myheader.h" //引用非标准库的头文件
void Function1(int i); //全局函数声明
class box //类结构声明
{
};
#endif
===================程序的风格(程序的“书法”)=======================
(1)在每个类声明之后、每个函数定义结束之后都要加空行。
void Function1(…)
{
…
}
// 空行
(2)在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
while (condition)
{
statement1;
// 空行
if (condition)
{
statement2;
}
else
{
statement3;
}
// 空行
statement4;
}
(3)一行代码只做一件事情
int width;// 宽度
(不采用)int width, height, depth; // 宽度高度深度
(4)尽可能在定义变量的同时初始化该变量
int width = 10; // 定义并初绐化width
(5)空格的合理使用
A.关键字之后要留空格
B.函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别
C.‘,’之后要留空格
D.赋值操作符、比较操作符、算术操作符、逻辑操作符、
位域操作符等二元操作符的前后应当加空格,
象“[]”、“.”、“->”这类操作符前后不加空格
void Func1(int x, int y, int z); // 良好的风格
void Func1 (int x,int y,int z); // 不良的风格
if (year >= 2000) // 良好的风格
if(year>=2000) // 不良的风格
if ((a>=b) && (c<=d)) // 良好的风格
if(a>=b&&c<=d) // 不良的风格
for (i=0; i<10; i++) // 良好的风格
for(i=0;i<10;i++) // 不良的风格
for (i = 0; I < 10; i ++) // 过多的空格
x = a < b ? a : b; // 良好的风格
x=a<b?a:b; // 不好的风格
int *x = &y; // 良好的风格
int * x = & y; // 不良的风格
array[5] = 0; // 不要写成 array [ 5 ] = 0;
a.Function(); // 不要写成 a . Function();
b->Function(); // 不要写成 b -> Function();
(6)对齐
A.程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
B.{ }之内的代码块在‘{’右边数格处左对齐。
(7)长行拆分
virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix,
CMatrix rightMatrix);
(8)修饰符的位置
修饰符 * 和 & 应该靠近变量名
(9)注释
A.注释尽量简单明了,不可大篇幅喧宾夺主
B.如果代码本来就是清楚的,则不必加注释
C.注释的位置应与被描述的代码相邻,可以放在代码的上方或右方
D.多重嵌套代码,应当在一些段落的结束处加注释,便于阅读。
if (…)
{
…
while (…)
{
…
} // end of while
…
} // end of if
(10)类的版式
//以数据为中心(通常使用)
class A
{
private:
int i, j;
float x, y;
…
public:
void Func1(void);
void Func2(void);
…
}
//以行为为中心
class A
{
public:
void Func1(void);
void Func2(void);
…
private:
int i, j;
float x, y;
…
}
程序命名规则
(1)标识符应当直观且可以拼读,可望文知意,不必进行“解码”
(2)程序中不要出现仅靠大小写区分的相似的标识符
(3)程序中不要出现标识符完全相同的局部变量和全局变量,
尽管两者的作用域不同而不会发生语法错误,但会使人误解。
(4)变量的名字使用“名词”,函数的名字使用“动词+名词”
常量全用大写的字母,用下划线分割单词
静态变量加前缀s_(static)
全局变量加前缀g_(global)
类的数据成员加前缀m_(member)
(5)尽量避免名字中出现数字编号,如Value1,Value2等
表达式和基本语句
(1)运算符比较多,熟记是比较困难的,
为了防止产生歧义并提高可读性,不如用括号确定表达式的操作顺序。
(2)if 语句
A.布尔变量与零值比较
if (flag)// 表示flag为真
if (!flag)// 表示flag为假
其它的用法都属于不良风格,例如:
if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)
B.整型变量与零值比较
if (value == 0)
if (value != 0)
不可模仿布尔变量的风格而写成
if (value)// 会让人误解 value是布尔变量
if (!value)
C.浮点变量与零值比较
不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float还是double类型的变量,都有精度限制。
所以一定要避免将浮点变量用“==”或“!=”与数字比较,
应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度)。
D.指针变量与零值比较
if (p == NULL)// p与NULL显式比较,强调p是指针变量
if (p != NULL)
不要写成
if (p == 0) // 容易让人误解p是整型变量
if (p != 0)
或者
if (p)// 容易让人误解p是布尔变量
if (!p)
E.对if语句的补充说明
程序中有时会遇到if/else/return的组合,应该将如下不良风格的程序
if (condition)
return x;
return y;
改写为
if (condition)
{
return x;
}
else
{
return y;
}
或者改写成更加简练的
return (condition ? x : y);
(3)循环语句
C++/C循环语句中,for语句使用频率最高,while语句其次,do语句很少用
A.在多重循环中,如果有可能,应当将最长的循环放在最内层,
最短的循环放在最外层,以减少CPU跨切循环层的次数
如
//低效率:长循环在最外层
for (row=0; row<100; row++)
{
for ( col=0; col<5; col++ )
{
sum = sum + a[row][col];
}
}
//高效率:长循环在最内层
for (col=0; col<5; col++ )
{
for (row=0; row<100; row++)
{
sum = sum + a[row][col];
}
}
B.如果循环体内存在逻辑判断,
//循环次数很大,宜将逻辑判断移到循环体的外面
if (condition)
{
for (i=0; i<N; i++)
DoSomething();
}
else
{
for (i=0; i<N; i++)
DoOtherthing();
}
//循环次数不大,这样的程序简洁
for (i=0; i<N; i++)
{
if (condition)
DoSomething();
else
DoOtherthing();
}
(4)for 语句
A.不可在for 循环体内修改循环变量,防止for 循环失去控制。
B.建议for语句的循环控制变量的取值采用“半开半闭区间”写法。
//半开半闭区间
for (int x=0; x<N; x++)
{
…
}
//闭区间
for (int x=0; x<=N-1; x++)
{
…
}
(5)switch语句
switch语句的基本格式是:
switch (variable)
{
case value1 : …
break; //不可忘记
case value2 : …
break;
…
default : … //尽量写上,保持风格一致
break;
}
(6)goto语句
goto语句可以灵活跳转
{ …
{ …
{ …
goto error;
}
}
}
error:
…
goto语句经常带来错误或隐患(如跳过某些对象的构造、变量的初始化、重要的计算等语句)
goto state;
String s1, s2;// 被goto跳过
int sum = 0;// 被goto跳过
…
state:
…
goto语句,就象楼房着火了,来不及从楼梯一级一级往下走,
可从窗口跳出火坑。所以主张少用、慎用goto语句,而不是禁用。
(3)一行代码只做一件事情
int width;// 宽度
(不采用)int width, height, depth; // 宽度高度深度
----------------------------
我同意一行代码只做一件事,
但我不同意不采用第二种写法
其实我觉得在这种情况下应该采用第二种写法
其他情况另当别论
学习c++的50条忠告(初学者必看)
1.把C++当成一门新的语言学习(和C没啥关系!真的。);
2.看《Thinking In C++》,不要看《C++变成死相》;
3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看;
4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;
5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;
6.会用Visual C++,并不说明你会C++;
7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书;
8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;
9.看Visual C++的书,是学不了C++语言的;
10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?
11.浮躁的人容易问:我到底该学什么;——别问,学就对了;
12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;
13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!
14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;
15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;
16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;
17.C++不仅仅是支持面向对象的程序设计语言;
18.学习编程最好的方法之一就是阅读源代码;
19.在任何时刻都不要认为自己手中的书已经足够了;
20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;
21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;
25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;
26.请看《程序设计实践》,并严格的按照其要求去做;
27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;
28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;
29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;
30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;
31.学习编程的秘诀是:编程,编程,再编程;
32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;
33.记住:面向对象技术不只是C++专有的;
34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;
35.把在书中看到的有意义的例子扩充;
36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;
37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;
38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;
39.C++语言和C++的集成开发环境要同时学习和掌握;
40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;
41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;
42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);
43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;
44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;
45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;
46.记录下在和别人交流时发现的自己忽视或不理解的知识点;
47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;
48.保存好你写过的所有的程序——那是你最好的积累之一;
49.请不要做浮躁的人;
50.请热爱C++!