先来看看本节知识的结构图吧!

接下来我们就逐步来看一下所有的知识点:

结构的演化

C++中的类是从结构演变而来的, 所以我们可以称C++为”带类的C”.

结构发生质的演变

C++结构中可以定义函数, 称之为成员函数

结构定义格式, 像这样:

struct 结构名 {

数据成员;

成员函数;

}; // 注意这里的分号不要忘记

具体的代码, 像这样:

模型图是这样的:

它表明: 我定义了一个结构体, 有两个私有的数据成员x, y, 两个公有的成员函数setXY(double, x, double y), display();

在定义结构体时, 将数据成员使用private关键字修饰, 则产生封装性. 如果没有没定, 则默认为public

private修饰的数据成员为私有的数据成员, 必须公有的成员函数才能使用, 这就是数据的封装性.

使用方式: 结构对象.成员函数

我们在main函数中这样使用:

注意:

如果结构的数据成员用private关键字修饰

则不能这么访问:

cout << pointA.x << endl; count << pointA.y << endl;

如果public修饰, 则可以这么访问.

不过我们一般为了保证封装性, 将数据成员声明为private, 保证只有成员函数才能访问。

使用构造函数初始化结构对象

函数名与结构同名, 称为构造函数, 专门用于初始化结构对象

分为有参构造函数和无参构造函数

像这样:

模型图是这样的:

它表明: 我定义了一个结构体, 有两个私有的数据成员x, y, 一个无参构造函数Point(), 一个有参构造函数Point(double x, double y), 两个普通的成员函数setXY(double, x, double y), display();

从结构演变成一个简单的类

使用关键字class代替stuct, 就将一个结构演变成一个标准的类啦! 是不是So easy!

像这样:

好的, 从现在开始把我们的目光从struct移开吧, 让我们聚焦于class!

面向过程与面向对象

编程语言是我们和计算机交流的桥梁, 编程技术在发展, 同样的编程语言也在发展, 编程语言从最初的0和1, 到汇编语言, 再到面向过程的语言, 再到面向对象的语言, 反应出了我们的编程思想也在不断的进步, 面向过程只是关注解决问题的步骤, 而面向对象关注解决问题的对象, 也就是谁解决这个问题.

下面我用两个经典的例子来诠释面向过程和面向对象的区别

第一个: 五子棋游戏

面向过程是这样的:

(1)开始游戏 -> (2)黑子下棋 -> (3)绘制画面 -> (4)判断输赢 -> (5)白子下棋 -> (6)绘制画面 -> (7)判断输赢 -> (8)返回步骤(2)

面向对象是这样的:

黑白双方, 负责下棋这个操作

棋盘系统, 负责绘制画面

规则系统, 负责判断是否犯规, 输赢等

第二个: 把大象装进冰箱

面向过程是这样的:

(1)把冰箱门打开 -> (2)把大象装进去 -> (3)把冰箱门关上

面向对象是这样的:

冰箱 -> 开门

冰箱 -> 装大象

冰箱 -> 关门

冰箱是一个对象, 它有开门的操作, 装大象的操作, 关门的操作, 大象也是一个对象

总结

面向过程就是关注解决问题的步骤, 像这样: 第一步打开冰箱门, 第二步装大象, 第三步关闭冰箱门

面向对象就是关注解决问题的对象, 像冰箱, 它有开门的方法, 装大象的方法, 关门的方法

大家知道基本的区别和联系就可以啦。

面向对象程序设计的特点

面向对象的程序设计具有抽象, 封装, 继承和多态性的特点

对象

对象是系统描述客观事物的一个实体, 是构成系统的基本单位

对象用对象名, 属性(数据成员), 操作(功能函数)三要素来描述

对象名: 用来标识一个具体的对象. 如: zhangsan, lisi等

属性: 这个对象的数据成员, 也就是特征, 如: 姓名, 年龄, 性别等

操作: 这个对象所具有的行为, 如: 吃饭, 睡觉, 打豆豆等

像这样:

我们有一个对象

对象名: zhangsan

数据成员: 姓名叫张三, 年龄18岁

成员函数: 会吃饭, 能睡觉, 还喜欢打豆豆

抽象和类

比如我们还有一个学生对象叫李四

我们现在有两个学生对象一个叫张三, 年龄18, 一个叫李四, 年龄20, 比如我们还有一个学生对象叫王五, 年龄22, 假如我们还有好多个学生.

都有姓名, 年龄的基本属性, 也有吃饭, 睡觉, 打豆豆的行为,

我们把这些对象的共同特征进一步抽象出来, 就形成了类的概念

像这样:

这是一个类

类名: Student

数据成员: name, age

成员函数: eat(), sleep(), dadoudou()

我们用代码表示是这样的:

类和对象的关系

类相当于模具

对象相当于用模具所制造出来的东西

类是具有相同的属性和操作的一组对象的集合

对象是这些集合当中的一个个体

这样理解:

李四是一个学生 // 正确, 因为李四是对象, 而学生是类

学生就是李四 // 错误, 学生是一个群体, 怎么可能是单个个体呢

封装

一个经典的例子来加深我们的理解吧!

电视机把各种部件都装在机箱里, 遥控器的所有部件也都装在遥控器里, 我们通过遥控器操作电视机, 而不是我们自己摆弄电视机的各个组件! 比如音量+, 音量-, 而不是咱们去电视机里摆弄线圈!

封装性就是要求一个对象应该具备明确的功能, 并具有接口以便和其它对象相互作用, 对象内部的数据和代码是受保护的, 外界不能访问它们, 只能对象对外提供的接口可以访问它们. 增加独立, 自己的数据只能由自己来操作.

类的封装是通过定义的存取权限实现的, 分为private和public, 对象的外部只能访问对象的公有部分, 也就是public修饰的, 不能访问对象的私有部分, 也就是private修饰的.

继承

继承是一个类可以获得另一个类的特性的机制

像这样:

比如我们有”人”这个类, 它具有姓名, 年龄这两个属性, 吃饭这个行为

我们又有”老师”这个类, 继承自”人”类, 所以它有继承过来的"姓名", "年龄"属性, 还有自己所独有的"职工编号"属性, 有继承过来的"吃饭"行为, 还有自己所独有的"讲课"行为.

我们又有”学生”这个类, 继承自”人”类, 所以它有继承过来的"姓名", "年龄"属性, 还有自己所独有的"学号"属性, 有继承过来的"吃饭"行为, 还有自己所独有的"听课"行为.

总结:子类只需定义它所特有的特征, 而共享父类的特征

多态性

不同的对象可以调用相同名称的函数, 但可导致完全不同的行为的现象称为多态性.

在C++中, 多态性分为两种, 一种称为编译时多态, 另一种为运行时多态

编译时多态:也就是函数重载. 是指同一个函数名可以对应着多个函数的实现, 具体调用哪个函数由参数个数, 参数类型等来决定

运行时多态:也就是虚函数. 在定义了虚函数后, 可以在基类的派生类中对虚函数重新定义, 以实现所想要的功能

使用类和对象

使用string对象

必须包含该类的头文件, #include

像这样:String str = “RayLee”; // 等价于 String str(“RayLee”);

在字符串的末尾系统会加上’’\0”字符来表示字符串的结束, 但是在计算字符串长度的时候不包含'\0'

像这样:

String str2 = ‘A’; // 错误, str2是字符串对象, 不能赋值为字符

我们可以把字符串看成是字符数组

所以我们可以这么使用:

//字符串对象

string str = "RayLee";//输出字符串中的每个字符, 其中size()为string对象的成员函数, 返回字符串长度

for (int i = 0; i < str.size(); i++) {

cout<< str[i] <

}

字符串连接符号 +

作用: 将两个字符串或者字符串与字符拼接起来

像这样:

//两个字符串拼接

string str = "RayLee";string str2 = "is a student!";string str3 = str +str2;

cout<< str3 <

str3 = str + '!';

cout<< str3 <

str3 = 'a' + '?'; //错误, 这样的话就不是拼接了, 就是加法运算啦

使用string类的典型成员函数

string str = "Hello, World!";

cout<< str <

unsigned long size =str.size();

cout<< "字符串长度:" << size <

unsigned long result = str.find("lll");if (result >=size) {

cout<< "没有查找到该字符串" <

}else{

cout<< "字符串起始位置为:" << result <

}//substr(起始位置, 截取长度)函数: 给定字符串的子串

string subStr = str.substr(2, 8);

cout<< "截取的字符串:" << subStr <

stringinputStr;

getline(cin, inputStr,'\n');

cout<< inputStr <

string str1 = "I am a student!";string str2 = "You are a teacher!";

cout<< "交换前:" << str1 << " " << str2 <

str1.swap(str2);

cout<< "交换后:" << str1 << " " << str2 << endl;

面向过程和面向对象不是对立的, 面向对象是建立在面向过程的基础上的, 它们是相互依存的, 面向过程关注于解决问题的步骤, 而面向对象关注于解决问题中出现的对象, 而对象中则封装了解决问题的步骤, 面向对象是更高级的语言, 但它是依赖于面向过程而存在的, 随着计算机科学与技术的发展, 出现更高级的语言也说不定呢?

自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!

C语言C++编程学习交流圈子,【点击进入】微信公众号:C语言编程学习基地

有一些源码和资料分享,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自己琢磨更快哦!

c语言有参构造函数和无参构,C/C++编程笔记:C++入门知识丨从结构到类的演变相关推荐

  1. 有参构造函数和无参构造函数

    有参构造函数是默认不生成对象的. 无参构造函数默认是会生成一个对象的. 作用: new一个对象的时候要用到构造函数,例如Hello hello = new Hello();这时调用的是Hello的无参 ...

  2. c/c++教程 - 2.4.2.1~2 对象的初始化和清理,构造函数和析构函数,构造函数的分类和调用(有参构造,无参构造,普通构造,拷贝构造,括号法,显示法,隐式转换法,匿名对象)

    目录 4.2 对象的初始化和清理 4.2.1 构造函数和析构函数 4.2.2 构造函数的分类及调用 相关教程 4.2 对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候 ...

  3. c++的构造函数极其调用(无参构造函数,有参构造函数,拷贝构造函数)

    1.c++编译器会自动调用构造函数 //构造函数(与类名相同) //析构函数:没有参数也没有任何返回类型,被自动调用 #include<iostream> using namespace ...

  4. Java有参构造方法和无参构造方法

    Java有参构造方法和无参构造方法 1**.定义:** 编写一个类时没有添加无参构造方法,那么编译器会自动添加无参构造方法:(如果自己添加构造函数,无论有参数或是没参数,默认构造函数都将无效) 编写时 ...

  5. 有参构造法和无参构造法

    有参构造法和无参构造法 为什么需要构造方法? 1.通过一个一个初始化成员变量非常麻烦 Java设计了构造方法 快捷键为alt + shift + s 再按 O 构造方法的格式: [访问权限修饰符] 方 ...

  6. java构造方法:有参构造方法和无参构造方法区别

    java构造方法:有参构造方法和无参构造方法 一.无参构造方法 1.定义: 如果编写一个javaBean时没有添加无参构造方法,那么编译器会自动添加无参构造方法: 但是如果编写时添加了有参构造方法而未 ...

  7. 为什么要有无参构造方法,无参构造的运行原理

    本文参考链接:https://blog.csdn.net/Akanarika520/article/details/84927403 无参构造器也叫无参构造方法,在我们创建类时候,可以不用写构造方法, ...

  8. java无参构造赋值怎么没用_Java有参构造方法和无参构造方法详解

    一:有参数构造方法 在之前我们要为一个对象赋值,先要创建好对象之后然后"对象名.属性名"或者调用属性的setter为属性赋值.但是在很多时候觉得这样做很麻烦,最好的做法是在创建对象 ...

  9. Java有参构造和无参构造

    ⭕️前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家(点击跳转到网站)⭕️ 类与对象的创建 图片左侧代码 package oop.demo02; //学生类(一个类里面 ...

最新文章

  1. python可以做测试软件吗_Python如何给你的程序做性能测试
  2. 禁用java rmi_java-如何安全关闭rmi客户端?
  3. AngularJS鼠标进入划出事件
  4. StringUtils工具类的常用方法
  5. android如何根据机顶盒区分用户,Android 上手机跟机顶盒应用开发的区别
  6. MyEclipse中jsp编码设置
  7. Spring的AOP理解
  8. 语音识别的应用都有哪些
  9. Android中AppCompat简介
  10. 语法分析:自上而下分析
  11. 3D优化之ShadowGun系列一:旗子飘扬效果实现方法及shader注解
  12. 编写TaskMgr.exe的时候学习的知识点
  13. Stratified Sampling(分层采样)
  14. 奇谈 2020.11.24日记
  15. 计算机导论课后总结三
  16. 微信小程序-店内点餐小程序
  17. @Autowired作用在方法上
  18. python爬取qq电话_用Python爬取整个学院MM的电话和QQ,爬虫这也太霸道了!
  19. 比“5G有多快”更重要的,是5G将带来哪些改变
  20. 高效程序猿的狂暴之路

热门文章

  1. GitLab修改群组信息
  2. android 5.0 note4,三星Note4用户手册更新:安卓5.0有何新变
  3. 究极缝合怪 | Pulsar核心概念和特性解读
  4. Spring循环依赖图解
  5. C++ constexpr 常量表达式
  6. React阻止冒泡失效解决办法
  7. Javascript 两个对象数组 根据相同的id进行合并
  8. 说说 JavaScript 对浏览器的怪癖检测
  9. 2020牛客多校E- Groundhog Chasing Death
  10. 泰达机器人董事长_【百佳专访】深圳泰达董事长陈大立:“沉迷”研发喷涂自动化中国方案的“匠人”...