成員函數和友元函數是C++中用來訪問和操作類的成員的兩種不同的方式。
成員函數:
成員函數是定義在類內部的函數,它可以直接訪問類的私有成員。成員函數可以通過對象或者指針來調用。
例如:
class MyClass {
private:
int x;
public:
void setX(int value) {
x = value;
}
int getX() {
return x;
}
};
在上面的例子中,setX和getX都是成員函數,它們可以直接訪問類的私有成員x。通過創建一個對象或者指針來調用這些成員函數,可以對x進行賦值和讀取操作。
MyClass obj;
obj.setX(5);
int value = obj.getX();
友元函數:
友元函數是定義在類外部的函數,它可以訪問類的私有成員。友元函數要在類內部進行聲明,并在類外部進行定義。友元函數可以通過對象或者指針來調用。
例如:
class MyClass {
private:
int x;
public:
void setX(int value) {
x = value;
}
friend void printX(MyClass obj); // 友元函數的聲明
};
void printX(MyClass obj) { // 友元函數的定義
cout << obj.x << endl; // 可以直接訪問類的私有成員x
}
在上面的例子中,printX是一個友元函數,它可以直接訪問類的私有成員x。通過創建一個對象或者指針來調用這個友元函數,可以打印出x的值。
MyClass obj;
obj.setX(5);
printX(obj);
區別:
成員函數是類的成員,它可以直接訪問類的私有成員,而友元函數不是類的成員,它需要在類內部進行聲明并在類外部進行定義才能訪問類的私有成員。
成員函數可以通過對象或者指針來調用,而友元函數也可以通過對象或者指針來調用。
成員函數可以被繼承,而友元函數不可以被繼承。
成員函數在編譯時會進行類型檢查,而友元函數不會進行類型檢查。