C++深度解析教程学习笔记(5)面向对象
1. 面向对象基本概念
(1)面向对象的意义在于
①将日常生活中习惯的思维方式引入程序设计中
②将需求中的概念直观的映射到解决方案中
③以模块为中心构建可复用的软件系统
④提高软件产品的可维护性和可扩展性
(2)类和对象是面向对象中的两个基本概念
|
类 |
对象 |
|
|
概念 |
指的是一类事物,是一个抽象的概念 |
指的是属于某个类的具体实例 |
|
关系 |
类是一种模型,这种模型可以创建出不同的对象。一个类可以有很多对象。 |
对象实体是类模型的一个具体实例。一个对象必然属于某个类 |
|
意义 |
类用于抽象的描述一类事物所特有的属性和行为。如电脑拥有CPU、内存和硬盘,并县城可以开机和运行程序 |
对象是具体的事物,拥用所属类中描述的一切属性和行为。如每一只老虎都有不同的体重、不同的食量和不同的性情。 |
2.类之间的基本关系
(1)继承

①从已存在类细分出来的类和原类之间具有继承关系(is-a)
②继承的类(子类)拥有原类(父类)的所有属性和行为
(2)组合

①一些类的存在必须依赖于其它的类,这种关系叫组合
②组合的类在某一个局部上由其它的类组成
3.类的表示法

#include <stdio.h> struct Biology
{
bool living;
}; struct Animal : Biology
{
bool movable;
void findFood(){};
}; struct Plant : Biology
{
bool growable;
}; struct Beast : Animal
{
void sleep(){};
}; struct Human : Animal
{
void sleep(){};
void work(){};
}; int main()
{
return ;
}
4.类的封装
4.1.封装的基本概念
(1)类通常分为两个部分:类的实现细节、类的使用方式。当使用类时,不需要关心其实现细节。当创建类时,才需要考虑其内部实现细节
我们在创建类的时候,要将复杂的细节封装在内部,不让使用者知道,给使用者一些非常简单的接口就可以。

(2)根据经验,并不是类的每个属性都是对外公开的,但一些属性是对外公开的。
(3)必须在类的表示法中定义属性和行为的公开级别
4.2. C++中类的封装
(1)成员变量:C++中用于表示类属性的变量
(2)成员函数:C++中用于表示类行为的函数
(3)C++中可以给成员变量和成员函数定义访问级别(如 public、private 等)
#include <stdio.h> struct Biology
{
bool living;
}; struct Animal : Biology
{
bool movable;
void findFood() {};
}; struct Plant : Biology
{
bool growable;
}; struct Beast : Animal
{
void sleep() {};
}; struct Human : Animal
{
void sleep() {};
void work() {};
}; struct Girl : Human
{
private:
int age;
int weight; public:
void print()
{
age = ;
weight = ; printf("I'm a girl, I'm %d years old.\n", age);
printf("My weigth is %d kg.\n", weight);
};
}; struct Boy : Human
{
private:
int height;
int salary; public:
int age;
int weight; void print()
{
height = ;
salary = ; printf("I'm a boy, my height is %d cm.\n", height);
printf("My salary is %d RMB.\n", salary);
};
}; int main()
{ Girl g;
Boy b; g.print(); b.age = ;
b.weight = ;
//b.height = 180;//Error: private b.print(); return ;
}
4.3. 类成员的作用域
(1)类成员的作用域只在类的内部,外部无法直接访问
(2)成员函数可以直接访问成员变量和调用成员函数
(3)类的外部可以通过类变量访问 public 成员
(4)类成员的作用域与访问级别没有关系。(注意 C++中用 struct 定义的类中所有成员默认为 public,而 class 定义的类成员的默认属性为 private)
类成员的作用域
#include <stdio.h> int i = ; struct Test
{
private:
int i; public:
int j; int getI()
{
i = ; return i;
}
}; int main()
{
int i = ; Test test; test.j = ; printf("main: i = %d\n", i); //i = 2;
printf("::i = %d\n",::i); //::i = 1;
//printf("test.i = %d\n", test.i); //Error
printf("test.j = %d\n", test.j); //test.j = 4
printf("test.getI() = %d\n", test.getI()); //test.getI() = 3 return ;
}
类通常可分为使用方式和内部细节两部分,类的封装机制使得使用方式和内部细节相分离,C++中通过定义类成员的访问级别实现封装机制,public 成员可在类的内部和外界访问和调用,private 成员只能在类的内部被访问和调用。
5.类的关键字
(1)struct 在 C 语言中己经有了自己的含义,必须继续兼容
(2)在 C++中提供了新的关键字 class 用于类定义
(3)class 和 struct 的用法完全相同。但 C++中用 struct 定义的类中所有成员默认访问级别为 public,而 class 定义的类成员的默认访问级别为 private
#include <stdio.h> struct A
{
//默认访问级别为public
int i;
int getI(){return i;};
}; class B
{
//默认访问级别为private
int i;
int getI(){return i;};
};
int main()
{
A a;
B b; a.i = ;//ok
printf("a.getI() = %d\n", a.getI()); //b.i = 4; //Error: private
//printf("b.getI() = %d\n", b.getI()); //Error: private return ;
}
开发一个用于四则运算的类
//operator.h
#ifndef _OPERATOR_H_
#define _OPERATOR_H_ class Operator
{
private:
char mOp; //操作符
double mP1; //操作数1
double mP2; //操作数2 public:
bool setOperator(char op);
void setParameter(double p1, double p2);
bool result(double& r);
}; #endif
//operator.cpp
#include "operator.h" bool Operator::setOperator(char op)
{
bool bRet = (op == '+') || (op == '-') || (op == '*') || (op == '/'); if (bRet)
{
mOp = op;
}
else
{
mOp = '\0';
} return bRet;
} void Operator::setParameter(double p1, double p2)
{
mP1 = p1;
mP2 = p2;
} bool Operator::result(double& r)
{
bool bRet = true; switch (mOp)
{
case '/':
if ((-0.000000001<mP2) && (mP2 <0.000000001))
{
bRet = false;
}
else
{
r = mP1 / mP2;
}
break; case '+':
r = mP1 + mP2;
break; case '-':
r = mP1 - mP2;
break; case '*':
r = mP1 * mP2;
break;
} return bRet;
}
//main.cpp
#include <stdio.h>
#include "operator.h" int main()
{
Operator op;
double r = ; op.setOperator('/');
op.setParameter(, ); if (op.result(r))
{
printf("r = %lf\n", r);
}
else
{
printf("Calculate error!\n");
} return ;
}
6.类声明和实现的分离
(1).h 头文件只用类的声明:成员变量和成员函数
(2).cpp 源文件中完成类的其它实现(如成员函数的实现)
C++深度解析教程学习笔记(5)面向对象的更多相关文章
- C++深度解析教程学习笔记(6)对象的构造和销毁
1. 对象的初始化 (1)从程序设计的角度看,对象只是变量,因此: ①在栈上创建对象时,成员变量初始化为随机值 ②在堆上创建对象时,成员变量初始化为随机值 ③在静态存储区创建对象时,成员变量初始化为 ...
- C++深度解析教程学习笔记(4)C++中的新成员
1. 动态内存分配 (1)C++通过 new 关键字进行动态内存申请,是以类型为单位来申请空间大小的 (2)delete 关键字用于内存释放 ▲注意释放数组时要加[],否则只释放这个数组中的第 1 个 ...
- C++深度解析教程学习笔记(3)函数的扩展
1.内联函数 1.1.常量与宏的回顾 (1)C++中的 const 常量可以替代宏常数定义,如: ; //等价于 #define A 3 (2)C++中是否有解决方案,可以用来替代宏代码片段呢? 1. ...
- C++深度解析教程学习笔记(2)C++中的引用
1.C++中的引用 (1)变量名的回顾 ①变量是一段实际连续存储空间的别名,程序中通过变量来申请并命名存储空间 ②通过变量的名字可以使用存储空间.(变量的名字就是变量的值,&变量名是取地址操作 ...
- C++深度解析教程学习笔记(1)C到C++的升级
1.现代软件产品架构图 比如商场收银系统 2.C 到 C++ 的升级 2.1变量的定义 C++中所有的变量都可以在需要使用时再定义,而 C 语言中的变量都必须在作用域开始位置定义. 2.2 regis ...
- 《Spring源码深度解析》学习笔记——Spring的整体架构与容器的基本实现
pring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,如下图所示 这些模块被总结为以下几个部分: Core Container Core Container(核心容器)包含有C ...
- Webpack新手入门教程(学习笔记)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...
- 尚硅谷韩顺平Linux教程学习笔记
目录 尚硅谷韩顺平Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 定时任务调度 ...
- jfinal框架教程-学习笔记
jfinal框架教程-学习笔记 JFinal 是基于 Java 语言的极速 WEB + ORM 开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restfu ...
随机推荐
- Django restfull规范
一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...
- HAWQ取代传统数仓实践(十三)——事实表技术之周期快照
一.周期快照简介 周期快照事实表中的每行汇总了发生在某一标准周期,如一天.一周或一月的多个度量.其粒度是周期性的时间段,而不是单个事务.周期快照事实表通常包含许多数据的总计,因为任何与事实表时间范围一 ...
- C++之指针使用
C++指针使用的好坏直接反映了编程人员水平的高低,下面从指针和数组的区别.指针参数是如何传递内存.野指针.malloc/free.new/delete和内存耗尽怎么办方面进行总结. 一 指针和数组对比 ...
- 后台导入导出Excel
Excel导出 定义数据模型 参考财付通的批量提现Excel的格式,定义模型如下 private int recordId; //提现id private String cname; //提现人名称 ...
- .Net Remoting编程 ---- 系列文章
.Net Remoting(应用程序域) - Part.1 摘要: 本文是.Net Remoting系列的第一篇文章,讲述了Remoting的“前驱知识点”--应用程序域.传值封送(Marshal b ...
- Java开发前期准备工作
配置Java开发环境变量 在"系统变量"中设置3项属性,JAVA_HOME, PATH, CLASSPATH. 变量设置参数如下: 变量名:JAVA_HOME 变量值:C:\Pro ...
- Des加解密(Java端和Js端配套)解析
一.什么是DES加密 des对称加密,对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码( ...
- FastAdmin 出现慢的问题 (DB host)
FastAdmin 出现慢的问题 用户反馈断网后 FastAdmin 后台变慢. 而且是很多同事出现一样的现象. 查看了 runtime / log 里的日志,发现 DB 时间超过 20s. 经过群里 ...
- Aix之 xmanager 2.0连接AIX服务器
xmanager连接AIX服务器可以分为两种情况:1.连接IBM服务器,使用远程桌面功能进行系统维护.要求这台服务器已经安装了图形桌面,如CDE等,并启动到图形界面.在xmanager中的Xbrows ...
- Maven项目合并
当多个项目之间有关联.依赖jar包有重复时,可以考虑进行合并.举例,我一开始有一个test-pilling项目,pom文件如下: <project xmlns="http://mave ...