当前位置: 首页 > news >正文

C++:类和对象(1)

1.类和对象的概念

      在现实世界中,每个事物所具有的共性九十每个事物都具有自身的属性,一些自身具有的行为,例如一个学生有姓名、性别、年龄等属性,吃饭睡觉等行为。为了将这些属性封装起来,C++提供了类的概念,可以将某一类事物的所有属性和行为封装在class中。

      类对于某个事物的描述其实还是抽象的,例如有一类事物有姓名、性别、年龄等属性,可以吃饭睡觉等行为,如果只是这么描述的话其实我们是不知道这个事物具体是什么样,因为并没有告诉我们每个属性具体的值是多少(姓名是什么,年龄是多少),所以类只是对某一类事物的一个粗略的描述而已。实际应用中我们需要操作某类事物中一个或者多个具体的事物。那么这个具体的事物就被我们称之为对象。

     所以说类是抽象的,对象是具象的,那么我们怎么创建一个类并实例化一个对象呢,下面就让我们一起来看看C++这个强大的特性。

2.类的定义

      属性:变量

      行为:函数/方法

class 类名
{访问控制符:成员变量 //属性成员函数 //方法
};

      访问控制符有三种:public,private,protected

       比如我们想要定义一个类描述一种动物,我们可以这样做:

class CAnimal   //类名首字母一般大写
{
public://属性char name[32];int age;//方法void jiao(char* voice)//描述动物叫的行为,voice为叫的声音{cout<<name<<voice<<endl;}
};

3.类的基本使用

3.1 对象的实例化

       上面只是模糊的定义了一个抽象的类,下面我们来实例化一个对象

       1、实例化普通对象

类名 对象名称
CAnimal cat;//cat是一个CAnimal的实例化对象

       2、使用数组实例化多个普通对象

类名 数组名[数组长度]
CAnimal cats[10];//实例化10个CAnimal的实例化对象

      3、定义一个指针变量

类名 *对象名称
CAnimal *cat;//cat就是一个指针变量,可以指向一个CAimal的实例化对象

      注意一点:指针变量不是类的实例化对象,本质还是指针,也就是说定义一个类类型的指针变量没有实例化一个对象。

     其实还有很多实例化方法,这里只做初步了解,以后再深入学习。

3.2 成员变量和成员函数的访问

      我们实例化了一个对象,怎么来访问它的成员变量和函数呢?

      1、普通对象

//普通对象使用句点符号访问成员变量和成员函数
CAnimal cat;
cat.age=1;
cat.jiao("miao miao");

      2.指针变量

//指针使用->访问成员变量和成员函数
CAnimal cat;
CAnimal *p=&cat;
p->age=1;
p->jiao("miao miao");

      其实看起来和结构体的访问还是挺相似的。

3.3 类成员和访问控制

       在C++中我们可以给成员变量和成员函数定义访问级别,级别如下:

         public:公有的,修饰成员变量和成员函数在类的内部和外部都可以被访问

         private:私有的,修饰成员变量和成员函数只能在类的内部被访问

         protected:被保护的,修饰成员变量和成员函数只能在类的内部被访问,和private相似

       让我们看一段代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
class Teacher
{
public:char name[20];
private:int _age;char _sex;
};
int main()
{Teacher t;strcpy(t.name, "lisa");t._age = 30;//error,_age是私有的return 0;
}

      为什么我们要把成员变量或者成员函数的访问控制权限设置为private?

      比如age属性难道不能是public吗?

      那你看这个代码合理吗?

t._age=10000;

      很显然年龄不可能这么大,赋值是不合理的,但是对象可以通过这种方法直接引用该属性,为了保护他们的安全,我们常常将这些属性定义为private,对象只能通过类中public方法访问private属性,比如:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
class Teacher
{
public:char name[20];
private:int _age;char _sex;
public:void set_age(int age){_age = age;}
};
int main()
{Teacher t;strcpy(t.name, "lisa");t.set_age(-10000);return 0;
}

      这还是不合理啊,你耍我玩呢?先别急,我们需要在set_age函数之前对参数的合法性进行检查。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
class Teacher
{
public:char name[20];
private:int _age;char _sex;
public:void set_age(int age){   if(age>200||age<0){cout<<"age error"<<endl;return;}_age = age;}
};
int main()
{Teacher t;strcpy(t.name, "lisa");//t._age = 30;//error,_age是私有的t.set_age(-10000);return 0;
}

       这样妈妈就再也不用担心我赋值赋得不合理啦!

相关文章:

  • 亿发零售云引领新零售时代:智能收银系统助力连锁门店多业态发展
  • Flink CDC 3.0 正式发布,详细解读新一代实时数据集成框架
  • Linux 使用 Anaconda+Uwsgi 部署 Django项目和前端项目
  • 13、Kafka副本机制详解
  • 在 Cray Linux 上配置 LSF 集成
  • 全面掌握XSS漏洞攻击,实战案例从Self-XSS到账户接管,以及通过参数污染的XSS实现攻击
  • 设计模式——组合模式(结构型)
  • 如何提升数据结构方面的算法能力?
  • Leetcode 376 摆动序列
  • 计算机论文写作助手
  • 隐私计算介绍
  • 5G边缘网关如何助力打造隧道巡检机器人
  • luttuce(RedisTempate)实现hash(动态数据) expire lua脚本
  • Lvs-NAT部署
  • 论文阅读——Painter
  • CSS中外联样式表代表的含义
  • HTTP请求重发
  • JAVA 学习IO流
  • JavaScript的使用你知道几种?(上)
  • Js基础知识(一) - 变量
  • js学习笔记
  • Python学习之路13-记分
  • Redux系列x:源码分析
  • Ruby 2.x 源代码分析:扩展 概述
  • Spring Boot快速入门(一):Hello Spring Boot
  • Sublime Text 2/3 绑定Eclipse快捷键
  • windows下mongoDB的环境配置
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 回顾 Swift 多平台移植进度 #2
  • 聚簇索引和非聚簇索引
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 如何设计一个微型分布式架构?
  • 使用 Docker 部署 Spring Boot项目
  • 学习笔记TF060:图像语音结合,看图说话
  • 用Visual Studio开发以太坊智能合约
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (HAL库版)freeRTOS移植STMF103
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (三)uboot源码分析
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (数据结构)顺序表的定义
  • (算法二)滑动窗口
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)项目管理杂谈-我所期望的新人
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET Reactor简单使用教程
  • .NET程序员迈向卓越的必由之路
  • @KafkaListener注解详解(一)| 常用参数详解
  • @Transactional 详解
  • [ linux ] linux 命令英文全称及解释