搜尋

首頁  >  問答  >  主體

c++构造函数的问题

请教一下关于c++中构造函数的问题:

class HasPtr {
public:
    HasPtr(const std::string& s = std::string()) : ps(new std::string(s)), i(0)
    {
    }
    HasPtr(const HasPtr& hp) : ps(new std::string(*hp.ps)), i(hp.i) {}
    HasPtr& operator=(const HasPtr& hp)
    {
        std::string* new_ps = new std::string(*hp.ps);
        delete ps;
        ps = new_ps;
        i = hp.i;
        return *this;
    }

private:
    std::string* ps;
    int i;
};

想请问一下为什么在拷贝构造函数和赋值操作符中,接受的那个引用可以直接用hs.ps来取它的私有数据ps,之前都是写js的,没有私有这么一说,以前看着没想什么,今天突然想到这个问题,为什么通过.运算符直接取到了私有数据呢?求指点!

怪我咯怪我咯2773 天前342

全部回覆(3)我來回復

  • 巴扎黑

    巴扎黑2017-04-17 14:20:34

    所謂的類別成員存取權public/protected/private是針對來自外部的存取而言的,你這是類別自身的函數,都是自家人能有什麼問題。

    或這麼說,調用方是HasPtr::operator =,是歸屬於HasPtr的;而被調用方是hp.ps,ps也是歸屬於HasPtr,完全符合private的規定。這和.運算沒啥關係。

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 14:20:34

    類別的成員函數是可以存取該類別實例物件的私有屬性的,類別的存取權限是編譯器強加的,所以只要在編譯階段沒有問題,就是沒有問題的,運行過程中是能取到私有變量的,決定能不能存取到私有變數的階段是編譯階段,編譯階段hsHasPtr的類作用域中,這時是可以找到hs.ps這個符號的,編譯可以通過,然後就可以來去私有變數了。
    PS: js也有私有變數啊,用閉包不就可以產生嗎?

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:20:34

    存取說明符只在不同類別之間起作用,對同一個類別的物件不起作用。

    回覆
    0
  • 取消回覆