1.标准库的头文件用尖括号<>括起来,非标准库的头文件用双引号“”括起来,比如#include<iostream>,
#include<mycalss.h> ;
2.类的对象通过点操作符(.)来调用成员函数;
3.除了cin和cout,cerr和clog是ostream的标准错误对象,cerr通常是与标准输出相同的流,用于不是程序正常逻辑部分的错误信息或其他输出,不缓冲;clog通常用于写入到日志文件中,带缓冲。
4.不依赖未定义行为,不要依赖机器相关行为(这样的程序是不可移植的);
5.变量命名习惯:
a.变量名一般用小写字母;
b.标识符应使用能帮助记忆的名字,也就是说,能够提示其在程序中的用法的名字;
c.包含多个词的标识符书写为在每个词之间添加一个下划线,或者每个内嵌的词的第一个字母都大写,例如通常会写成student_loan或studentLoan,而不写成studentloan;
d.命名习惯最重要的是要保持一致;
6.初始化问题,
a.C++支持两种初始化变量的形式:复制初始化和直接初始化,例如int a = 0,(复制初始化),int a(0),(直接初始化);这两种初始化对内置类型来说几乎没有差别,但是对类类型对象初始化时,直接初始化语法更灵活且效率更高;
b.内置类型的变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体里定义的内置类型变量不进行自动初始化;
c.类对象的初始化一般通过构造函数来进行,如果定义某个类的变量是没有提供初始化式,通过默认构造函数来实现初始化。
7.声明和定义,C++程序一般包含多个文件,为了让多个文件访问相同的变量,C++区分了声明和定义。声明不是定义,不分配存储空间,声明可以多次,而定义只能一次,当然声明中有初始化时可以被当做是定义。例如:
extern int i ; //声明
int i ; //定义
也可以:
extern double pi = 3.14 //定义
但不可以: (重复定义了)
extern double pi = 3.14 //定义
double pi ; //错误,重复定义
8.const 常量,常量定以后不可以被修改,所以必须在定义时初始化。例:const int bufSize = 512 ;
但是const对象默认为文件的局部变量,不能被其他文件访问,若想被其他文件访问,则需要加上extern,
例如 :extern const int bufSize = 512 ; 这样就可以被整个程序中访问。
注: 非const 变量默认为extern , 但const变量必须显式地加上extern 才能被其他文件访问。
9.引用,对象的另一个名字(别名,就好比张三,小名叫狗蛋,大家可以叫他狗蛋,也可以叫他张三),引用是一种复合类型(复合类型是指用其他类型定义的类型),通过在变量名前添加“ & ”符号来定义,例如:
int ival = 1024 ;
int &refVal = ival ; // 正确,引用指向ival
int &refVal2 ; // 错误,必须初始化,即指向某一个变量
int &refVal3 = 10 ; // 错误,初始化值必须是一个对象
需要强调的是const引用,const引用是指向const对象的引用,例如:
const int ival = 1024;
const int &refVal = ival ;//合法,都是const引用类型
int &ref2 = ival ; // 不合法,产生错误,因为ref2可以被改变
10.typedef可以用来定义类型的同义词,有三个主要目的:
第一,隐藏特定类型的实现,强调使用类型的目的;
第二,简化复杂的类型定义,使其更容易理解;
第三,允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。
例如:typedef int exam_score ;//可以使用exam_score 来定义int类型
exam_score stu1_score ;
11.枚举类型enum,枚举是定义了整数的常量集;且枚举成员都是常量;
例如 : enum workday{ mon , tu , wen , thu , fri , sat , wek }; // mon将自动初始化为0 ,其后依次比前面成员大1 ;
enum workday{ mon = 1 , tu , wen , thu , fri , sat , wek }; //若初始化mon,那么后面的成员依次为 2,3,4,5,6,7 ;
enum workday{ mon , tu , wen , thu , fri=1 , sat , wek }; //枚举成员值可以不唯一,tu和fri值都为1 ;
workday today = mon ; //正确,枚举类型的初始化和赋值,只能通过其枚举成员或同一枚举类型的其他成员进行;
workday yesterday = 2; // 错误,
12.类 类型,每个类都定义了一个接口和一个实现,接口由使用该类的代码需要执行的操作组成,实现一般包括该类的所需要的数据,
实现还包括定义该类需要的但不供一般性使用的函数。
class Name{
public :
//对该类对象的操作定义
private:
string a;
double r;
.....
} ; -------->最后有个分号
还可以使用struct 来定义类,其与class的唯一区别在于默认访问级别不同,默认情况下,struct的成员为public,而class的成员为private 。
13.头文件,很多初学者不知道头文件是干什么的,不知道怎么编写自己的头文件。我们使用一个对象或者类必须在之前要先声明,
试想想,一个很大很复杂的程序里包含很多个函数,定义,类等等,这就不可能将程序放在一个文件里,而是由多个文件组成,
但是多个文件中的函数或数据的相互使用就需要一种方法去连接和声明,这就是通过头文件来实现的。
头文件为相关声明提供了一个集中存放的位置,一般包含:类的定义,extern 变量的声明和函数的声明。
头文件用于声明,而不用于定义。定义只可以出现一次,而声明可以出现多次。
一些const对象定义在头文件中,一般来说,常量表达式是编译器在编译时就能计算出结果的表达式 。当const整型变量
通过常量表达式自我初始化时,这个const整型变量就是常量表达式,那么这样的const对象就要定义在头文件中。而如果const
变量不是用常量表达式初始化,那么它就不要在头文件中定义,应该和其他变量一样,在源文件中定义并初始化,然后再到头文件中
为其添加extern声明,使其能够被多个文件共享。
14.预处理
头文件中经常要包含其他头文件,比如a.h中包含了string.h,但是在main函数中你包含了a.h,同时又包含了string.h,因为你不知道
a.h中包含了string,所以这种情况下就会出现重复编译的错误(往往很难发现),所以为了避免这种多次包含,
我们在头文件中采用:
#ifndef YOURCLASS_H (这个变量名一般采用所有字母大写)
#define YOURCLASS_H
........your code (你的代码段)
#endif