面向对象程序设计(2)可见性、封装、继承、友元

举报
用户已注销 发表于 2021/11/19 04:17:58 2021/11/19
【摘要】 目录 1,可见性 2,面向对象三大特性 3,继承 4,派生类的构造函数和析构函数 5,友元函数和友元类 1,可见性 可见性关键字用来修饰成员(成员变量和成员函数)的可见性,默认是private public是公开的,所有地方都可以访问,private是私有的,只有自己可以访问。 派生类会继承基类的public成员,但...

目录

1,可见性

2,面向对象三大特性

3,继承

4,派生类的构造函数和析构函数

5,友元函数和友元类


1,可见性

可见性关键字用来修饰成员(成员变量和成员函数)的可见性,默认是private

public是公开的,所有地方都可以访问,private是私有的,只有自己可以访问。

派生类会继承基类的public成员,但不继承private成员。

基类的成员如果用protected修饰,那么派生类就可以继承,别的地方不能访问。

示例:


  
  1. #include<iostream>
  2. using namespace std;
  3. class B
  4. {
  5. public:
  6. int i;
  7. B()
  8. {
  9. i = 1, j = 2, k = 3;
  10. }
  11. friend void display2();
  12. protected:
  13. int j;
  14. private:
  15. int k;
  16. };
  17. class A :public B
  18. {
  19. public:
  20. void display()
  21. {
  22. cout << i << endl;
  23. cout << j << endl;
  24. //cout << k << endl; //不能访问
  25. }
  26. };
  27. void display2()
  28. {
  29. A a;
  30. cout << a.i << endl;
  31. cout << a.j << endl;
  32. cout << a.k << endl;
  33. }
  34. int main()
  35. {
  36. A a;
  37. a.display();
  38. cout << a.i << endl;
  39. //cout << a.j << endl; //不能访问
  40. //cout << a.k << endl; //不能访问
  41. display2();
  42. return 0;
  43. }

输出结果:

1
2
1
1
2
3

2,面向对象三大特性

封装,继承,多态

抽象就是将类的实现和使用分离开来。
封装就是类的使用不需要了解实现的细节。

3,继承

三种继承方式:

基类成员权限 public继承 private继承 protected继承
public public private protected
private / / /
protected protected private protected

public继承:子类可以访问父类的public成员和protected成员,继承后的属性不变

private继承:子类不能访问父类任何成员

projected继承:子类可以访问父类的public成员和protected成员,继承后的属性都是protected

默认是private继承。


  
  1. class A: B{
  2. }
  3. class A: private B{
  4. }
  5. class A: public B{
  6. }

4,派生类的构造函数和析构函数

派生类并不继承基类的构造函数,而是在自己的构造函数中调用基类的构造函数来初始化基类的数据域。

派生类的构造函数中如果没有显式调用基类的构造函数,就会调用基类的无实参构造函数。

如果要把一个类设计为拓展类,最好设计一个无实参的构造函数,以避免编程错误。

只能在类的实现中调用基类的构造函数,而不能在类的声明中调用。

同样,派生类更不可能继承基类的析构函数。

构造函数链:派生类的构造函数先调用基类的构造函数,再初始化其他成员

析构函数链:派生类的析构函数先释放其他成员,再调用基类的析构函数

示例:


  
  1. #include<iostream>
  2. using namespace std;
  3. class Person
  4. {
  5. public:
  6. Person()
  7. {
  8. cout << "Person构造函数" << endl;
  9. }
  10. ~Person()
  11. {
  12. cout << "Person析构函数" << endl;
  13. }
  14. };
  15. class Employee:public Person
  16. {
  17. public:
  18. Employee()
  19. {
  20. cout << "Employee构造函数" << endl;
  21. }
  22. ~Employee()
  23. {
  24. cout << "Employee析构函数" << endl;
  25. }
  26. };
  27. class Fac :public Employee
  28. {
  29. public:
  30. Fac()
  31. {
  32. cout << "Fac构造函数" << endl;
  33. }
  34. ~Fac()
  35. {
  36. cout << "Fac析构函数" << endl;
  37. }
  38. };
  39. int main()
  40. {
  41. Fac fac;
  42. return 0;
  43. }

结果:

Person构造函数
Employee构造函数
Fac构造函数
Fac析构函数
Employee析构函数
Person析构函数

5,友元函数和友元类

一个类中,friend关键字可以声明友元函数和友元类,被声明为友元的可以访问这个类的私有成员

(1)友元函数


  
  1. #include <iostream>
  2. using namespace std;
  3. class MyClass
  4. {
  5. int x,y;
  6. friend int f();
  7. MyClass()
  8. {
  9. x=1,y=2;
  10. }
  11. };
  12. int f()
  13. {
  14. MyClass s;
  15. cout<<s.x;
  16. }
  17. int main() {
  18. f();
  19. return 0;
  20. }

(2)友元类


  
  1. #include <iostream>
  2. using namespace std;
  3. class A;
  4. class MyClass
  5. {
  6. int x,y;
  7. friend A;
  8. MyClass()
  9. {
  10. x=1,y=2;
  11. }
  12. };
  13. class A{
  14. public:
  15. int f()
  16. {
  17. MyClass s;
  18. cout<<s.x;
  19. }
  20. };
  21. int main() {
  22. A a;
  23. a.f();
  24. return 0;
  25. }

 

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/104526879

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。