关于头文件的引入:
包含来自标准库的头文件时,应该用尖括号<>包围头文件名。对于不属于标准库的头文件,则用双引号""包围
#include <iostream>
#include "test.h"
关于使用文件重定向:
测试程序时避免反复从键盘敲入数据
$ program_name <infile> outfile
关于(.)运算符:
点运算符只能用于类类型的对象。其左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型的一个成员名,运算结果为右侧运算对象指定的成员。
关于调用运算符():
当用点运算符访问一个成员函数时,通常我们想调用该函数,我们使用一个调用运算符()来调用一个函数
类类型(CLASS TYPE):类定义的类型。类名即为类型名。
变量命名规范:
变量名一般用小写字母,如index。
用户自定义的类名一般以大写字母开头,如Sales_item。
指针值:
指针的值(即地址)应属于以下四种状态之一:
1.指向一个对象
2.指向紧邻对象所占空间的下一个位置
3.空指针,意味着指针没有指向任何对象
4.无效指针,也就是上述情况之外的其他值
空指针:
空指针不指向任何对象,在试图使用一个指针之前代码可以首先检查他是否为空。以下列出几个生成空指针的方法:
int *p1=nullptr; //等价于int *p1=0;
int *p2=0; //直接将p2初始化为字面常量0
//需要首先#include cstdlib
int *p3=NULL; //等价于int *p3=0;
得到空指针最直接的办法就是用字面值nullptr来初始化指针
指向指针的指针:
int ival=1024;
int *pi=&ival; //pi指向一个int 型的数
int **ppi=π //ppi指向int 型指针的指针
指向指针的引用:
引用本身不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用:
int i=42;
int *p;
int *&r=p; //相当于给p起了一个别名,r是一个对指针p的引用
r=&i ; //r引用了一个指针,因此给r赋值&i就是令p指向i
*r=0; //解引用r得到i,也就是p指向的对象,将i的值改为0
要理解r的类型到底是什么,最简单的办法是从右向左阅读r的定义。离变量名最近的符号(此例中是&)对变量的类型有最直接的影响,因此r是一个引用。声名符的其余部分用以确定r引用的类型是什么,此例中的符号*说明r引用的是一个指针。最后,声明的基本数据类型部分指出r引用的是一个int指针。
const double pi=3.14;
const double *const pip=π //pip是一个指向常量对象的常量指针。也就是说pip必须指向pi并且pip指向pi的值不能改变
类型别名:
typedef double wages,*p; //wages是double的同义词,p是double *的同义词
在C++11中规定了一种新的方法,使用别名声明即:using SI=Sales_item
decltype类型指示符
const int ci=0,&cj=ci;
decltype(ci) x=0; //x的类型是const int
decltype(cj) y=x; //y的类型是const int &,y绑定到变量x
decltype(cj) z; //错误:z是一个引用必须初始化
如果给变量加上了一层或多层括号,编译器会把它当成一个表达式。
//decltype的表达式如果是加上了括号的变量,结果将是引用
decltype((i)) d; //错误:d是int&,必须初始化
decltype(i) e; //正确:e是一个int
关于预处理功能的头文件保护符
1.在自己要定义的头文件(定义类之类的文件)用一下语句:
sales_data.h
#ifndef SALES_DATA_H
#define SALES_DATA_H //这条是关键,因为有这个宏定义就能做出判断
#include <string>
using namespace std;
struct Sales_data{
string bookNo;
int abc=0;
};
#endif
2.也可以在每一次需要#include "sales_data.h"的时候进行判断,如果需要在很多文件中都引用a.h的话。这种方法增加了一点代码量
#ifndef A_H
#define A_H
#include "a.h"
#endif