二,指针和引用
· 共同点:它们都代表其他变量占据的某一块内存区,通过指针或引用都可以对他们代表的其他变量进行操作。
· 以下语句利用指针对变量赋值:
int m;
int *p; //指针定义
p = &m; //将m的内存地址赋给p
*p = 5; // 通过指针对变量m赋值
· 而下面的语句则是利用引用做同样的事情:
int m;
int &q = m;
q = 5;
·注意上面两段代码,&放在等号右侧的某个变量前一般是取地址
而在定义变量时,在变量前出现的&符合是引用。
· 引用只能在定义时被初始化一次,之后不可变;
而指针可变;例如语句 int &q = m 是正确的,但是下面写法不对:
int &q;
q = m
而且q一旦和m绑定,就不可改变。
而指针不同,指针p可以先指向m,即p = &m;使用完毕后,可以让p指向其他变量,比如再执行p = &k;
· 引用不能为空,指针可以空;
因为引用必须再定义时直接初始化,因此引用就不会为NULL,而指针可以是NULL。
可以用指针或引用代表对象
类对象指针和引用的使用
比如:
Account myAccount;
Account &q1 = myAccount; //q1为Account类引用// 可以定义指针p1,让p1指向myAccount,使用下面语句Account *p1;
p1 = &myAccount;//类对象指针或引用常常出现在函数的参数表或返回值中
· 利用类对象指针实现转账函数:
bool transfer(Account *pA,Account *pB,float m)
{if(pA->withdraw(m) == 1) //若A取款成功{pB->deposits(m); //向B存款return ture;}else return false;
}//调用函数时用下面语句:
transfer(&myAccount,&account[0],1000.0);
//相当于执行下面语句:
pA = &myAccount;
pB = &account[0];
//myAccount和account[0]被修改
· 下面是利用类对象的引用实现转载函数:
bool transfer(Account &A,Account &B,float m)
{if(A.withdraw(m) == 1) //若A取款成功{B.deposits(m); //向B存款return true;}else return false;
}
//这个函数和第一个版本的差别仅仅在形式参数中,变量A和B是引用类型。调用函数时使用下面语句:
transfer(myAccount,account[0],1000.0);
//相当于执行下面语句:
Account &A = myAccount;
Account &B = account[0];
//myAccount和account[0]被修改
动态创建对象
如果定义了指针后,不想让指针指向某个已经定义好的对象,那么可以使用动态创建对象的方法为指针生成一个对象。这时要使用C++语言的new操作符:
Account *pA;
pA = new Account; //动态创建Account对象Account *pB;
pB = new Account[10]; //动态创建10个对象
动态创建的对象只能通过指针使用,因为他们没有其他名字。比如下面语句输出公有数据成员:
cout << pA->ID << " " << pA->Name;
当动态创建的对象使用完毕后,C++可以动态的删除前面的动态创建的对象,这需要使用delete此操作:
delete pA; //删除和pA关联的动态对象
注意:只有当没有其他指针(除pA)指向这个动态对象时,delete才能真正删除动态对象
对象自身的指针this
每个对象都有一个指向直接的指针---this指针。
当一个函数中的局部变量和类对象的数据成员变量同名时,一定要使用this指针。
class Account
{
public:int ID;char Name[20];float balance;void Initial(int ID,char Name[],float balance);.....
};
void Account::Initial(int ID,char Name[],float balance)
{this->ID = ID ; //将传入的ID赋给当前对象的IDstrcpy(this->Name,Name); //将传入的Name赋给当前对象的Namethis->balance = balance ; //将传入的balance赋给当前对象的balance
}
如果不想使用this,则参数表里的变量一定要换个名字,这时局部变量就不会和类的成员重名,不会有二义性。