1、从struct说起

  当单一变量无法完成描述需求的时候,结构体类型解决了这一问题。可以将多个类型打包成一体,形成新的类型。这是 c 语言中封装的概念。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;struct Data
{int year;int month;int day;
};void init(Data &d)
{cout << "year,mouth,day:" << endl;cin >> d.year >> d.month >> d.day;
}void print(Data &d)
{cout << "year:mouth:day:" << endl;cout << d.year<<":" << d.month << ":" << d.day << endl;
}bool isLeapYear(Data &d)
{if ((d.year % 4 == 0 && d.year != 0) || d.year % 400 == 0)return true;elsereturn false;
}
int main(void)
{Data d;init(d);print(d);if (isLeapYear(d))cout << "leap year" << endl;elsecout << "not leap year" << endl;return 0;
}

对C语言中结构体的操作,都是通过外部函数来实现的。比如

void init(Data &d)
void print(Data &d)
bool isLeapYear(Data &d)

2、封装的访问属性

  • struct 中所有行为和属性都是 public 的(默认)。C++中的 class 可以指定行为和属性的访问方式。
  • 封装,可以达到对内开放数据、对外屏蔽数据、对外提供接口,达到了信息隐蔽的功能。
  • 比如我们用 struct 封装的类,即知其接口,又可以直接访问其内部数据,这样却没有达到信息隐蔽的功效。而 class 则提供了这样的功能,屏蔽内部数据,对外开放接口。

3、用class去封装带行为的类

  class 封装的本质,在于将数据和行为,绑定在一起然后能过对象来完成操作。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;class Data
{
//一个类的内部,默认的访问控制权限是private
public:void init(){cout << "year,mouth,day:" << endl;cin >> year >> month >> day;}void print(){cout << "year:mouth:day:" << endl;cout << year << ":" << month << ":" << day << endl;}bool isLeapYear(){if ((year % 4 == 0 && year != 0) || year % 400 == 0)return true;elsereturn false;}int get_year(){return year;}void set_year(int new_year){year = new_year;}
private:int year;int month;int day;
};
int main(void)
{Data d;d.init();d.print();if (d.isLeapYear())cout << "leap year" << endl;elsecout << "not leap year" << endl;//getter,settercout << d.get_year() << endl;d.set_year(2018);cout << d.get_year() << endl;return 0;
}//C++中结构体和类的功能是一样的,在C++中将结构体升级了,结构体的方式就是一个类,
//区别是默认的访问控制权限是不同的,
//结构体struct默认为public,类class默认为private;
//结构体没有成员方法,只能通过函数指针解决问题;

或者写成:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;class Data
{
//一个类的内部,默认的访问控制权限是private
public:void init();void print();bool isLeapYear();int get_year();void set_year(int new_year);
private:int year;int month;int day;
};void Data::init()
{cout << "year,mouth,day:" << endl;cin >> year >> month >> day;
}void Data::print()
{cout << "year:mouth:day:" << endl;cout << year << ":" << month << ":" << day << endl;
}bool Data::isLeapYear()
{if ((year % 4 == 0 && year != 0) || year % 400 == 0)return true;elsereturn false;
}int Data::get_year()
{return year;
}void Data::set_year(int new_year)
{year = new_year;
}
int main(void)
{Data d;d.init();d.print();if (d.isLeapYear())cout << "leap year" << endl;elsecout << "not leap year" << endl;//getter,settercout << d.get_year() << endl;d.set_year(2018);cout << d.get_year() << endl;return 0;
}

  • Data 类 访问自己的成员,可以不需要传引用的方式;
  • 封装有2层含义(把属性和方法进行封装 对属性和方法进行访问控制);
  • Public修饰成员变量和成员函数可以在类的内部和类的外部被访问;
  • private修饰成员变量和成员函数只能在类的内部被访问。

struct和class关键字区别:

  在用struct定义类时,所有成员的默认属性为public;

  在用class定义类时,所有成员的默认属性为private。

转载于:https://www.cnblogs.com/yuehouse/p/9787668.html

类和对象(2)—— 类的封装和访问控制相关推荐

  1. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...

    0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...

  2. php函数、类和对象以及类的封装、继承、类的静态方法、静态属性

    php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 原文:php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 1.函数 php内置函数可以直接使用,如果没有安装php扩展即可 ...

  3. java类与对象_Java类与对象

    类与对象 1,面向对象编程简介 Java语言最大的特点在于面向对象的编程设计,并且面向对象的编程设计也在由于Java自身的发展而不断发展.面向过程编程(C语言).函数式编程(Scala).面向对象编程 ...

  4. c++类和对象(类的概念)

    1.类和对象概念 类:用来对实体(对象)进行描述,对象有什么属性,以及对象具有什么功能是一种自定义类型 对象:现实生活中所存在的 ,对象是对类的具体体现 用类类型创建出来的变量称为对象 2.类的定义 ...

  5. 实验四 类和对象;类的继承和派生;多态性; 接口;构造器应用

    实验四 类和对象:类的继承和派生:多态性: 接口:构造器应用 一.实验目的 1. 掌握类与对象的关系: 2. 掌握类的定义: 3. 掌握对象的声明及使用: 4. 掌握构造方法的概念及调用时机: 5. ...

  6. C++ 类与对象_类的其他成员(常成员,静态成员,友元)

    系列文章目录 重新复习c++,所以把书中的重点内容整理成博客,尽量简洁,易懂. C++ 类与对象_类和对象的定义与访问 (定义类和对象,访问对象成员,this指针) C++ 类与对象_构造函数和析构函 ...

  7. mysql构造器_类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库的方式--2018年8月30日11时38分...

    这一节课主要讲的是类和数据库的知识,主要是类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库1. 什么是类 ?什么是对象?举例说明 答:类是对象的模板,对象是类的一个实 ...

  8. 3-1:类与对象入门——类的引入和类的定义以及访问限定符和封装还有对面向对象的理解

    文章目录 一:面向对象与面向过程 二:类的引入 三:类的定义 (1)C++类的定义 (2)类的两种定义方式 A:声明和定义全部放在类体中 B:定义和声明分开放 四:类的访问限定符及封装 (1)访问限定 ...

  9. 基于类和对象的高精度算法封装

    hi 这是使用类和对象的高精度计算封装实现,这能够进行面向对象的高精度计算编程. #include<iostream> #include<cstring> using name ...

  10. [Java] 类和对象(简介,封装,内存机制,构造方法)

    文章目录 1 面向对象思想 1.1面向对象的思想概述 举例 特点 1.2 类和对象 类 对象 类和对象的关系 1.3 类的定义 1.4 对象的创建以及使用 1.5 对象的内存 1.6 类作为参数 注意 ...

最新文章

  1. Graph Embedding学习笔记(3):Graph Convolution Networks
  2. 成功解决pyinstaller打包scipy是报模块dll缺失和failed to import any qt binding的问题
  3. 程序员面试题精选100题(21)-左旋转字符串[算法]
  4. 在VS中进行对项目进行编译出现不能编译的问题
  5. JavaScript在内层循环中断外层循环
  6. transformer学习
  7. 【体验】Silverlight 2.0 多图
  8. ug区域轮廓铣没有重叠距离_UG加工基本操作
  9. Android开发中的全屏背景显示方案
  10. [MSDN]Design Guidelines for Developing Class Libraries with .NET Framework 4
  11. uniapp —— 实现左右联动商品分类页面
  12. 问卷与量表数据分析(SPSS+AMOS)学习笔记(一) :问卷分析的流程
  13. html全部颜色代码大全,html代码大全(基础使用代码)(颜色代码完整版)
  14. html的过渡属性,CSS3中的元素过渡属性transition解析
  15. oracle11g shrink,shrink lob
  16. 在线工具:电脑怎么提取图片中的文字?图片如何转化为文字?
  17. CSP 201803-4 棋局评估
  18. CMS和G1的对比分析
  19. 如何看待2022年秋招Java后端开发岗一片红海?
  20. 虚拟土地价格暴跌85% 房地产泡沫破裂?依托炒作的暴富游戏需谨慎参与

热门文章

  1. MySQL中关于OR条件的优化
  2. Xshell和Xftp5配置连接阿里云服务器
  3. 大数据的“媒体玩法”
  4. Android 架构艺术之MVP
  5. Worktile 移动团队如何使用 C++ 完成 Worktile Pro 跨平台应用开发2
  6. phash图像识别应用
  7. Fast dev didn't succeed, trying another location
  8. LNMP一键安装shell脚本
  9. Js中Currying的应用
  10. 用计算机听音乐和看电影教学反思,与计算机交朋友