深入理解C++中public、protected及private用法

深入理解C++中public、protected及private用法

这篇文章主要介绍了C++中public、protected及private用法,对于C++面向对象程序设计来说是非常重要的概念,需要的朋友可以参考下

初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C++中public、protected及private用法。相信对于大家深入掌握C++程序设计会有很大的帮助。

这里我们首先要明白下面几点。

1.类的一个特征就是封装,public和private作用就是实现这一目的。所以:

用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元访问。

2.类的另一个特征就是继承,protected的作用就是实现这一目的。所以:

protected成员可以被派生类对象访问,不能被用户代码(类外)访问。

现来看看如下示例:

?


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

#include<iostream>

#include<assert.h>

using namespace std;

class A{

public:

  int a;

  A(){

    a1 = 1;

    a2 = 2;

    a3 = 3;

    a = 4;

  }

  void fun(){

    cout << a << endl;    //正确

    cout << a1 << endl;   //正确

    cout << a2 << endl;   //正确,类内访问

    cout << a3 << endl;   //正确,类内访问

  }

public:

  int a1;

protected:

  int a2;

private:

  int a3;

};

int main(){

  A itema;

  itema.a = 10;    //正确

  itema.a1 = 20;    //正确

  itema.a2 = 30;    //错误,类外不能访问protected成员

  itema.a3 = 40;    //错误,类外不能访问private成员

  system("pause");

  return 0;

}

继承中的特点:

先记住:不管是否继承,上面的规则永远适用!

有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。

1.public继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:public, protected, private

2.protected继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:protected, protected, private

3.private继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:private, private, private

但无论哪种继承方式,上面两点都没有改变:

1.private成员只能被本类成员(类内)和友元访问,不能被派生类访问;

2.protected成员可以被派生类访问。

再来看看以下代码:

1.public继承

代码如下:

?


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

48

49

#include<iostream>

#include<assert.h>

using namespace std;

class A{

public:

  int a;

  A(){

    a1 = 1;

    a2 = 2;

    a3 = 3;

    a = 4;

  }

  void fun(){

    cout << a << endl;    //正确

    cout << a1 << endl;   //正确

    cout << a2 << endl;   //正确

    cout << a3 << endl;   //正确

  }

public:

  int a1;

protected:

  int a2;

private:

  int a3;

};

class B : public A{

public:

  int a;

  B(int i){

    A();

    a = i;

  }

  void fun(){

    cout << a << endl;       //正确,public成员

    cout << a1 << endl;       //正确,基类的public成员,在派生类中仍是public成员。

    cout << a2 << endl;       //正确,基类的protected成员,在派生类中仍是protected可以被派生类访问。

    cout << a3 << endl;       //错误,基类的private成员不能被派生类访问。

  }

};

int main(){

  B b(10);

  cout << b.a << endl;

  cout << b.a1 << endl;   //正确

  cout << b.a2 << endl;   //错误,类外不能访问protected成员

  cout << b.a3 << endl;   //错误,类外不能访问private成员

  system("pause");

  return 0;

}

2.protected继承:

代码如下:

?


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

48

#include<iostream>

#include<assert.h>

using namespace std;

class A{

public:

  int a;

  A(){

    a1 = 1;

    a2 = 2;

    a3 = 3;

    a = 4;

  }

  void fun(){

    cout << a << endl;    //正确

    cout << a1 << endl;   //正确

    cout << a2 << endl;   //正确

    cout << a3 << endl;   //正确

  }

public:

  int a1;

protected:

  int a2;

private:

  int a3;

};

class B : protected A{

public:

  int a;

  B(int i){

    A();

    a = i;

  }

  void fun(){

    cout << a << endl;       //正确,public成员。

    cout << a1 << endl;       //正确,基类的public成员,在派生类中变成了protected,可以被派生类访问。

    cout << a2 << endl;       //正确,基类的protected成员,在派生类中还是protected,可以被派生类访问。

    cout << a3 << endl;       //错误,基类的private成员不能被派生类访问。

  }

};

int main(){

  B b(10);

  cout << b.a << endl;       //正确。public成员

  cout << b.a1 << endl;      //错误,protected成员不能在类外访问。

  cout << b.a2 << endl;      //错误,protected成员不能在类外访问。

  cout << b.a3 << endl;      //错误,private成员不能在类外访问。

  system("pause");

  return 0;

}

3.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

48

#include<iostream>

#include<assert.h>

using namespace std;

class A{

public:

  int a;

  A(){

    a1 = 1;

    a2 = 2;

    a3 = 3;

    a = 4;

  }

  void fun(){

    cout << a << endl;    //正确

    cout << a1 << endl;   //正确

    cout << a2 << endl;   //正确

    cout << a3 << endl;   //正确

  }

public:

  int a1;

protected:

  int a2;

private:

  int a3;

};

class B : private A{

public:

  int a;

  B(int i){

    A();

    a = i;

  }

  void fun(){

    cout << a << endl;       //正确,public成员。

    cout << a1 << endl;       //正确,基类public成员,在派生类中变成了private,可以被派生类访问。

    cout << a2 << endl;       //正确,基类的protected成员,在派生类中变成了private,可以被派生类访问。

    cout << a3 << endl;       //错误,基类的private成员不能被派生类访问。

  }

};

int main(){

  B b(10);

  cout << b.a << endl;       //正确。public成员

  cout << b.a1 << endl;      //错误,private成员不能在类外访问。

  cout << b.a2 << endl;      //错误, private成员不能在类外访问。

  cout << b.a3 << endl;      //错误,private成员不能在类外访问。

  system("pause");

  return 0;

}

通过以上的代码都备有较为详尽的注释,读者应该能够理解。仔细看代码中派生类B中定义了和基类同名的成员a,此时基类的a仍然存在,可以验证。

?


1

2

3

4

5

6

7

int main(){

  cout << sizeof(A) << endl;

  cout << sizeof(B) << endl;

  system("pause");

  return 0;

}

输出:

16

20

所以派生类包含了基类所有成员以及新增的成员,同名的成员被隐藏起来,调用的时候只会调用派生类中的成员。

如果要调用基类的同名成员,可以用以下方法:

?


1

2

3

4

5

6

7

8

9

int main(){

  B b(10);

  cout << b.a << endl;

  cout << b.A::a << endl;

  system("pause");

  return 0;

}

输出:

10

4

记得这里是在类外访问,而a在基类中是public,所以继承方式应该为public,使得a在派生类中仍然为public,在类外可以访问。

感兴趣的读者可以调试运行一下本文实例,加深印象的同时还会有新的收获。

时间: 2024-08-11 00:12:06

深入理解C++中public、protected及private用法的相关文章

JAVA中public protected default private访问权限

前言:本文解决的问题 public protected default private这四个修饰符的访问权限问题 public对所有类公开,private只有本类可以访问.这里需要注意的是protected,除了对本类和子类公开外,还对本包所在类的公开,即同一包类的类都可以访问:default,如果没有明确写出修饰类型则为default,它只对本包公开.这四个修饰符的访问权限从大到小为public>protected>default>private. 另外,慎用protected,容易破

C++中public、protected及private用法

转自:http://www.jb51.net/article/54224.htm 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及private用法.相信对于大家深入掌握C++程序设计会有很大的帮助. 这里我们首先要明白下面几点. 1.类的一个特征就是封装,public和private作用就是实现这一目的.所以: 用户代码(类外)可以访问public成

Java的权限修饰符(public,protected,default,private)

访问权限修饰符权限从高到低排列是public  ,protected  ,default, private. 一.根据"是否是同包"."是否是子类"分为4中情况+本类 5种情况 二.把 同包中的子类 和 同包中的非子类 合并为 同包 访问修饰符 本类 同包 不同包,子类 不同包,非子类 public √ √ √ √ protected √ √ √   default(friendly) √ √     private √      

public,protected,friendly,private的访问权限

请说出作用域public,private,protected,以及不写时的区别 这四个作用域的可见范围如下表所示. 说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly. 作用域    当前类  同一package  子孙类  其他package public        √        √           √        √ protected     √         √         √        × friendly      √          √

java 修饰符的作用一(public protected default private 组)

1.public protected default private 组 public 权限最大,同类,同包,不同包,同包子类父类之间,不同包子类父类之间都可以访问. java 默认的权限是default,即friendly(注:friendly 在java中没有,是c的说法.) 同类,同包,同包子类父类都可以访问. protected受保护的,同类,同包,同包子类父类,不同包子类父类都可以访问 private 私有的权限最小,同类可以访问. 图如下: 位置                   

java四种权限修饰符(public &gt; protected &gt; (default) &gt; private)

权限修饰符在哪里可以访问 (default) : 表示什么权限修饰符都不写 位置 public protected (default) private 同一个类 yes yes yes yes 同一个包 yes yes yes no 不同包子类 yes yes no no 不同包非子类 yes no no no 原文地址:https://www.cnblogs.com/zhuobo/p/10612656.html

详解Java中的访问控制修饰符(public, protected, default, private)

Java中的访问控制修饰符已经困惑笔者多时,其中较复杂的情况一直不能理解透彻.今天下定决心,系统.全面地研究Java中的访问控制修饰符的所有方面,并整理成这篇文章,希望有同样疑惑的读者读完后能有所收获.如果文章中出现错误,欢迎评论指出,共同交流~ 说在前面:这篇文章只研究Java中访问控制修饰符声明类的变量/方法的情况. 先抛出结论: * 成员变量/方法的访问权限 *                                        private        default  

C++中public,protected,private访问

总结:1. protected和private的区别在于 ,protected的访问标号限制,能够被派生类的成员函数访问,而private不能2. protected和publice的区别在于,protected的访问限制,使其不能被基类的对象访问. -----------------------------------------------------第一:private, public, protected 访问标号的访问范围.private:只能由1.该类中的函数.2.其友元函数访问.不

C#中的public protected internal private

1.常见的四种方位修饰符关系下图中的protected internal是并集的关系,意思是在命名空间内是internal的,在命名空间外是protected的 2.sealed final sealed 修饰符可以应用于类.实例.方法和属性.这个是C#中用的 用于类时,该类被称为密封类,密封类不能被继承: 用于方法时,该方法被称为密封方法,密封方法会重写基类中的方法:sealed修饰符应用于方法或属性时,必须始终与override一起使用: 结构是隐式密封的,因此它们不能被继承. final修