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;5、c++中的特殊数据类型
string的长度string::size_type
中元素的个数vector::size_type
数组中元素个数:size_t
两个指针之间的距离度量:ptrdiff_t
5、多维数组
多维数组其实质就是数组中的数组,eg:
int ia[3][4];//arry of size3,eachelement is an arry of ints of size 4
int (*ip)[4] = ia;//ip points to an arry of 4 ints
int *ip[4];// arry of pointer to int
6、c++中的p++与++p的效率问题
我们在c++中一般使用前置操作符,因为前置操作效率更高,仅需加1后返回加1的结构即可;而后置操作符必须先保存操作数原来的值,以便返回未加1之前的值作为操作的结果。
*beg++;等价于*beg;++beg;
7、函数参数问题
const形参可以避免复制操作
当数组作为函数参数时,编译器只会检查实参是否是指针,指针的类型是否与形参形参匹配,而不检查数组长度。在传递数组时,实参是指向数组第一个元素的指针,形参复制的是这个指针的值。
通过引用传递数组时,实参要求与形参类型大小完全匹配。
二维数组做参数:void printArray(int(arr*)[10],int rowSize);
8、函数指针
返回指向函数的指针,eg:int (*ff(int))(int*,int);解释如下:ff是一个带有int型的函数,该函数返回指向函数的指针,该指针指向的函数类型是int(*) (int*,int);即所指向的函数返回int型,并带有两个形参。使用typedef定义更加简明易懂:
typedef int(*PF)(int*,int);
PF ff(int);