類的成員函式返回引用所引發的問題

2021-09-19 11:29:45 字數 2091 閱讀 2141

今天做c++專案的時候,在類的get函式中返回了乙個類屬性的引用,自己琢磨之下,忽然想到乙個很奇怪的問題,通過這種方式,能在外部修改類私有屬性的值麼?啥也不說了,寫個**測試一下。

#include

using

namespace

std;class

base int& getx

( ) int

setx

(int x)

private : int m_x;};int

main

( )

不看不知道,一看嚇一跳,直接把類的私有資料成員暴漏在外部介面,這樣的**要是拿出來用,真是黑客的福音,程式設計師的災難啊。我以前經常這樣寫

get函式的,竟然沒發現這樣的問題。趕緊想辦法補救

初次是這樣想的,既然是返回引用造成了這樣的漏洞,那我不返回引用不就行了,這樣行是行,但是不是我們想要的啊,我們返回引用就是為了提高效率,加入我們希望獲取到類的屬性值,不是測試用例中的基本資料型別,而是乙個複雜的類,那麼每次返回時,複製建構函式的龐大開銷,可不是吃素的(雖然很多編譯器都支援nrvo返回值優化,但是很多情況下,這種呼叫還是不可避免的),我們c/c++可是將就效率的,這種開銷是我們無法容忍的,那麼還是返回引用,怎麼能夠防止外部修改呢,

仔細想想,我們在使用get函式的時候,只是希望在外部能夠獲取到某些屬性的值,也就是讀屬性,返回引用暴漏出來的漏洞,其實是提供了乙個對私有資料成員寫的介面,那麼我們在返回值上加上乙個const,強制唯讀,是不是就可以了呢。

#include

using

namespace

std;class

base const

int& getx

( ) int

setx

(int x)

private : int m_x;};int

main

( )

這樣的問題,以前竟然一直發現不了,看來c++還真是博大精深,學了這麼久,還是有很多問題沒注意到。沒事一天發現乙個問題,繼續下來,一輩子總會收穫很多啊。

今天做c++專案的時候,在類的get函式中返回了乙個類屬性的引用,自己琢磨之下,忽然想到乙個很奇怪的問題,通過這種方式,能在外部修改類私有屬性的值麼?啥也不說了,寫個**測試一下。

#include

using

namespace

std;class

base int& getx

( ) int

setx

(int x)

private : int m_x;};int

main

( )

不看不知道,一看嚇一跳,直接把類的私有資料成員暴漏在外部介面,這樣的**要是拿出來用,真是黑客的福音,程式設計師的災難啊。我以前經常這樣寫

get函式的,竟然沒發現這樣的問題。趕緊想辦法補救

初次是這樣想的,既然是返回引用造成了這樣的漏洞,那我不返回引用不就行了,這樣行是行,但是不是我們想要的啊,我們返回引用就是為了提高效率,加入我們希望獲取到類的屬性值,不是測試用例中的基本資料型別,而是乙個複雜的類,那麼每次返回時,複製建構函式的龐大開銷,可不是吃素的(雖然很多編譯器都支援nrvo返回值優化,但是很多情況下,這種呼叫還是不可避免的),我們c/c++可是將就效率的,這種開銷是我們無法容忍的,那麼還是返回引用,怎麼能夠防止外部修改呢,

仔細想想,我們在使用get函式的時候,只是希望在外部能夠獲取到某些屬性的值,也就是讀屬性,返回引用暴漏出來的漏洞,其實是提供了乙個對私有資料成員寫的介面,那麼我們在返回值上加上乙個const,強制唯讀,是不是就可以了呢。

#include

using

namespace

std;class

base const

int& getx

( ) int

setx

(int x)

private : int m_x;};int

main

( )

這樣的問題,以前竟然一直發現不了,看來c++還真是博大精深,學了這麼久,還是有很多問題沒注意到。沒事一天發現乙個問題,繼續下來,一輩子總會收穫很多啊。

類的成員函式返回引用所引發的問題

今天做c 專案的時候,在類的 get函式中返回了乙個類屬性的引用,自己琢磨之下,忽然想到乙個很奇怪的問題,通過這種方式,能在外部修改類私有屬性的值麼?啥也不說了,寫個 測試一下。include using namespace std class base int getx int setx int ...

C 類成員函式返回類的物件

1.類成員函式臨時物件 2.類成員函式返回持久物件 3.類成員函式返回指標 類成員函式返回類的物件 include include using namespace std class a str1 無參構造str1 str2 無參構造str2 cout 無參構造呼叫 void setarr a in...

is uploaded file函式引發的問題

起因 在利用moophp的乙個專案中,接到使用者反饋說其所有客戶不能上傳檔案,都返回失敗。經過排查發現是php中的is uploaded file函式在 搗鬼。細節分析 在正常情況下,通過php 上傳檔案 需要通過is uploaded file函式來判斷檔案是否是通過 http post 上傳的,...