最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++訪問私有private成員變量的常用方法

 更新時(shí)間:2020年08月20日 11:51:37   作者:Hao_09  
這篇文章主要介紹了c++訪問私有private成員變量的常用方法,需要的朋友可以參考下

類的對(duì)象不能直接訪問類聲明的私有成員變量,否則破壞了信息隱藏的目的。

在C++中,為了防止某些數(shù)據(jù)成員或成員函數(shù)從外部被直接訪問,可以將它們聲明為private,這樣編譯器會(huì)阻止任何來自外部非友元的直接訪問。

私有成員變量的常用訪問方法如下:

(1)通過公共函數(shù)為私有成員賦值

#include <iostream> 
using namespace std; 
 
class Test 
{ 
private: 
	int x, y; 
public: 
	void setX(int a) 
	{ 
		x=a; 
	} 
	void setY(int b) 
	{ 
		y=b; 
	} 
	void print(void) 
	{ 
		cout<<"x="<<x<<'\t'<<"y="<<y<<endl; 
	} 
} ; 
 
int main() 
{ 
	Test p1; 
	p1.setX(1); 
	p1.setY(9); 
	p1.print( ); 
	return 0; 
} 

(2)利用指針訪問私有數(shù)據(jù)成員

#include <iostream> 
using namespace std; 
class Test 
{ 
private: 
	int x,y; 
public: 
	void setX(int a) 
	{ 
		x=a; 
	} 
	void setY(int b) 
	{ 
		y=b; 
	} 
	void getXY(int *px, int *py) 
	{ 
		*px=x; //提取x,y值 
		*py=y; 
	} 
}; 
int main() 
{ 
	Test p1; 
	p1.setX(1); 
	p1.setY(9); 
	int a,b; 
	p1.getXY(&a,&b); //將 a=x, b=y 
	cout<<a<<'\t'<<b<<endl; 
	return 0; 
} 

(3)利用函數(shù)訪問私有數(shù)據(jù)成員

#include <iostream> 
using namespace std; 
class Test 
{ 
private: 
	int x,y; 
public: 
	void setX(int a) 
	{ 
		x=a; 
	} 
	void setY(int b) 
	{ 
		y=b; 
	} 
	int getX(void) 
	{ 
		return x; //返回x值 
	} 
	int getY(void) 
	{ 
		return y; //返回y值 
	} 
}; 
int main() 
{ 
	Test p1; 
	p1.setX(1); 
	p1.setY(9); 
	int a,b; 
	a=p1.getX( ); 
	b=p1.getY(); 
	cout<<a<<'\t'<<b<<endl; 
	return 0; 
} 

(4)利用引用訪問私有數(shù)據(jù)成員

#include <iostream> 
using namespace std; 
class Test 
{ 
private: 
	int x,y; 
public: 
	void setX(int a) 
	{ 
		x=a; 
	} 
	void setY(int b) 
	{ 
		y=b; 
	} 
	void getXY(int &px, int &py) //引用 
	{ 
		px=x; //提取x,y值 
		py=y; 
	} 
}; 
int main() 
{ 
	Test p1,p2; 
	p1.setX(1); 
	p1.setY(9); 
	int a,b; 
	p1.getXY(a, b); //將 a=x, b=y 
	cout<<a<<'\t'<<b<<endl; 
	return 0; 
}

下面是其它網(wǎng)友的補(bǔ)充

訪問C++類對(duì)象中私有成員變量的方法

原則上,C++類中私有變量不允許在類之外的其他任何地方訪問,一般來說功能完善的類都會(huì)提供get,set方法來操作類屬性值,但如果沒有g(shù)et、set方法都沒有提供,比如使用的是第三方提供的.o(或者動(dòng)態(tài)庫(kù))來進(jìn)行開發(fā)的,并且實(shí)際應(yīng)用中我們確確實(shí)實(shí)需要改變其中某個(gè)對(duì)象的一個(gè)私有參數(shù),有沒有什么辦法呢?我們知道,一個(gè)進(jìn)程有程序段和數(shù)據(jù)段,如果我們知道了對(duì)象的數(shù)據(jù)空間,那么得到該對(duì)象的成員變量值也就很簡(jiǎn)單了,而實(shí)際上,對(duì)象數(shù)據(jù)段的首地址其實(shí)就是對(duì)象地址,以例子說明:

class A
{
public:
 int i;
 bool setJ(int _j){j = _j;};
 int getJ() const {return j;};
private:
 int j;
};

int main()
{
 A a;
 printf("a's address is %u.n",&a); // 打印對(duì)象a的地址
 printf("a.i's address is %u.n",(&(a.i))); // 打印對(duì)象a的成員變量i的地址
}

執(zhí)行上面程序,可以看到結(jié)果,兩個(gè)值時(shí)一樣的,也就是說明對(duì)象地址就是第一個(gè)成員變量的地址。
我們知道,C++編譯器將數(shù)據(jù)和程序段分開,所有的類變量會(huì)按照聲明順序依次存入數(shù)據(jù)段,所以,如果知道了第一個(gè)變量的地址,那么后面的地址也就依次累加即可逐一求出了。有了變量地址,那么也就可以對(duì)它的值進(jìn)行修改了。還是以上面的例子來說明,一下程序編寫了如何更改類成員b的值:

int main()
{
 A a;
 a.setJ(2);
 printf("before modified:the member j of a is %d.n",a.getJ()); // 打印j的值。
 int *p = (int *)(int(&a) + sizeof(a.i));
 *p = 10;
 printf("after modified:the member j of a is %d.n",a.getJ()); // 打印j的值。
}

可以得出此時(shí)j成員變量的值由2變成10了。

總結(jié):直接對(duì)地址空間操作,請(qǐng)小心為妙。。。 

此外,另附一篇與此類似的文章,也很有啟發(fā)性。

分析程序員和黑客的區(qū)別

 題目:
  設(shè)有如下C++類

class A
{
 int value;
public:
 A(int n = 0) : value(n) {}
 int GetValue()
 {
 return value;
 }
};

請(qǐng)使用某種方式來在類的外部改變私有成員A::value的值。

程序員的可能做法:

class A
{
 int value;
public:
 A(int n = 0) : value(n) {}
 int GetValue()
 {
 return value;
 }
 void SetValue(int n)
 {
 value = n;
 }
};
void f()
{
 A a;
 a.SetValue(5);
}

黑客的可能做法:

void f()
{
 A a;
 *((int *)&a) = 5;
}

結(jié)論:

程序員習(xí)慣于遵循既有的限制來增加既有的東西。
黑客習(xí)慣于利用既有的東西來打破既有的限制。

到此這篇關(guān)于c++訪問私有private成員變量的常用方法的文章就介紹到這了,更多相關(guān)c++私有private成員變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt實(shí)現(xiàn)Flappy Bird游戲

    Qt實(shí)現(xiàn)Flappy Bird游戲

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)Flappy Bird游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++函數(shù)重載的深入解析

    C++函數(shù)重載的深入解析

    在C++中,我們也能夠把具有相同功能的函數(shù)整合到一個(gè)函數(shù)上,而不必去寫好多個(gè)函數(shù)名不同的函數(shù),這叫做函數(shù)的重載。以下是對(duì)C++中的函數(shù)重載進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-07-07
  • 談?wù)剉ector的特殊性之為什么它不是STL容器

    談?wù)剉ector的特殊性之為什么它不是STL容器

    這篇文章主要給大家介紹了關(guān)于vector的特殊性之為什么它不是STL容器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 標(biāo)準(zhǔn)CSV格式的介紹和分析以及解析算法實(shí)例詳解

    標(biāo)準(zhǔn)CSV格式的介紹和分析以及解析算法實(shí)例詳解

    這篇文章主要介紹了標(biāo)準(zhǔn)CSV格式的介紹和分析以及解析算法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • C語(yǔ)言WinSock學(xué)習(xí)筆記

    C語(yǔ)言WinSock學(xué)習(xí)筆記

    本篇文章主要介紹了C語(yǔ)言WinSock學(xué)習(xí)筆記,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2007-12-12
  • c++函數(shù)中的指針參數(shù)與地址參數(shù)區(qū)別介紹

    c++函數(shù)中的指針參數(shù)與地址參數(shù)區(qū)別介紹

    c++函數(shù)中的指針參數(shù)與地址參數(shù)區(qū)別介紹;可供參考
    2012-11-11
  • 基于C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂系統(tǒng)

    基于C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂系統(tǒng)

    C++中的Beep 函數(shù)是一個(gè)發(fā)出嗡鳴聲的函數(shù),本文將利用這個(gè)函數(shù)實(shí)現(xiàn)制作一個(gè)簡(jiǎn)單的聲音系統(tǒng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12
  • c++運(yùn)算符重載基礎(chǔ)知識(shí)詳解

    c++運(yùn)算符重載基礎(chǔ)知識(shí)詳解

    運(yùn)算符重載是一種形式的C++多態(tài)。運(yùn)算符重載將重載的概念擴(kuò)展到運(yùn)算符上,允許賦予C++運(yùn)算符多種含義
    2014-03-03
  • 線程池的原理與實(shí)現(xiàn)詳解

    線程池的原理與實(shí)現(xiàn)詳解

    下面利用C語(yǔ)言來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線程池,為了使得這個(gè)線程池庫(kù)使用起來更加方便,特在C實(shí)現(xiàn)中加入了一些OO的思想,與Objective-C不同,它僅僅是使用了struct來模擬了c++中的類,其實(shí)這種方式在linux內(nèi)核中大量可見
    2013-09-09
  • C++改變參數(shù)值的方式小結(jié)

    C++改變參數(shù)值的方式小結(jié)

    本文主要介紹了C++改變參數(shù)值的方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論

乐都县| 宿松县| 商丘市| 迁安市| 神农架林区| 富锦市| 龙岩市| 天峻县| 阿拉尔市| 广州市| 中宁县| 武邑县| 葫芦岛市| 上栗县| 清原| 靖州| 壤塘县| 绥中县| 密山市| 崇义县| 海淀区| 阜南县| 印江| 林甸县| 逊克县| 湘潭市| 贵阳市| 韩城市| 环江| 额敏县| 陆川县| 八宿县| 宾川县| 申扎县| 宜宾县| 盐边县| 德兴市| 鄂托克前旗| 桑植县| 都匀市| 安丘市|