C++面向对象的三大特性:封装、继承、多态

C++认为万事万物皆为对象,对象上有其属性和行为

封装

意义:1、将属性和行为作为一个整体,表现生活中的事物

     语法: class 类名{   访问权限:属性   /     行为    };

实例:设计一个圆类,求圆的周长

#include<iostream>
#include<string>
using namespace std; //设计一个圆类,求圆的周长
//圆周长公式:2 * pai * 半径 const double pai = 3.14; //圆周率 //class设计一个类,类后面紧跟着的就是类名称
class Circle
{
public: //访问权限 公共权限
int m_r; //属性 半径
double calculateZC() //行为 获取圆的周长
{
return 2 * pai * m_r; //返回圆的周长
}
}; int main()
{
//实例化:通过一个类 创建一个对象的过程
Circle c1; //通过圆类 创建具体的圆(对象)
c1.m_r = 10; //给圆 对象 的 属性 赋值 cout << "圆的周长为:" << c1.calculateZC() << endl; system("pause");
return 0;
}

实例2:创建一个学生类,属性为学号和姓名,可以给姓名学号赋值,可以显示学生的姓名和学号

#include<iostream>
#include<string>
using namespace std; class Student
{
public: //访问权限
string m_Name; //属性
int m_Id;
void showStudent() //行为
{
cout << "姓名:" << m_Name <<" " << "学号:" << m_Id << endl;
}
}; int main()
{
//实例化:
Student s1;
s1.m_Name = "张三";
s1.m_Id = 001;
s1.showStudent(); Student s2;
s2.m_Name = "李四";
s2.m_Id = 002;
s2.showStudent(); system("pause");
return 0;
}

    

    通过行为给属性赋值:

#include<iostream>
#include<string>
using namespace std; class Student //类中的属性和行为称为:成员
{
public: //属性 又称:成员属性 成员变量
string m_Name;
int m_Id; public: //行为 又称:成员函数 成员方法
void showStudent()
{
cout << "姓名:" << m_Name <<" " << "学号:" << m_Id << endl;
}
//给姓名赋值
void setName(string name)
{
m_Name = name;
}
//给学号赋值
void setId(int id)
{
m_Id = id;
}
}; int main()
{
//实例化: Student s1;
//s1.m_Name = "张三";
//s1.m_Id = 001;
s1.setName("张三");
s1.setId(1);
s1.showStudent(); Student s2;
//s2.m_Name = "李四";
//s2.m_Id = 2;
s2.setName("李四");
s2.setId(2);
s2.showStudent(); system("pause");
return 0;
}

      2、将属性和行为加以权限控制

      访问权限有三种:1、public-公共权限;2、protected-保护权限;3、private-私有权限;

#include<iostream>
#include<string>
using namespace std; //访问权限
//1、public-公共权限 成员 类内可以访问 类外也可以访问
//2、protected-保护权限 成员 类内可以访问 类外不可以访问 子类可以访问父类保护权限内的内容
//3、private-私有权限 成员 类内可以访问 类外不可以访问 子类无法访问父类私有权限内的内容 class Person
{
public:
//公共权限
string m_Name; //姓名 protected:
//保护权限
string m_Car; //车 private:
//私有权限
int m_Password; //银行卡密码
public:
void func()
{
m_Name = "张三";
m_Car = "奔驰";
m_Password = 123456;
};
}; int main()
{
//实例化具体对象
Person p1; p1.m_Name = "李四";
//p1.m_Car = "拖拉机"; //保护权限内容,在类外访问不到
//p1.m_Password = 123; //私有权限内容,在类外访问不到 p1.func(); system("pause");
return 0;
}

struct和class区别

    在C++中,struct的默认权限为公共,class的默认权限为私有。

#include<iostream>
#include<string>
using namespace std; //class 和 struct 区别 class C1
{
int m_A; //默认是私有权限 private
}; struct C2
{
int m_A; //默认是公共权限 public
}; int main()
{
C1 c1;
//c1.m_A = 100; //在class里默认的权限是私有权限 不可访问 C2 c2;
c2.m_A = 100; //在struct里默认的权限是公共权限 可以访问 system("pause");
return 0;
}

成员属性设为私有

优点1、将所有成员属性设置为私有,可以自己控制读写权限

#include<iostream>
#include<string>
using namespace std; //成员属性设为私有 //1、将所有成员属性设置为私有,可以自己控制读写权限 class Person
{
public:
//写姓名 -> 设置姓名
void setName(string name)
{
m_Name = name;
}
//读姓名 -> 获取姓名
string getName()
{
return m_Name;
} //读年龄 -> 获取年龄
int getAge()
{
m_Age = 0; //初始化为0岁
return m_Age;
} //写情人 -> 设置情人
void setLover(string lover)
{
m_Lover = "小泽玛丽亚";
m_Lover = lover;
} private:
//姓名 可读可写
string m_Name;
//年龄 只读
int m_Age;
//情人 只写
string m_Lover;
}; int main()
{
Person p;
p.setName("张三");
cout << "姓名为:" << p.getName() << endl; //p.m_Age = 18; //不可写
//p.setAge(18); //不可写
cout << "年龄为:" << p.getAge() << endl; p.setLover("仓井");
//cout << "情人为:" << p.m_Lover << endl;
//cout << "情人为:" << p.getLover << endl; //不可以访问 system("pause");
return 0;
}

优点2、对于写权限,我们可以检测数据的有效性

#include<iostream>
#include<string>
using namespace std; //成员属性设为私有 //2、对于写权限,我们可以检测数据的有效性 class Person
{
public:
//写姓名 -> 设置姓名
void setName(string name)
{
m_Name = name;
}
//读姓名 -> 获取姓名
string getName()
{
return m_Name;
} //读年龄 -> 获取年龄
int getAge()
{
m_Age = 0; //初始化为0岁
return m_Age;
}
//写年龄 -> 设置年龄
void setAge(int age)
{
if (age < 0 || age >150)
{
cout << "年龄有误" << endl;
return;
}
m_Age = age;
} //写情人 -> 设置情人
void setLover(string lover)
{
m_Lover = "小泽玛丽亚";
m_Lover = lover;
} private:
//姓名 可读可写
string m_Name;
//年龄 可读可写
int m_Age;
//情人 只写
string m_Lover;
}; int main()
{
Person p;
p.setName("张三");
cout << "姓名为:" << p.getName() << endl; //p.m_Age = 18;
p.setAge(1000);
cout << "年龄为:" << p.getAge() << endl; p.setLover("仓井");
//cout << "情人为:" << p.m_Lover << endl;
//cout << "情人为:" << p.getLover << endl; //不可以访问 system("pause");
return 0;
}

C++核心编程 4 类和对象-封装的更多相关文章

  1. C++核心编程 4 类和对象-对象的初始化和清理

    构造函数和析构函数 对象的初始化和清理工作是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用结果是未知的,同样,使用完一个对象或变量,没有及时清理,也会造成一定的安全问题.C++利用了构 ...

  2. 第三章:Python高级编程-深入类和对象

    第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...

  3. day24:面向对象设计与面向对象编程、类和对象

    一.三大编程范式: 面向过程: 面向函数: 面向对象: 二.程序的进化论: 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定 ...

  4. java面向对象编程(类、对象)

    一.面向对象编程概述面向对象编程(Object  Oriented  Programming,缩写为OOP)是当今最流行的程序设计技术,它具有代码易于维护.可扩展性好和代码可常用等优点.面向对象的设计 ...

  5. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  6. ES6学习笔记(一):轻松搞懂面向对象编程、类和对象

    目录 面向过程编程P OP(Process oriented programming) 面向对象编程OOP(Object Oriented Programming) 总结 @ 面向过程编程P OP(P ...

  7. java面向对象编程(一)-类与对象

    1.问题的提出      张老太养了两只猫猫:一只名字叫小白,今年3岁,白色.还有一只叫小花,今年100岁,花色.请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色.如果用户输入的小 ...

  8. Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量

    1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成 ...

  9. Python核心编程--学习笔记--4--Python对象

    现在开始学习Python语言的核心部分.首先了解什么是Python对象,然后讨论最常用的内建类型,接下来讨论标准类型运算符和内建函数,之后给出对标准类型的不同分类方式,最后提一提Python目前还不支 ...

随机推荐

  1. Java程序设计学习笔记(六) — 网络编程

    时间:2016-5-8 02:03 --网络编程        网络传输实际上就是进行数据传输.    一.传输的步骤:        1.对对方IP地址进行定位.        2.将数据打包发送到 ...

  2. 微信小程序学习笔记二 数据绑定 + 事件绑定

    微信小程序学习笔记二 1. 小程序特点概述 没有DOM 组件化开发: 具备特定功能效果的代码集合 体积小, 单个压缩包体积不能大于2M, 否则无法上线 小程序的四个重要的文件 *js *.wxml - ...

  3. SpringBoot 优雅配置跨域多种方式及Spring Security跨域访问配置的坑

    前言 最近在做项目的时候,基于前后端分离的权限管理系统,后台使用 Spring Security 作为权限控制管理, 然后在前端接口访问时候涉及到跨域,但我怎么配置跨域也没有生效,这里有一个坑,在使用 ...

  4. Windows CMD .bat 批处理基础语法

    格式 @echo off 代码..... pause 不会逐行将命令打印. rem [注释] 关键字注释. :: [注释] 符号注释. echo 打印到控制台. >> 输出重定向.追加. ...

  5. RabbitMQ(一):入门

    前言 最近学习了尚硅谷-RabbitMQ 受益匪浅,根据自己的理解做了下笔记,不正确的地方欢迎指正 正文 RabbitMQ是一个消息中间件,相当于一个中转站:用于接收.存储.转发消息数据 Rabbit ...

  6. 聊聊 Jmeter 如何并发执行 Python 脚本

    1. 前言 大家好,我是安果! 最近有小伙伴后台给我留言,说自己用 Django 写了一个大文件上传的 Api 接口,现在想本地检验一下接口并发的稳定性,问我有没有好的方案 本篇文章以文件上传为例,聊 ...

  7. APT组织跟踪与溯源

    前言 在攻防演练中,高质量的蓝队报告往往需要溯源到攻击团队.国内黑产犯罪团伙.国外APT攻击. 红队现阶段对自己的信息保护的往往较好,根据以往溯源成功案例来看还是通过前端js获取用户ID信息.mysq ...

  8. Appium问题解决方案(9)- Original error: Failed to launch Appium Settings app: Condition unmet after 5090 ms

    背景 执行代码报错 解决方法 该问题并不常见,主要是手机操作系统的问题 程序无法无法自动打开appiumsettings,那么我们可以手动打开appiumsettings服务(程序没有界面,会出现打开 ...

  9. VUE带Token访问Abp Vnext Api

    上篇登录保存token用了3种方式,都可以在header带上Token访问,本次使用第四种保存方式Vuex中保存状态 stroe中配置好需要保存的字段及方法 import Vue from 'vue' ...

  10. 轻量化模型系列--GhostNet:廉价操作生成更多特征

    ​  前言  由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络 (CNN) 很困难.特征图中的冗余是那些成功的 CNN 的一个重要特征,但在神经架构设计中很少被研究. 论文提出了一种新颖的 Gh ...