while(std::cin >> value)
检测条件是istream
对象,其效果是检测流的状态。流未遇到错误,则检测成功。当遇到文件结束符(end-of-file, win下,是ctrl+z,然后按Enter),或遇到一个无效的输入,istream
对象的状态变为无效,则检测失败。算数类型的尺寸在不同机器上有所差别。c++标准规定了尺寸的最小值
字面值常量
20 /* 十进制*/ 024 /* 八进制*/ 0x14 /* 十六进制*/
'a' //字符字面值
"hello" //字符串字面值,是字符构成的数组,需要在结尾处添加一个空字符('\0')
\n \t //转义序列
u U L u8 //通过前缀指定字面值类型
u or U l or L ll or LL 通过后缀指定字面值类型
bool test = false;
nullptr //指针字面值
初始化不是赋值,尽管区别无关紧要。
double price = 30.0, num = 10.0;
默认初始化:函数体外的内置类型变量被初始化为0;定义在函数体内部的内置类型变量不被初始化,即是未定义的;类的对象如果没有显示地初始化,则其值由类确定。建议初始化每一个内置类型的变量。
c++支持分离式编译,允许将程序分割成若干个文件。为此,声明和定义区分开来。变量只能被定义一次,但可以被多次声明
//函数外部
extern int i; //声明i,而非定义i
int j; //声明并定义j
extern double pi = 3.14; //定义
//在函数内部,试图初始化一个由extern关键字标记的变量,将引发错误
- 变量命名规范
变量名一般用小写字母,如index
类名一般以大写字母开头,如`Sales_item`
标识符由多个单词组成,如 `student_loan` 或 `studentLoan`
变量名指向实体。同一个名字在不同的作用域可能指向不同的实体。导入头文件是导入变量声明。
显式地访问全局变量
::reused
引用:为对象起了另一个名字。引用并非对象,就是说不是实体,只是标识符
int ival = 1024;
int &refVal = ival;
int &refVal2; //error:引用必须被初始化。初始化后,无法重新绑定到另一个对象
int &refVal3 = 10; //error : 只能绑定对象
double pi = 3.14;
int &refVal = pi; //error:类型不对
- 指针:是对象,无须在定义时赋初值
double *p1, *p2, dp=0, *p3;
double k, &i = &dp;
double dval;
double *pd = &dval;
double *pd2 = pd;
int *pi = pd; //error
pi = &dva; //error
int ival = 42;
int *p = &ival;
cout << *p; //解引用符来访问该对象
int i = 42;
int &r = i;
int *p;
p = &i;
*p = i;
int &r2 = *p;
//空指针
int *p1 = nullptr;
int *p2 = = 0;
int *p3 = NULL;
建议初始化所有的指针,并且在可能的情况下,尽量等定义了对象之后再定义指向它的指针
if(pi)
:任何非0指针对应的条件值都是true
。void*
指针可以存放任意对象的地址,但是无法访问对象基本数据类型和类型修饰符
int i = 1024, *p = &i, &r = i;
int* p1, p2; //p1是指针,p2是int 。所以不如 int *p1, *p2;
指向指针的指针:
int ival = 1024; int *pi = &ival; int **ppi = π
指向指针的引用:
int i = 42; int *p; int *&r = p; r = &i; *r = 0;
const
限定符:一旦创建之后,值不能再改变,所以必须初始化
const int i = get_size(); //运行时初始化
const int j = 42; //编译时初始化
const int k; //error 未初始化
- 默认状态下,
const
对象仅在文件内有效。如果想多个文件共享const
对象,则在变量声明和定义前都添加关键字extern
//f1.cpp
extern const int bufSize = fcn();
//f1.h
extern const int bufSize;
const
的引用可以指向非const
对象。非const
的引用不能指向const
对象const指针
必须初始化,且之后不能改变指针指向的对象(实体)。但对象(实体)的值可以改变。 顶层const
是右边的,指本身是const
const int *const p = &i;
:左边的const
表示指向的对象不能变,右边的const
表示指针不能指向另一个对象类型别名
typedef double wages;
typedef wages base, *p;
typedef char *pstring; //pstring 字符指针类型
const pstring cstr = 0; //cstr是指向char的常量指针。
//不能 const char *cstr = 0; 这样理解不对,成了cstr是指向const char的指针
const pstring *ps; //ps 是一个指针,指向的对象是char的常量指针
auto
让编译器自动推算变量类型decltype
:decltype(f()) sum = x
,sum
的类型是f()
的返回类型结构
struct Sales_data {
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
Sales_data accum, trans, *salesptr;
main.cpp
调用其他*.cpp
里面的函数,只需要声明即可。因为分离式编译