搜尋

首頁  >  問答  >  主體

c++ - 构造函数为啥能访问参数的私有数据成员

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

<code>对于c++ private数据成员访问的问题:

class MyClass

{

public:

    MyClass(const char* str = NULL)

    {

        if(str == NULL)

        {

            m_data = new char[1];

            *m_data = '\0';

        }

        else

        {

            int len = strlen(str);

            m_data = new char[len + 1];

            strcpy(m_data,str);

        }

    }

 

    MyClass(const MyClass &other)

    {

        printf("%s\n" , other.m_data );

    }

 

    ~MyClass(void)

    {

        delete [] m_data;

    }

private:

    char *m_data;

};

 

 

MyClass* tmp = new MyClass("a");

MyClass tmp1 = *tmp; // a

</code>

上述代码的拷贝构造函数可以访问到参数的private数据成员,这个怎么理解?

后续又添加了个测试函数,发现还是可以访问

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

<code>class MyClass1

{

public:

    MyClass1(const char* str = NULL);

    MyClass1(const MyClass1 &other);

    ~MyClass1(void);

 

    void TestPri(const MyClass1 &other);

 

private:

    char *m_data;

};

 

MyClass1::MyClass1(const char* str)

{

    if(str == NULL)

    {

        m_data = new char[1];

        *m_data = '\0';

    }

    else

    {

        int len = strlen(str);

        m_data = new char[len + 1];

        strcpy(m_data,str);

    }

}

 

MyClass1::MyClass1(const MyClass1 &other)

{

    printf("%s\n" , other.m_data );

}

 

MyClass1::~MyClass1(void)

{

    delete [] m_data;

}

 

void MyClass1::TestPri(const MyClass1 &other)

{

    printf("%s\n" , other.m_data );

}

MyClass1* tmp = new MyClass1("a");

MyClass1 tmp1 = *tmp; // a

MyClass1 tmp2;

tmp2.TestPri(*tmp); // a

</code>

求解答

PHPzPHPz2820 天前630

全部回覆(1)我來回復

  • 阿神

    阿神2017-04-17 14:37:49

    存取控制權限是以類別為單位的,而不是物件。正是這個原因,成員函數可以存取該類別物件的私有成員變量,但是不可以存取其它類別的物件的私有成員。這裡有個類似的問題:http://stackoverflow.com/ques...

    回覆
    0
  • 取消回覆