(本文主要内容总结或摘抄自C++ primer中文版(第5版)( Stanley B. Lippman、Josée Lajoie、Barbara E. Moo著,王刚、杨巨峰译,电子工业出版社),如有侵权请联系删除。)
列表初始化,例:
int i(0);
int{0}; //若为浮点数,存在数据丢失的风险,则不会执行,C++11功能;
声明变量,例:
extern int i; //声明而非定义
int j; //声明并定义
函数体内部试图初始化由extern标记的变量会出错
注意:变量只能被定义一次,但可以被声明多次
变量命名规范:
(1)体现实际含义
(2)变量名一般用小写字母
(3)类名一般以大写字母开头
(4)用student_loan或studentLoan代替studentloan
注意:当你第一次使用变量时再定义它
全局变量与局部变量:当局部变量与全局变量重名时,用::name来访问全局变量,但不建议使用于全局变量同名的局部变量
引用:为对象另起一个名字,例:
int ival=1024;
int &refVal=ival; //refVal是ival的另外一个名字
int &refVal2; //错误,引用必须初始化
注意:不能定义引用的引用
允许一条语句定义多个引用,例:
int i=1024, i2=2048;
int &r1=i3, &r2=i2;
指针:指向另外一种类型的复合类型,定义方法如下:
int *ip1, *ip2;
double dp, *dp2;
取地址符为&,取内容符为*
注意:引用不是对象,不能定义指向引用的指针
注意:指针类型必须严格匹配,例:
double dval;
double *pd=&dval; //正确
double *pd2=pd; //正确
int *pi=pd; //错误
pi=&dval; //错误
指针的值应属于下列4种状态之一:
(1)指向一个对象
(2)指向紧邻对象所占空间的下一个位置
(3)空指针,意味着没有指向任何对象
(4)无效指针,也就是上述情况之外的其他值
空指针:不指向任何对象的指针,在试图使用一个指针之前可以先检查它是否为空,以下为几个生成空指针的方法:
int *p1=nullptr;
int *p2=0; //需要首先#include cstdlib
int *p3=NULL;
注意:不能把int变量直接赋值给指针,无论int变量是多少
个人理解:在C++中对NULL的定义是(void *)0,也就是把0强制转换成无返回值的*类型,因此NULL实际上是指向0的地址0x00000000,所以*p2=0也就是将0的地址赋给p2,因此p2现在指向nullptr
注意:建议初始化所有指针
注意:初始化的时候可以用int *pi=0;将pi赋值为空指针,后面若pi的值改变,将pi赋空只能用pi=0,若用*pi=0,则改变的是*pi的值,也就是pi地址处存放的值,并不改变pi的值,例:
int *pi=0; //将pi赋为空指针
int i=42;
pi=&i;
*pi=0; //pi的值不为空,i的值变为0
注意:任何非0指针对应的条件值都是true
void*类型:是一种特殊的指针类型,我们不知道这个指针指向的对象到底是什么类型,因此无法确定能在它上面做哪些操作
指向指针的指针:指针是内存中的对象,也有自己的地址,因此允许把指针的地址存放到另一个指针当中,例:
int ival=1024;
int *pi=&ival;
int **ppi=π
指向指针的引用:引用本身不是一个对象,因此不能定义指向引用的指针,但指针是对象,所以存在对指针的引用,例:
int i=42;
int *p;
int *&r=p;
r=&i;
*r=0; //将i的值改为0
const限定符:定义不能被修改的变量,例
const int bufSize=512;
若const变量不是常量表达式,又想多个文件共同使用该const变量,解决办法:
//file_1.cc,定义
extern const int bufSize=fcn();
//file_2.h头文件
extern const int bufSize;
const的引用:可以对const变量进行引用,但是对引用的修改不能改变const变量的值
指向常量的指针:不能用于改变其所指对象的值,例:
const double pi=3.14;
double *p=π //错误
const double *p1=π //正确
*p1=42; //错误,不能给*p1赋值
const指针:指针的值不能被改变,例:
int a=0;
int *const b=&a; //a将一直指向b
const double pi=3.14259;
const double *const pip=π //pip是一个指向常量对象的常量指针
顶层const表示指针本身是个常量
底层const表示指针所指的对象是一个常量
constexpr(C++11新标准):允许将变量声明为constexpr类型,该变量一定是常量,必须用常量表达式初始化,例:
constexpr int mf=20;
constexpr int limit=mf+1;
constexpr int sz=size(); //只有当size()是一个constexpr函数时才正确
字面值类型,编译时就能得到计算,简单,显而易见,容易得到
注意:constexpr声明中定义指针,则限制只对指针有效,对指针指向的对象无关
类型别名typedef和using,例:
typedef wages base, *p; //base是double的同义词,p是double*的同义词
using SI= Sales_item;
注意:如果某个类型别名指代的是复合类型或常量,把它用到声明语句里会产生意想不到的后果,慎用,参考C++ primer61页
auto:让编译器自动推断变量类型,例:
auto item=val1+val2;
auto i=0,*p=&i; //正确,i是整型,p是整形指针
auto sz=0,pi=3.14; //错误:sz和pi的类型不一致
decltype:希望从表达式的类型推断出要定义的变量的类型,又不想用该值初始化,例:
decltype(f()) sum=x; //sum的类型就是函数f的返回类型
C++头文件保护符,例:
#ifndef SALES //若未定义则为真则执行至#endif,否则为假跳至#endif
#define SALES
#include<string>
struct Sales{
string bookNo;
unsigned sold=0;
};
#endif