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

2021-07-03 18:43:19 字數 1708 閱讀 6528

分類: 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;  

};  

cexample::cexample(const

cexample& rightsides)     

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

1.為什麼物件a可以直接訪問私有的x(a.x)成員見

給出了乙個解答:

因為a(const a&a)是他的成員函式。

在我的例子也是如此:cexample::cexample(const cexample& rightsides)是cexample的成員函式,所以可以訪問同型別物件的私有成員。即righsides.nsize的呼叫可以編譯用過,但是,你在main函式裡面直接寫上:

[cpp]view plain

copy

intmain(

intargc, 

char

* argv)    

編譯器肯定是報錯,提示你nsize是私有變數,不允許物件進行訪問。

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

[cpp]view plain

copy

#include 

using

namespace

std;  

class

t;  

class

ctest  

;  int

print1(

const

ctest &);  

intprint2(

const

t&);  

private

:  int

m_data;  

};  

ctest::ctest()  

ctest::ctest(const

ctest& arg)  

ctest & ctest::operator = (const

ctest & arg)  

intctest :: print1(

const

ctest & arg)  

intctest::print2(

const

t& arg)  

intmain()    

請注意print()、print1()、print2()的區別;

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

print1():print1是ctest類的成員函式,而print1的形參是const ctest& arg,arg的型別就是ctest,根據成員函式可以訪問私有變數,故編譯通過

print2():print2是ctest類的成員函式,但是print2的形參型別是t,不是ctest,print2不是t的成員函式,不能訪問類的私有變數,故編譯不能通過

靜態成員變數成員函式

靜態成員變數 1 定義靜態成員變數 關鍵字static可以用於說明乙個類的成員,靜態成員提供了乙個同類物件的共享機制 把乙個類的成員說明為static時,這個類無論有多少個物件被建立,這些物件共享這個static成員 靜態成員區域性於類,它不是物件成員 includeusing namespace ...

靜態成員變數成員函式

1.先來介紹它的第一條也是最重要的一條 隱藏。static函式,static變數均可 當同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。舉例來說明。同時編譯兩個原始檔,乙個是a.c,另乙個是main.c。char a a global variable void m...

如何訪問私有成員變數和函式

一說到修改 delphi 原始碼或者訪問物件的私有成員函式,很多人馬上可以說出種種危害來否定我。這種做法我也提倡,但是有時候如果可以靈活運用,可以解決由於 delphi 因為封裝不正確而帶來的問題。我在這裡分享一些技巧 1.訪問私有成員變數 如果是 protected 的變數,可以用如下方法訪問 t...