拷貝建構函式的乙個物件訪問私有成員的問題

2021-07-12 04:33:47 字數 2645 閱讀 9419

最近遇到這樣乙個面試題:面試題 cstring函式拷貝控制成員的編寫

過程中遇到乙個問題,真是當時讓我疑惑不解:查查資料,原來是一時糊塗,看看人家的解答:不錯,遂轉一下(很簡單,就是當時沒轉過彎來)

原文如下:

這個題目很奇怪啊,今天下午在看拷貝建構函式的時候,突然看到了很奇怪的一句話:

[cpp]

view plain

copy

1.classcexample  

2.      

5.        ~cexample()  

6.        cexample(constcexample&);   

7.voidinit(intn)  

8.private:  

9.char*pbuffer;   

10.intnsize;  

11.  };  

12.  cexample::cexample(constcexample& rightsides)   

13.    

感嘆號部分我很奇怪,不是不允許物件許訪問私有變數成員麼?怎麼回事,而且還能編譯通過。 1.

為什麼物件

a可以直接訪問私有的x(

a.x)成員見

給出了乙個解答:

因為a(const a&a)

是他的成員函式。

在我的例子也是如此:

cexample::cexample(const cexample& rightsides)

是cexample

的成員函式,所以可以訪問同型別物件的私有成員。即

righsides.nsize

的呼叫可以編譯用過,但是,你在

main

函式裡面直接寫上:

[cpp]

view plain

copy

1.intmain(intargc,char* argv)  

2.      

編譯器肯定是報錯,提示你

nsize

是私有變數,不允許物件進行訪問。

隨後,我又做了乙個實驗:

[cpp]

view plain

copy

1.    

#include 

2.    

3.using

namespacestd;  

4.classt;  

8.classctest  

9.    ;  

17.intprint1(constctest &);  

18.intprint2(constt&);  

19.private:  

20.intm_data;  

21.  };  

22. 

23.  ctest::ctest()  

24.    

27. 

28.  ctest::ctest(constctest& arg)  

29.    

33. 

34.  ctest & ctest::operator = (constctest & arg)  

35.    

38.intctest :: print1(constctest & arg)  

42.intctest::print2(constt& arg)  

45.intmain()  

46.    

請注意print()

、print1()

、print2()

的區別;

print()

自然不用說,成員函式訪問類的私有變數,編譯通過;

print1():print1

是ctest

類的成員函式,而

print1

的形參是

const ctest&arg

,arg

的型別就是

ctest,

根據成員函式可以訪問私有變數,故編譯通過

print2():print2

是ctest

類的成員函式,但是

print2

的形參型別是

t,不是

ctest,print2不是t

的成員函式,不能訪問類的私有變數,故編譯不能通過

拷貝建構函式 訪問私有變數成員

分類 c c primer stl 2013 06 04 13 49 1028人閱讀收藏 舉報lain copy class cexample cexample cexample const cexample void init intn private char pbuffer intnsize ...

如何訪問和修改乙個物件的私有屬性

有兩個思路 先給出我們接下來要使用的類 inte ce person nsobject end inte ce person property nonatomic,copy nsstring name end implementation person endperson person person...

用乙個物件初始化另乙個物件時用到拷貝建構函式

用乙個物件初始化另乙個物件時用到拷貝建構函式 例如 string a b 注意這個是用b初始化時a 如果 在程式中 a b賦值時 用的是賦值函式 如果物件有指標成員 則系統預設的複製建構函式是淺層複製建構函式,它只是把指標指向同乙個位址,這是不對的,例如每個物件在釋放指標占用的空間時,同乙個指標位址...