1.友元函數
(1)友元函數是定義在一個類外的普通函數。
友元函數和普通函數的定義一樣;在類內必須將該普通函數聲明為友元。
(2)友元函數不是成員函數。
不能通過對象來調用,而是直接調用;友元函數可以訪問類的公有、受保護以及私有成員,但是必須通過對象、對象指針或者對象引用來訪問。
2.友元函數的聲明
friend 返回值類型 函數名(參數表);
在類中只需要將這個聲明放置在公有部分即可。
class Point
{
double x, y;
public:
Point(){x = 0.0; y = 0.0;}
Point(double xx, double yy){x = xx; y = yy;}
friend double distance(Point, Point);//將distance函數聲明為友元函數
};
double distance(Point my1, Point my2)
{
return sqrt((my1.x-my2.x)*(my1.y-my2.y));
}
3.友元函數在定義時即普通函數的定義,前面不加friend,在類內聲明時,必須加friend.
在友元函數生效的對象的作用范圍內可以訪問私有、公有以及受保護成員。
main函數不能聲明為類的友元函數,main函數只能做主調不能做被調。
1.拷貝構造函數
(1)拷貝構造函數是一個構造函數,它屬於類的成員函數(普遍定義為public);和類名同名但是無返回值;創建對象時,若該對象的初始化值是另一個同類對象時(賦值不調用)調用。
(2)拷貝構造函數的聲明
類名::類名(類名 &對象引用名); 或另一種聲明方式
類名::類名(const 類名 &對象引用名)
注意:拷貝構造函數只有一個參數,而且參數必須是一個對象的引用;每個類其實都要有一個拷貝構造函數,若沒有顯式的定義,那麼系統會自動定義並且設置其屬性為公有。
2.例子
class Point
{
int x, y;
public:
Point(){x = 0; y = 0;}
Point(int xx, int yy){x = xx; y = yy;}
Point(Point &pf){x = pf.x; y = pf.y;}//拷貝構造函數的聲明可以省略第一個類名和::
};
Point(Point &pf)
{
*this = pf; //完成拷貝構造
}
int main()
{
Point p1; //調用無參構造
Point p2(3, 4); //調用構造
Point p3(p2); //調用拷貝構造
}
注:如果沒有使用const修飾,那麼出現pf.x=8這種語句是合法的,但是加了const之後是非法的。另外,引用完pf也會釋放。