您的位置:首页 > 编程语言 > C语言/C++

[C++对象模型][2]指针与引用

2009-02-20 09:11 267 查看
一 概括

指针和引用,在C++的软件开发中非常常见,如果能恰当的使用它们能够极大的提高整个软件的效率,但是很多的C++学习者对它们的各种使用情况并不是都了解,这就导致了实际的软件开发中经常会内存泄漏,异常抛出,程序崩溃等问题。对于C和C++的初学者,那更是被它们搞的迷迷糊糊。本篇作为[深入C++]系列的第一节,我们就带领大家把指针和引用这个基本功练好。

二 指针

指针,指针的定义是什么呢?好像要想给个直接的定义还是很难的哦,所以我们这里用它的语法结合图来认识它。

int i = 10;int *p = NULL;p = &i;int j = *p; int **pP = NULL; pP = &p;

在上面的几条语句中,&用来定义引用变量或对变量取其地址,*用来定义指针或得到指针所指向的变量,其中p为定义的指针变量,它指向int变量i,而pP为二级指针变量,它指向指针变量p。相应的示意图如下:

#pragma once
#include <iostream>

class CopyAndAssign
{
public:
CopyAndAssign(int i)
{
x = i;
}
CopyAndAssign(const CopyAndAssign& ca)
{
std::cout << "拷贝构造!" << std::endl;
x = ca.x;
}
CopyAndAssign& operator=(const CopyAndAssign& ca)
{
std::cout << "赋值操作符" << std::endl;
x = ca.x;
return *this;
}
private:
int x;
};

CopyAndAssign ReturnCopyAndAssign()
{
CopyAndAssign temp(20); // 构造
return temp;
}
void CopyAndAssignAsParameter(CopyAndAssign ca)
{
}

CopyAndAssign& ReturnCopyAndAssignByReference()
{
CopyAndAssign temp(20); // 构造
return temp;
}
void CopyAndAssignAsParameterByReference(CopyAndAssign& ca)
{
}

void TestCopyAndAssign()
{
CopyAndAssign c1(10); // 构造
CopyAndAssignAsParameter(c1); // 拷贝构造
ReturnCopyAndAssign(); // 拷贝构造

CopyAndAssignAsParameterByReference(c1);
ReturnCopyAndAssignByReference();
}

亲自debug,效果会更好,运行结果如下:



五 总结

1) 指针也是变量,它存储其他变量的地址。例如int *p = new int(10); p是指针变量,p实际是存储了一个int变量的地址。
2)引用其实是一个别名,跟原对象是同一个东东。例如 std::string str = "hello"; std::string & strR = str;此时strR跟str其实是同一个东东,strR可以看成是str的一个小名。
3)函数默认的传参方式为按值传递,即当实参传入是其实是做了拷贝,函数内其实是对所拷贝对象的操作。例如 void Increase(int x) { x++; } 调用时 int i = 10; Increase(i); Increase函数内部其实是对i的一个拷贝(我们假设为ii)进行++。所以在函数调用结束后原来的i的值仍然保持不变。
4)函数的传参方式可以显示的指定按引用来传递,按引用传递时,函数内即对实参的操作,没有拷贝操作,所以函数内对实参的修改,当然后调用结束后反映到实参上。例如void Increase(int & x) { x++;} 调用 int i = 10; Increase(i);此时Increase内部的++即是对i的操作,所以函数调用结束后i的值被修改。
5)函数中如果有return返回变量时,其实所返回的也是一个拷贝。所以当使用return返回对象时一定要考虑所返回对象的拷贝构造函数是否能够满足要求。

六 使用注意

1) malloc/free一起使用。

2)new/delete一起使用。

3)对于new中有[]时,相应的必须使用delete[]来释放。

4)用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

5)对指针的使用前,应该检查是否为空,空指针可能导致程序崩溃。

6)非内置类型的参数传递,使用const引用代替一般变量。

七 谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: