C++考研复习(二)

1.变量声明和定义的关系:
变量声明可以多次(在不同的文件程序中声明多次),但变量的定义只能有一次;
声明:声明一个变量而非定义它,就在变量名前加extern,而不要显示地初始化变量:
extern int i; //声明而非定义
int i; //声明并定义
任何包含了显示初始化的声明即为定义:
extern double pi = 3.1415; //定义
2.名字的作用域
全局作用域:定义在函数体之外的变量,在整个程序的范围内都可以使用访问赋值等;
块作用域:定义在函数内部的变量,直到函数结束都可以访问,但出了函数所在的块就无法访问了;
定义在for等{}中的变量,一旦出了for等语句,就无法对其访问了;
3.引用
引用为对象起了另外一个名字,通过将声明符写成&d的形式来定义引用类型,其中d是变量名;
int ival=1024;
int &re_ival=ival;
注意:引用必须被初始化;
一旦初始化完成,引用将和它的初始值对象一直绑定在一起;为引用赋值,实际上是把值赋给与引用绑定在一起的对象;同理,获取引用的值,实际上是获取与引用绑定在一起的对象的值;
不能定义引用的引用;
注:引用,实际上就是给一个变量起的一个别名;
赋值是相当于把值复制过去;而引用是将值和我们起的别名一直绑定在一起;
引用的定义:
允许在一条语句中定义多个引用,其中每个引用标识符都必须以&符号开头;
引用定义中的类型必须和引用所绑定的对象的类型一致,且引用初始化的过程中,初始值必须是一个对象;
4.指针
指针与引用类似,也是间接实现了对对象的访问;但指针和引用也有很大的不同:
①指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象;
②指针无须在定义时赋初值;
定义指针类型的方法是将声明符写成*d的形式,其中d是变量名。
获取一个对象的地址:
指针存放的是某个对象的地址,想要获取对象的地址,使用取地址符:&
int val=42;
int *p=&val;
p指向一个int的指针,随后p初始化为指向名为val的int对象;
指针的类型要和它所指向的对象严格匹配;
指针的值:
①指向一个对象;
②指向紧邻对象所占空间的下一个位置;
③空指针,意味着指针没有指向任何对象;
利用指针访问对象:
如果指针指向了一个对象,则允许使用(**)来访问该对象;
int ival=42;
int *p=&ival;
cout<<p;//由星号得到指针p所指的对象,输出42;
如果给这里的
p赋值,实际上就是给指针所指向的对象赋值;
*p=0;
cout<<*p;//输出0;
注:*p操作只适用于那些确实指向了某个对象的有效指针;
空指针:
空指针不指向任何对象,在试图使用一个指针之前代码可以首先检查指针是否为空;
生成空指针的方法:
int *p=nullptr;
int *p=0;
int *p=NULL://需要头文件cstdlib
注:使用未经初始化的指针是引发运行时错误的一大原因;
指针和引用:
指针和引用都可以实现对对象的间接访问,但一定要注意二者最大的不同点:
引用并非一个对象,一旦定义了引用,就无法另其在绑定到另外的对象,之后每次使用这个引用都是访问它最初绑定的那个对象;
指针的其他操作:
对于两个类型相同的合法指针,可以使用==或者!=来进行比较,比较的结果是bool类型;如果两个指针存放的地址值相同,则它们相等;反之,它们不相等;
!!!一定要使用合法指针!!
void *pv这种特殊指针,可用于存放任意对象的地址;
void *pv=&obj;obj可以是任意类型的对象;
指向指针的指针:
允许把指针的地址再存放到另一个指针当中去;
**p:表示指向指针的指针;
***p:表示指向指针的指针的指针;
int val=1024;
int p=&val;//p指向一个int型的数
int **p1=&p;//p1指向一个int型的指针
p1时会得到一个指针的地址;如果想要访问最原始的那个对象,需要对指针的指针进行两次解引用;
指向指针的引用:
指针是对象,所以可以定义指向指针的引用;但引用不是对象,所以没有指向引用的指针;
int i=42;
int *p;
int *&r=p;//这里r是一个对指针的引用;从右往左读,离变量名最近的符号对变量有最直接的影响;所以这里r是一个引用,*表示r引用的是一个指针;
r=&i;//现在p指向了i
*r=0;//现在p所指向的对象不是42而是0;
注:面对一条比较复杂的指针或引用声明语句时,从右往左阅读有助于弄清楚它的真实含义;
5.const限定符
定义一个值不可以被修改的变量,可以使用关键字const对变量的类型加以限定;
const int buffersize=512;
把buffersize定义成一个常量,任何试图修改buffersize的赋值行为都将引发错误;
const定义的常量只有在试图改变其值的情况时才会发挥它的限定作用;
默认状态下,const对象仅在文件内有效;
const的引用:
引用及其对应的对象都必须是常量;
const int a=512;
const int &b=a;//可以
int &c=a;//不行,试图让一个非常量引用指向一个常量对象
初始化常量引用时,允许使用任意表达式作为初始值,只要该表达式的结果可以转换成引用的类型即可;
指针和const:
指向常量的指针,不能用于改变其所指的对象的值;要想存放常量对象的地址,只能使用指向常量的指针;
允许一个指向常量的指针指向一个非常量的对象;
const指针(常量指针):
常量指针必须初始化,一旦初始化完成,则它的值(也就是存放在指针当中的那个地址)就不能在改变了;
*const说明指针是一个常量,且指针本身不变而非它所指的对象不变;
指针本身就是常量(常量指针):顶层const;
指针所指的对象是一个常量:底层const;
constexpr和常量表达式:
常量表达式:指值不会改变并且在编译过程中就能得到计算结果的表达式;
允许将变量声明为constexpr类型,以便由编译器来验证变量的值是否是一个常量表达式;声明为constexpr的变量一定是一个常量,并且必须用常量表达式初始化;
6.处理类型
①类型别名
typedef double wages;
wages a,b;//等价于double a,b;
还可以使用别名声明来定义类型的别名;
using SI=int;
SI a;
②auto类型说明符
有时不知道表达式计算结果的值的类型时可以使用;
auto item=val1+val2;
但auto定义的变量必须有初始值;
③decltype类型指示符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值