参考链接:

学习完c++但是对c++面向对象编程还是比较模糊,现在花时间总体来总结一下:

c++中的对象是使用类来定义的,下面先重点讲一下类的概念。

说到类就要先说一下类的三种特性:封装,继承,多态。

封装性:事物的封闭性。

作用:

它防止函数直接访问类类型的内部成员,他是通过类主体内部对各个区域标记 public、private、protected 来指定的。

一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。成员和类的默认访问修饰符是 private。

public:公有成员

在程序中类的外部是可访问的。例如:

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Line
  6. {
  7. public:
  8. double length;
  9. void setLength( double len );
  10. double getLength( void );
  11. };
  12.  
  13. // 成员函数定义
  14. double Line::getLength(void)
  15. {
  16. return length ;
  17. }
  18.  
  19. void Line::setLength( double len )
  20. {
  21. length = len;
  22. }
  23.  
  24. // 程序的主函数
  25. int main( )
  26. {
  27. Line line;
  28.  
  29. // 设置长度
  30. line.setLength(6.0);
  31. cout << "Length of line : " << line.getLength() <<endl;
  32.  
  33. // 不使用成员函数设置长度
  34. line.length = 10.0; // OK: 因为 length 是公有的
  35. cout << "Length of line : " << line.length <<endl;
  36. return ;
  37. }

私有成员:private

成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。默认情况下,类的所有成员都是私有的。struct中默认是公有的。

  1. //代码中width就是私有的
  2. class Box
  3. {
  4. double width;
  5. public:
  6. double length;
  7. void setWidth( double wid );
  8. double getWidth( void );
  9. };

一般在私有区域定义数据,公有区域定义函数,方便在类外也可以调用这些函数。

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Box
  6. {
  7. public:
  8. double length;
  9. void setWidth( double wid );
  10. double getWidth( void );
  11.  
  12. private:
  13. double width;
  14. };
  15.  
  16. // 成员函数定义
  17. double Box::getWidth(void)
  18. {
  19. return width ;
  20. }
  21.  
  22. void Box::setWidth( double wid )
  23. {
  24. width = wid;
  25. }
  26.  
  27. // 程序的主函数
  28. int main( )
  29. {
  30. Box box;
  31.  
  32. // 不使用成员函数设置长度
  33. box.length = 10.0; // OK: 因为 length 是公有的
  34. cout << "Length of box : " << box.length <<endl;
  35.  
  36. // 不使用成员函数设置宽度
  37. // box.width = 10.0; // Error: 因为 width 是私有的
  38. box.setWidth(10.0); // 使用成员函数设置宽度
  39. cout << "Width of box : " << box.getWidth() <<endl;
  40.  
  41. return ;
  42. }

保护成员:protected

保护成员变量或函数与私有成员十分相似,但有一点不同,保护成员在派生类(即子类)中是可访问的。

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Box
  5. {
  6. protected:
  7. double width;
  8. };
  9.  
  10. class SmallBox:Box // SmallBox 是派生类
  11. {
  12. public:
  13. void setSmallWidth( double wid );
  14. double getSmallWidth( void );
  15. };
  16.  
  17. // 子类的成员函数
  18. double SmallBox::getSmallWidth(void)
  19. {
  20. return width ;
  21. }
  22.  
  23. void SmallBox::setSmallWidth( double wid )
  24. {
  25. width = wid;
  26. }
  27.  
  28. // 程序的主函数
  29. int main( )
  30. {
  31. SmallBox box;
  32.  
  33. // 使用成员函数设置宽度
  34. box.setSmallWidth(5.0);
  35. cout << "Width of box : "<< box.getSmallWidth() << endl;
  36.  
  37. return ;
  38. }

友元函数将封装性打破了,使用要慎重。

继承中的特点

有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 成员可以被派生类访问。

01 浅谈c++及面向对象编程的更多相关文章

  1. 浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC

    1.函数式编程作为结构化编程的一种,正在受到越来越多的重视.那么什么事函数式编程呢? 在维基百科中给出了详细的定义,函数式编程又称泛函数编程,是一种编程规范,它将函数运算视为数学上的函数计算.简单的来 ...

  2. 浅谈JavaScript的面向对象和它的封装、继承、多态

    写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...

  3. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  4. 浅谈C#关于AOP编程的学习总结

    难得在这样一个节日里给写出一篇博客,却没有佳人相约,没办法,这就是一个程(dan)序(shen)猿(gou)的真实生活情景,每天除了coding还是coding.唉..污染各位看官的眼了.好吧,进入正 ...

  5. 新手浅谈C#Task异步编程

    Task是微软在.net framework 4.0发布的新的异步编程的利器,当然4.5新增了async.await,这儿我们先说Task相关. 在实际编程中,我们用的较多的是Task.Task.Fa ...

  6. 浅谈JavaScript的面向对象程序设计(一)

    面向对象的语言有一个标志,他们都有类的概念,通过类可以创建多个具有相同属性和方法的对象.但是JavaScript中没有类的概念,因此JavaScript与其他的面向对象语言还是有一定区别的.JavaS ...

  7. 浅谈JavaScript的面向对象程序设计(四)

    本文继续讲解JavaScript的面向对象程序设计.继承是面向对象语言中的一个基本概念,面向对象语言支持两种继承实现方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.但是在 ...

  8. 浅谈JavaScript的面向对象程序设计(三)

    前面已经对JavaScript的面向对象程序设计作了简单的介绍,包括了对象的属性.对象的工厂模式.构造函数和原型等.通过介绍,这些创建对象的方法依然有不少优化和改进的地方. 组合使用构造函数模式和原型 ...

  9. 浅谈javascript的面向对象思想

    面向对象的三大基本特性 封装(把相关的信息(无论数据或方法)存储在对象中的能力) 继承(由另一个类(或多个类)得来类的属性和方法的能力) 多态(一个对象在不同情况下的多种形态) 定义类或对象 第一种: ...

随机推荐

  1. 给通过canvas生成的二维码添加logo

    以jquery.qrcode为例来说, 生成二维码代码: 依赖jquery.js, jquery.qrcode.js //计算宽,高,中心坐标,logo大小 var width = 256,heigh ...

  2. [转帖]熬夜变傻有科学依据,人类睡觉时会被“洗脑”,科学家首次拍下全程 | Science

    熬夜变傻有科学依据,人类睡觉时会被“洗脑”,科学家首次拍下全程 | Science https://mp.weixin.qq.com/s/hJeJjh0GSUclcoh3Z6mySQ 关注前沿科技 量 ...

  3. [IOT] - Raspberry Pi 3B + Windows 10 IOT Core + .Net Core Web 部署

    硬件:Raspberry Pi 3B 系统:Windows 10 IOT Core 应用:.Net Core Web 部署流程 1. 系统安装 1.1 下载并安装 Windows 10 IoT Cor ...

  4. 解决Jupyter notebook安装后不自动跳转网页的方法

    在安装完Jupyter notebook后,有童鞋说出现了各种不友好的问题,鉴于此情况,个人先随手写出以下三种情况,并给出解决方法: 题外建议:请使用谷歌浏览器为默认浏览器 一.对于弹不出浏览器的解决 ...

  5. Django组件之cookie、session

    一.cookie 1.1 产生背景 HTTP协议是无状态的,对服务器来说,每次的请求都是独立的.状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留.会话中产生的数据 ...

  6. Linux下使用ip netns命令进行网口的隔离和配置ip地址

    1. 添加隔离标记符: ip netns add fd 2. 将指定网卡放入隔离中: ip link set eth1 netns fd 3. 在隔离环境下执行命令: ip netns exec fd ...

  7. 【SQL Server数据迁移】64位的机器:SQL Server中查询ORACLE的数据

    从SQL Server中查询ORACLE中的数据,可以在SQL Server中创建到ORACLE的链接服务器来实现的,但是根据32位 .64位的机器和软件, 需要用不同的驱动程序来实现. 在64位的机 ...

  8. React 了解学习

    1.nodejs安装程序https://nodejs.org/en/download/ create-react-app 类似 vs2017开发工具,集成了webpack 打包发布,loader和默认 ...

  9. java之hibernate之双向的多对一关联映射

    这篇讲解 双向的多对一关联映射 1.表结构和多对一时,一致 2.类结构 Book.java public class Book implements Serializable{ private int ...

  10. WebApi接收接收日期格式参数时,日期类型(2019-10-08T16:00:00.000Z)后台接收时间少8小时问题

    前端使用的是elementui的日期控件,将日期格式的数据提交到webapi后台时,接收到的日期格式少了8小时,这个原因是由于时区引起的,应该在WebApiConfig进行配置转成本地时间,解决少8小 ...