A. 友元函數訪問類的私有數據
你的class x有問題
申明友元時friend void y::g(); 需要class y的定義(在定義class x時,編譯器還不知道函數void g()是class y的成員函數,因為此時還只有class y的申明,沒有class y的定義)
建議改為friend class y;
其他的改法都很麻煩需要把某些對象改為對象的指針,在構造時new出對象來
B. 友元函數可以訪問類的私有數據
普通函數是可以將類對象作為參數的,也可以直接訪問public的成員函數和數據成員,但是不能訪問private和protected類型的成員函數和數據成員。
C. 關於函數返回值的存儲問題
fun里的a存儲在調用fun函數時開辟的棧空間里,這塊棧只在調用fun時對fun可用,調用結束後返回的a,其實是暫存在寄存器里的(一般情況下是eax),而返回到main里時,main又會把返回的值拷貝到自己所有的棧空間里(在這里是以臨時變數的形式)。所以不管是fun還是main,任何非static、register變數和常量的存儲都是在函數的局部存儲區里(也就是對當前調用函數可見的棧空間)。main也是一個函數。
1、調用完就收回;
2、不是,棧是一段公共內存,函數的代碼也不是存在棧里的,只是從棧上給新調用的函數分配一段棧空間,用來保存這個函數執行期間用到的局部變數;
3、函數的返回是被保存在寄存器里的(這個返回指的是return,不包括通過參數返回或者全局變數),棧空間由程序自動維護,函數退出以後棧的內容其實不會更改,只是棧指針復位,所以函數內部的局部變數聲明了如果不賦值,它的值就是隨機的也就是這個道理。
D. 友元函數能不能直接調用本類中的私有數據
#include<iostream>
#include<cmath>
using namespace std;
class Point{
public:
Point(int x,int y);
int x,y;
};
Point::Point(int x,int y){
this->x = x;
this->y = y;
}
class Line{
public:
Line(int a,int b,int c);
friend float distancet(Line& l,Point& p);
private:
int a,b,c;
};
Line::Line(int a,int b,int c){
this->a = a;
this->b = b;
this->c = c;
}
float distancet(Line& l,Point& p){
int k= (l.a*p.x +l.b*p.y +l.c);
if(k >= 0 )
k = k;
else
k = -k;
float j = sqrt(float(l.a*l.a+l.b*l.b));
return k/j;
}
int main(){
Point p(1,2);
Line L(1,2,3);
cout<<distancet(L,p)<<endl;
}
幫你調試了一下,可以運行了,語法錯誤就不說了。你那個友元函數的聲明有問題,函數的參數里必須有Line類,因為聲明的是Line的友元函數
E. 友元函數能不能訪問類中的私有數據成員
1、 友元函數是可以直接訪問類的私有成員的非成員函數。它是定義在類外的普通函數,它不屬於任何類,但需要在類的定義中加以聲明,聲明時只需在友元的名稱前加上關鍵字friend。
2、 友元函數可以訪問類的靜態成員、私有成員和公有成員。
3、友元的作用在於提高程序的運行效率(即減少了類型檢查和安全性檢查等都需要的時間開銷),但是,它破壞了類的封裝性和隱藏性,使得非成員函數可以訪問類的私有成員。
F. c++友元函數訪問不了私有數據
std::ostream &operator<<(std::ostream os, const Vector &v)的Vector是不是要填上數據類型,讓其變為類
Vector<int> &V
G. 友元函數不能像成員函數那樣訪問私有數據
聲明中friend void plus(A& aa);
實現時
void plus(A& aa)
{
aa.a+=10;
}
H. C++友元函數訪問類的私有數據
您好,看了代碼理論上是可以的,然後在機子上編寫了一個測試代碼,就你上面提到的代碼,我的測試時通過的沒有遇到問題,代碼如下:
/*--------------------------------------------------------------------------------
The test test.h
-----------------------------------------------------------------------------*/
#include<iostream>
using namespace std ;
class Test
{
private:
friend void setX(Test &, int) ;
friend ostream & operator<<(ostream &, Test &) ;
int x ;
public:
int getX() ;
} ;
void setX(Test &t, int iVal)
{
t.x = iVal ;
}
ostream & operator<<(ostream &output, Test &t)
{
output<<t.x<<endl ;
return output ;
}
int Test::getX()
{
return x ;
}
/*-----------------------------------------------------
Client.cpp
---------------------------------------------------*/
#include"test.h"
int main()
{
Test t ;
setX(t, 3) ;
cout<<t.getX() ;
cout<<t ;
getchar() ;
return 0 ;
}
測試下吧,可能跟你之前的代碼有關吧。
I. C++函數模板的奇想,關於返回私有數據值一個簡單函數
你總要讓getdata知道你要get什麼data,你一個template只是從類型上統一,而你get的那個什麼data的「什麼」還是要你確定。每個data都是獨立的,所以你必須枚舉完全。
你還不如這樣用結構體打包你要的getdata的變數:
typedef struct _EG_{
int a;
double b;
char ch;
bool ok;
}EG,*PEG;
class CLS
{
public:
EG GetData(){return m_eg;}
private:
EG m_eg;
};
J. 友元函數對私有數據成員的訪問
你在那個類裡面申明那個函數是友元的,形參是你這個類得對象,那麼就可以訪問私有了