❶ 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 ;
}
測試下吧,可能跟你之前的代碼有關吧。
❷ c++子類訪問父類私有成員
一般好的項目,代碼風格,設置成private的成員變數,不應該直接訪問它的,最好為Circle::r寫個成員函數,就可以間接訪問了。比如
int Circle::Getr()
{
return r
}
另外,如果你非要不該父類的情況下訪問,也是可以的,比如用類的成員指針,具體使用不好理解,風格不好。
❸ C 數據成員如何從公有改為私有
首先,相同類的不同對象可以訪問彼此的私有數據,qht9624543 的回答是錯的。
就語言語法定義來說,類的成員函數當然可以訪問本類的所有私有數據。如果這個類聲明了友元(friend)類或友元函數,那麼這些友元類和函數也可以訪問其私有數據。
你可以這么理解,一個類是自己的友元,相同類的對象之間是友元關系,所以相同類的對象之間也可以訪問彼此的數據。
如果說深一點,為什麼要有私有數據,是為了隱藏這個類的細節,讓外部不了解這個類細節的代碼不去亂用相關數據而導致高耦合。而相同類顯然是了解自己的細節的,所以沒必要去隱藏私有數據。友元則相當於由程序員指明了某個代碼了解這個類的細節。
學C++慢慢來,面向對象這種東西要慢慢去悟,看到一個現狀,想想它的本質是什麼,為什麼要這樣,有一天你把它們的緣由都搞清楚的時候你對OOP的理解應該就差不多了,呵呵,加油吧。
❹ 在C++中怎麼調用類中的私有成員函數
C++中調用類的私有成員函數的方法就是,在該類中再聲明定義一個公有成員函數
在其函數內部調用自己的私有成員函數,向外使用的話,在別的類中包含該類的頭文件,就可以通過公有函數隱式的訪問私有成員函數;
給個簡單例子
class A
{
private:
void fuck();
public:
void howfuck()
{
fuck();
}
};
#include "A.h"
class Fuck
{
public:
A xiha;
}
xiha.howfuck(); //這樣就可以訪問A類的私有成員fuck函數了
❺ c++中可不可以在一個類中訪問另一個類的私有成員
可以,只要定義該類為另一個類的友元類即可。
友元類:
class A
{
friend class B
private: int aa;
};
class B
{
public:
void output()
{
cout << a.aa << endl;
}
private: A a;
}
使用友元類時:
(1) 友元關系不能被繼承。
(2) 友元關系是單向的,不具有交換性。若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的聲明。
(3) 友元關系不具有傳遞性。若類B是類A的友元,類C是B的友元,類C不一定是類A的友元,同樣要看類中是否有相應的申明。
(5)c擴展方法訪問私有擴展閱讀:
友元類使用注意事項:
1、友元可以訪問類的私有成員。
2、只能出現在類定義內部,友元聲明可以在類中的任何地方,一般放在類定義的開始或結尾。
3、友元可以是普通的非成員函數,或前面定義的其他類的成員函數,或整個類。
4、類必須將重載函數集中每一個希望設為友元的函數都聲明為友元。
5、友元關系不能繼承,基類的友元對派生類的成員沒有特殊的訪問許可權。如果基類被授予友元關系,則只有基類具有特殊的訪問許可權。該基類的派生類不能訪問授予友元關系的類。
參考資料來源:網路-友元類
❻ 高分 c++ typedef 訪問基類的私有虛函數
//使用typedef來定義一個函數指針,可以參閱相關資料
typedefvoid(*Fun)(void);
voidmain()
{
Bb;//一個子類的對象
//這里如果不用typedef的話就應該是
//void(*pFun)(void);
FunpFun;
for(inti=0;i<3;i++)
{
//其實是得到b的地址,但是不能直接寫成intaddr=&b;這樣編譯器會報錯的
//所以才有了下面的兩個*
intaddr=*(int*)&b;
//現在addr變成了存儲b開始的地址的一個int型變數,所以我們還需要:
//classB的布局為:B的vtable,函數h的地址
//而B的vtable展開就是:函數g的地址,函數f的地址
//所以B的布局展開就是:函數g(被B覆寫)的地址,函數f(A的f)的地址,函數h的地址
//每個地址佔4個位元組
//那麼b+0為g的地址,b+4為f的地址,b+8為h的地址
//但是為什麼循環里是按照1遞增呢?因為上面的情況是按照char類型遞增的
//根據C的定址規則,增加一個int其實就是增加了4個位元組
//所以我們有了(int*)addr,這是說按照int型的字長來增加定址位元組數
//經過上面的分析,可以知道:
//((int*)*(int*)(&b)+0)其實就是g的地址
//((int*)*(int*)(&b)+1)其實就是f的地址
//((int*)*(int*)(&b)+2)其實就是h的地址
//那麼它終究還是一個地址,於是前面再加了一個*,就是函數的內容
pFun=(Fun)*((int*)*(int*)(&b)+i);
//然後開始運行這個函數
pFun();
}
}
vtable很復雜,可以參看C++對象模型那本書,如果只是想現在大致了解一下,可以參看下面的網址
http://blog.csdn.net/haoel/article/details/1948051/
我講的也可能不對,不可盡信。
❼ c ++私有成員訪問性
你這個問題有2方面的問題:
一:類和對象的概念你沒搞清楚,類是對象的高度抽象,對象是類的實體化,在內存中來說,類就是一種數據類型跟int等式一樣的,單說類是沒有意義的,它並不佔用內存,所以你這個類a的私有成員被類a對象訪問本來就沒任何意義。
二:類的私有成員是類的內部屬性,就相當於一個人的心臟的跳動頻率會讓別人訪問修改么一個道理,private的意思是在被繼承或者類的外部無法訪問這個成員,類在實體化後也就是建立對象後,具體對象的函數可以調用自己內部的private對象或者是友員函數也可以,private成員在不同的對象之間也是不能夠相互訪問的。
打字累死了,求給分。
❽ C ++如何調用私有private方法
C++可以在類內調用private函數,或者在友元函數內調用。
❾ 高手指教啊:C++把類成員設成私有的、用公有函數訪問,和 直接把類成員設成公有的 有什麼區別
1)可擴展性,比如一個Set函數,他一開始只是設置成員變數,後來因為功能變化,需要經過計算之後再設置成員變數,用Set函數可以很方便的修改,而且不影響使用者。如果直接使用成員變數,那麼所有使用的地方都需要修改。
2)安全性,通過函數可以規定使用者的訪問許可權,比如一個類只提供了Get方法,那麼使用者就不能修改這個成員變數,保證這個成員變數只有自己能夠修改。如果直接訪問公有成員變數,那麼使用者就獲得了完全的訪問許可權,他甚至可以在類的外部刪除這個成員變數,等到該類再使用這個成員變數時,就會出現異常,這是非常不安全的。