c++中常见问题
1、c++变量初始化规则
内置类型变量是否初始化决定于变量的定义位置,在函数体外定义的变量都自动初始化为0,函数体内定义的变量都不进行自动初始化。类类型变量的初始化,类通过定义一个或多个构造函数来控制类对对象的初始化,如果定义某个类的变量时没有提供初始化式,这个类就通过默认构造函数来实现。
2、引用(reference)与指针(pointer)
引用就是对象的另一个名字,通过在变量前添加&符号来定义。定义时必须初始化:
int ival=1024;
int &refval= ival;//OK:refval refers to ival
int &refval;//error:a reference must be initialized
int &refval=1024;//error:initializer must be an object
//www.dgbalance.com
作用在引用上的操作与作用在对象上的操作完全等价,当引用初始化后,只要改引用存在就绑定到初始化时指向的对象,不可更改。
const reference是指向const对象的引用,利用该引用可以读取但不可以修改其所指向的对象,普通引用不能指向const对象。
指针用于指向对象,其值是所指向对象在内从中的地址,通过在变量前加*来定义:
string *pstr,ppstr;//pstr is a pointer to string,ppstr is a string
用指针操作内存容易发生越界错误,故定义指针后建议立即进行初始化,对指针的初始化或者赋值仅能使用以下的四种类型值:0值常量表达式;类型匹配对象的地址;同一对象的下一地址;同类型的另一有效指针。 c++提供了一种特殊的指针void*,它可以保存任何类型对象的地址。
3、指针和const限定符
指向const对象的指针,定义是不需要进行初始化,通过改指针可以反问但不可以修改该对象。const对象必须使用const类型指针去指向。
const double pi=3.1415926;
const double *ptr=π//ptr is a pointer to a const
const指针是一种常量,本身值不能修改,定义时必须进行初始化,eg:
double pi = 3.1415926;
double *const prt=π//ptr is a const pointer
指向const对象的const指针这种类型的指针本身值不能改变,通过它也只能访问所指对象不能修改对象的值。eg:
const double pi=3.1415926;
const double *const ptr=π//ptr is a const pointer to a const object
4、指针和typedef
借用一个例子来说明这个问题,eg:
typedef string *pstring;
const pstring cstr;
大多说人会认为cstr是个const string*(原式等价于 const string *cstr)类型,但这是错误的,原因在于将typedef当成了文本扩展。申明const pstring时,const修饰的是pstring类型,这是一个指针,所以应该将其理解为cstr定义为指向string类型的一个const指针,等价于:string *const cstr;