设为首页 加入收藏

TOP

c++中常见问题
2013-05-14 09:26:13 来源: 作者: 【 】 浏览:526
Tags:常见问题

  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

  作用在引用上的操作与作用在对象上的操作完全等价,当引用初始化后,只要改引用存在就绑定到初始化时指向的对象,不可更改。

  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 ;//arry of size3,eachelement is an arry of ints of size 4

  int (*ip) = ia;//ip points to an arry of 4 ints

  int *ip ;// arry of pointer to int

  6、c++中的p++与++p的效率问题

  我们在c++中一般使用前置操作符,因为前置操作效率更高,仅需加1后返回加1的结构即可;而后置操作符必须先保存操作数原来的值,以便返回未加1之前的值作为操作的结果。

  *beg++;等价于*beg;++beg;

  7、函数参数问题

  const形参可以避免复制操作

  当数组作为函数参数时,编译器只会检查实参是否是指针,指针的类型是否与形参形参匹配,而不检查数组长度。在传递数组时,实参是指向数组第一个元素的指针,形参复制的是这个指针的值。

  通过引用传递数组时,实参要求与形参类型大小完全匹配。

  二维数组做参数:void printArray(int(arr*) ,int rowSize);

  8、函数指针

  返回指向函数的指针,eg:int (*ff(int))(int*,int);解释如下:ff是一个带有int型的函数,该函数返回指向函数的指针,该指针指向的函数类型是int(*) (int*,int);即所指向的函数返回int型,并带有两个形参。使用typedef定义更加简明易懂:

  typedef int(*PF)(int*,int);

  PF ff(int);

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇二叉树这种数据结构的实现 下一篇C语言实现有限状态机

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: