记录一个新人的C++之路,以供后来的新人学习

头文件


/*

头文件由三部分内容组成

(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++!


 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值