对指针和引用的理解(c++)

1.指针c++

typedef说明一种新类型名,来代替已有类型名。函数

a.案例:typedef char* String_t和#define String_d char *这两句在使用上的区别?spa

1)前者声明一个类型的别名,在编译时处理,有类型检查。后者是一个简单的替换,在预编译时处理,无类型检查。指针

2)String_t a,b;中a和b都是char*类型的。可是String_d a,b;中a是char*类型的,b是char类型的。对象

b.对 typedef string *pstring;内存

  const pstring cstr;的理解。ci

cstr是一种指针,指向string类型的const对象。但这是错误的。错误的缘由在于将typede看成宏替换似的文本扩展了。声明 const pstring时,const修饰的是pstring的类型。string

这是一个指针。因此该声明应该是把cstr定义为指向string类型对象的const指针。等价于:string * const cstr;  编译

c.void*指针。void* 指针代表该指针与一地址值相关,可是不清楚存储在该地址值上的对象类型。void*指针只支持有限的操做:class

1)与另一个指针进行比较

2)向函数传递void*指针或从函数返回void*指针。

3)给另一个void*指针赋值。不容许使用void*指针操做他所指向的对象。当函数返回void*类型时,表示返回一个特殊指针类型。而不是返回类型为void那样表示无返回值。

d.用typedef简化函数指针的定义

typedef bool (*cmpFcn)(const string &,const string &);

该定义表示cmpFcn是一种指向函数的指针类型的名字。该指针类型为指向返回bool类型并带两个const string 引用形参的函数的指针,在要使用这种函数指针类型时,

只需直接使用cmpFcn便可,没必要每次都把整个类型声明所有写出来。

在引用函数名但又没有调用该函数时,函数名将被自动解释为指向函数的指针。

bool  lengthCompare(const string &,const string &);

直接引用函数名等效于在该函数名上应用取地址操做符:

cmpFcn pf1=lengthCompare;

cmpFcn pf2=&lengthCompare;

函数指针的使用

指向函数的指针能够用于调用他所指向的函数。能够不须要使用解引用操做符,直接经过指针调用函数。

例如: typedef bool(*cmpFcn)(const string &,const string &);

bool lengthCompare(const string &,const string &);

则:cmpFcn pf=lengthCompare;

lengthCompare("hi","bye");    //直接调用lengthCompare函数

pf("hi","bye");   //   利用函数指针调用lengthCompare函数,未使用*

(*pf)("hi","bye");   //   利用函数指针调用lengthCompare函数,使用*

函数的形参为指针和返回指向函数的指针

容许将形参定义为函数类型,可是函数的返回类型则必须是指向函数的指针,而不能是函数。具备函数类型的形参所对应的实参将被自动转换为指向相应函数类型的指针。

可是,当返回的是函数类型时,一样的转换操做将没法实现。

func f2(int);  //错误,func没法自动转换。

func* f3(int);    //正确,f3返回一个函数指针

2.引用

引用就是对象的另一个名字。c++中规定一旦定义了引用,就必须把它跟一个变量绑定起来,而且不能修改这个绑定。

不能定义引用类型的引用,可是能够定义其余类型的引用。

使用引用和指针均可以间接的访问另一个值,可是他们之间有几个重要的区别。

1)引用不能为空,当引用被建立时,他必须被初始化,而指针能够为空值,能够在任什么时候候被初始化。

2)一旦一个引用被初始化为指向一个对象,他就不能改变为对另一个对象的引用,指针则能够在任什么时候候指向另一个对象。

3)不可能有NULL引用。必须确保引用和一块合法的存储单元关联。

4)sizeof(引用)获得的是所指向变量(对象)的大小,而sizeof(指针)获得指针自己的大小。

5)给引用赋值修改的是该引用所关联的对象的值,而并非使引用于另一个对象的关联。

6)引用使用时不须要解引用,而指针须要解引用,引用和指针的自增(++)操做符运算意义不一样。

7)若是返回动态分配的对象或内存,必须使用指针,引用可能引发内存泄漏。

8)当使用&运算符取一个引用的地址时,其值为所引用变量的地址。而对指针使用&运算,取得是指针变量的地址。

可见引用本质只是一个对象的别名。对引用别名的操做便是对自己变量的操做。

const引用

const引用是指向const对象的引用。当引用的对象是const对象时,引用也必须是const。

const int ival=1024;

const int &refVal=ival;   //正确

int& ref2=ival;  //错误

若是既要既要利用引用提升程序的效率,又要保护传递给函数的数据不在函数中被改变,就应该使用常引用。常引用主要用于定义一个普通变量只读属性的别名。

做为函数的传入形参,避免实参在调用函数中被意外改变。

引用作类的数据成员

引用类型数据成员的初始化有一下几个特色:

1)不能直接在构造函数中初始化,必须用到初始化列表。

2)凡是用引用类型的数据成员的类,必须定义构造函数。

案例:

class  ConstRef{

public:

ConstRef(int ii):i(ii),ci(i),ri(ii){}  //ci与ri必须在成员初始化列表中初始化,所以必须自定义构造函数,书写成员初始化列表

private:

int i;

const int ci;

int &ri;

};

相关文章
相关标签/搜索