March 11th
ohye!
//读取第一个数,并确保确实有数据可以处理。
if(cin>>currVal){
int count=1;
while(cin>>val)//读取剩余的数
//==别误用为=
}
定义在函数体内部的内置类型变量将不被初始化,而定义于任何函数体之外的变量被初始化为0。
long double ld=3.14159265358979325
int a{ld},b={ld};//错误:转换未执行,因为存在丢失信息的风险。
int c(ld),d=ld;//转换执行,且确实丢失了部分值
变量声明和定义的关系
声明使得名字为程序所知。变量只能被定义一次,但是可以被声明多次。如果要在多个文件中使用同一个变量,就必须将声明和定义分离。
extern int i;声明而非定义
int j;声明并定义
extern int i=9;包含初始值就变为定义辽。
函数体外的标识符不能以下划线开头。
名字的作用域 p44
在全局变量名字全局用,函数体内部改了就不是一个值了。
使用作用域操作符可以改变默认规则(::)
eg:cout<<::reused<<endl;
引用
除了p55(初始化常量引用时允许用任意表达式作为初始值)和p534两种例外情况,其他所有引用的类型都要与之绑定的对象严格匹配。
引用必须被初始化
int a=666;
int &b=a;
int &b//报错
引用即别名,并非一个对象,不能进行引用的引用。
int &juege=10;//错误:引用类型的初始值必须是一个对象。
double pi=3.14;
int &juelakua=pi;//错误:此处引用类型的初始值必须是int型对象。
dadade指针
除了p56(常量指针)和p534(暂时看不懂 也不想看)介绍的两种情况外,其他所有指针的类型都要和它所指向的对象严格匹配。
double dval;
double *pd=&dval;//正确:初始值是指向double型对象的地址。
double *pd2=&pd;//正确:初始值是指向double对象的指针。
int*pi=pd;//错误:指针pi的类型和pd的类型不匹配
pi=&dval;//错误:试图把double型对象的地址赋给int型指针。
空指针
int*p1=nullptr;//best
int*p2=0;
int*p3=NULL;
把int变量之间赋给指针是错误的操作,即使int变量的值恰好定义0也不行。
int zero=0;
pi=zero;//错误:不能把int变量之间赋给指针。
建议初始化所有指针,若不清楚指向何处,就初始化为nullptr或者0.
任何非0指针的条件值都是true。void*可以用于存放任意类型的地址。(没办法访问内存空间中所存的对象)
int* p1,p2;//p1是指向int的指针,p2是int。
指向指针的引用
引用本身不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用:
int i=12;
int *p;//p是一个int型指针。
int *&r=p;//r是一个对指针p的引用。
r=&i;//r引用了一个指针,因此给r赋值&i建是令p指向i。
*r=0;解引用r得到i,也就是p指向的对象,将i的值改为0。
const
const对象必须初始化,初始值可以是任意复杂的表达式。
默认状态下,const对象仅在文件内有效,若我们想让这类const对象像其他(非常量)对象一样工作(只在一个文件定义它,而在其他文件声明并使用它。),需添加关键字extern。
//定义并初始化了一个常量,该常量能被其他文件访问。
extern const int bufSize=fcn();