1. 對象指針作函數(shù)的參數(shù)
使用對象指針作為函數(shù)參數(shù)要經(jīng)使用對象作函數(shù)參數(shù)更普遍一些。因為使用對象指針作函數(shù)參數(shù)有如下兩點好處:
(1) 實現(xiàn)傳址調(diào)用??稍诒徽{(diào)用函數(shù)中改變調(diào)用函數(shù)的參數(shù)對象的值,實現(xiàn)函數(shù)之間的信息傳遞。
(2) 使用對象指針實參僅將對象的地址值傳給形參,而不進行副本的拷貝,這樣可以提高運行效率,減少時空開銷。
當形參是指向對象指針時,調(diào)用函數(shù)的對應實參應該是某個對象的地址值,一般使用&后加對象名。下面舉一例子說明對象指針作函數(shù)參數(shù)。
#include <iostream>
using namespace std;
class M
{
private:
public:
M() { x = y = 0; }
M(int i, int j) { x = i; y = j; }
void copy(M* m);
void setxy(int i, int j) { x = i;
void print() {
};
void M::copy(M *m)
{
x = m -> x;
y = m -> y;
}
void fun(M m1, M* m2);
void main()
{
M p(5, 7) , q;
q.copy(&p);
fun(p, &q);
p.print();
q.print();
}
void fun(M m1, M* m2)
{
m1.setxy(12, 15);
m2 -> setxy(22,25);
}
輸出結果為:
5,7
22,25
從輸出結果可以看出,當在被調(diào)用函數(shù)fun中,改變了對象的數(shù)據(jù)成員值[m1.setxy(12, 15)]和指向對象指針的數(shù)據(jù)成員值[m2->setxy(22, 25)]以后,可以看到只有指向對象指針作參數(shù)所指向的對象被改變了,而另一個對象作參數(shù),形參對象值改變了,可實參對象值并沒有改變。因此輸出上述結果。
2. 對象引用作函數(shù)參數(shù)
在實際中,使用對象引用作函數(shù)參數(shù)要比使用對象指針作函數(shù)更普遍,這是因為使用對象引用作函數(shù)參數(shù)具有用對象指針作函數(shù)參數(shù)的優(yōu)點,而用對象引用作函數(shù)參數(shù)將更簡單,更直接。所以,在C++編程中,人們喜歡用對象引用作函數(shù)參數(shù)?,F(xiàn)把剛才的例子稍作改動,說明對象引用作函數(shù)參數(shù)的格式。
#include <iostream>
using namespace std;
class M
{
private:
int x, y;
public:
M() { x = y = 0; }
M(int i, int j) { x = i; y = j; }
void copy(M &m);
void setxy(int i, int j) { x = i; y = j; }
void print() {cout<<x<<","<<y<<endl; }
};
void M::copy(M &m)
{
x=m.x;
x=m.y;
}
void fun(M m1, M &m2);
void main()
{
M p(5, 7), q;
q.copy(p);
fun(p, q);
p.print();
q.print();
}
void fun(M m1, M &m2)
{
m1.setxy(12, 15);
m2.setxy(22, 25);
}
該例子與上面的例子輸出相同的結果,只是調(diào)用時的參數(shù)不一樣。
this指針
this指針是一個隱含于每一個成員函數(shù)中的特殊指針。它是一個指向正在被該成員函數(shù)操作的對象,也就是要操作該成員函數(shù)的對象。
當對一個對象調(diào)用成員函數(shù)時,編譯程序先將對象的地址賦給this指針,然后調(diào)用成員函數(shù),每次成員函數(shù)存取數(shù)據(jù)成員時,由隱含作用this指針。而通常不去顯式地使用this指針來引用數(shù)據(jù)成員。同樣也可以使用*this來標識調(diào)用該成員函數(shù)的對象。下面舉一例子說明this指針的應用。
#include <iostream>
using namespace std;
class A
{
private:
public:
};
void A::copy(A &aa)
{
}
void main()
{
}
運行結果:
3, 4