当前课程知识点:C++语言程序设计基础 > 第4章 类与对象 > 类和对象 > 类和对象的定义
类和对象的定义
l 对象是现实中的对象在程序中的模拟。
l 类是同一类对象的抽象,对象时类的某一特定实体。
l 定义类的对象,才可以通过对象使用类中定义的功能。
l 此类型的“合法值”是什么?
l 此类型应该有什么样的函数和操作符?
l 新类型的对象该如何被创建和销毁?
l 如何进行对象的初始化和赋值?
l 对象作为函数的参数如何以值传递?
l 谁将使用此类型的对象成员?
class 类名称
{
public:
公有成员(外部接口)
private:
私有成员
protected:
保护型成员
};
l 可以为数据成员提供一个类内初始值
l 在创建对象时,类内初始值用于初始化数据成员
l 没有初始值的成员将被默认初始化。
l 类内初始值举例
class Clock {
public:
void setTime(int newH, int newM, int newS);
void showTime();
private:
int hour = 0, minute = 0, second = 0;
};
l 公有类型成员
n 在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。
l 私有类型成员
n 在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。
n 如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。
l 保护类型成员
n 与private类似,其差别表现在继承与派生时对派生类的影响不同,详见第七章。
l 类名 对象名;
l 例:Clock myClock;
l 类中成员互相访问
n 直接使用成员名访问
l 类外访问
n 使用“对象名.成员名”方式访问 public 属性的成员
l 在类中说明函数原型;
l 可以在类外给出函数体实现,并在函数名前使用类名加以限定;
l 也可以直接在类中给出函数体,形成内联成员函数;
l 允许声明重载函数和带默认参数值的函数。
l 为了提高运行时的效率,对于较简单的函数可以声明为内联形式。
l 内联函数体中不要有复杂结构(如循环语句和switch语句)。
l 在类中声明内联成员函数的方式:
n 将函数体放在类的声明中。
n 使用inline关键字。
大家好
欢迎回来继续学习
C++语言程序设计
这一节我们来学习
类和对象的定义
我们知道对象是
现实世界中的对象的模拟
那么我们对同类型的对象
进行概括 进行抽象
就形成了类
对象是类的实例
那么我们要使用类的功能呢
就要定义对象
通过对象去使用
在类里面定义好的功能
现在我们首先来看
设计一个类意味着什么
实际上我们设计一个类
就意味着设计一个类型
设计一个新的类
也就是定义为一个新的类型
那么定义这个新类型时候
我们要关注哪些问题呢
首先我们要关心
这个类型的合法值是什么
这个类型应该有什么样的函数
有什么样的操作符
我们知道基本数据类型
当你定义这个类型的变量的时候
不仅意味着
你定义了这个变量的存储形态
同时也意味着
你定义了这个变量
它应该遵循什么样的运算规则
能够进行哪些运算
那么我们定义一个新的类
既然是定义新类型
所以也应该关心这个类
应该有什么样的函数和操作符
还有我们还要定义
新类型的对象
它如何被创建
如何被销毁
还有对象怎么进行初始化
和赋值
我们知道定义一个基本类型
变量的时候
我们都可以在定义变量的时候
对变量进行初始化
那么定义对象的时候
同样我们也需要
能够对对象进行初始化
这一章我们要介绍
对象的初始化
那么如何给对象赋值呢
默认的有一个赋值功能
在第八章我们还要讲
重载赋值运算符
也就是自定义这个赋值功能
还有对象
也应该可以作为函数的参数
进行传递的
那么我们如何把对象
作为函数的参数进行传递
也是我们在定义类的时候
应该关注的问题
最后呢
我们要清楚谁将使用
这个类型的对象
还有它的对象的成员
好 下面呢我们来看一下
语法上怎么样去定义一个类
那么大家看这个就是
定义类的语法形式
要用关键字class开头
后面就是类名称
就是我们程序员
要为这个类自己起一个标志符
然后我们就看到
在这一对大括号里面
有类的成员
这个类的成员呢
它又分成公有成员 私有成员
和保护成员
不管是数据成员
还是函数成员
都可以分成这样三类
我们知道类里面的属性
是用数据成员表示的
类里面的功能是用函数成员
表示的
那么数据成员 函数成员
都分成公有的public
私有的private
和保护型protected
那么这里面的公有成员
是类的外部接口
我们在定义类的时候
还可以给类的数据成员
指定类内的初始值
这个类内的初始值呢
是在构造对象的时候
用于初始化对象用的
现在我们来看一个类内
初始化的例子
现在我们再来看这个
Clock类里面的定义
这一次给三个数据成员
都设置了初始值
这种在类体里面设置的初始值
叫做类内的初始值
当我们构造
这个Clock为对象的时候
如果有构造函数
对它进行初始化呢
就会按照构造函数
指定的值进行初始化
如果构造函数没有对
这几个数据成员进行初始化
那么就会用这个类内的初始值
构造函数呢
一会稍后我们就会给大家
仔细介绍的
好 我们刚才看到
这个类的定义的语法形式了
我们知道类的成员
它分成公有成员 私有成员
和保护成员
三种访问控制属性
那么公有成员呢
就是在关键字public后面
声明的成员
公有成员是一个类
与外部的接口
任何外部函数都可以访问
类的共有数据
和共有函数
而私有成员是在关键字
private后面声明的
私有成员可以说
它是对外屏蔽了
在外面那是看不见
一个类的私有成员的
所以私有成员
只允许本类中的函数来访问
类外部的任何函数
都不能访问一个类的私有成员
那当然了
很多事情都是有例外的
我们在后面的章节呢
也就是下一章
也会给大家讲
我们可以用某种办法
授权类外的函数访问私有成员
那就是第五章要讲的友元
那么目前我们主要记住
私有成员在类外是不可访问的
那么如果
我们在定义类的成员的时候
紧跟着类名之后的那个大括号
就声明成员
那么这个时候
如果不写
任何访问控制属性的关键字
默认的话这个成员是私有成员
也就是说
如果你在类体的最开头
定义私有成员的话
那么这个private关键字
它是可以省略的
那么保护成员呢
现在看起来
与私有成员很像
它的差别是在什么地方呢
是在继承和派生的时候
我们才看得出来
保护成员与私有成员
它们有什么不同
所以在第七章
我还会给大家详细介绍
保护型的成员
目前呢
大家只要会用公有成员
和私有成员就可以了
当我们定义好一个类以后
怎么样去使用类里面的功能呢
通常我们都要定义一个对象
然后通过对象去调用
它的成员函数
这样来使用类的功能
对象是类的一个实例
类呢
它是一种一类对象的一种设计
当然我们要使用的时候呢
我们肯定是通过一个具体对象
一个个实例去使用这些功能的
就像现实世界中
我们也是进行分类的
比如说教师是一类
那并不是教师这个类型
今天站在这儿给你讲课
而是一个教师个体
某一个具体的教师
站在你面前给你讲课
那在程序中也是一样的
我们要使用类里面
预定义好的功能
就要通过类的对象
所以接下来我们来学习
如何定义类的对象
对象定义的语法是这样的
首先前面是类名
然后后面跟个对象名
这个很像我们定义
基本类型的变量
比如说我们定义int类型的变量
也是这样
类型在前面 变量名在后面
现在呢是类名在前面
对象名在后面
一个类中呢
通常有多个函数成员
数据成员
那么类中的成员
它们之间能不能互相访问呢
可以的
类的成员
它们之间要互相访问的话
直接用成员名就可以访问
如果我们要从类外
来访问类的成员
那就要通过对象来访问
具体的访问形式
就是对象名.成员名的方式
那么这样的方式能访问的
只是类的公有成员
私有成员在类外是不能访问的
接下来呢
我们就来看在类中
我们应该如何去定义
它的成员函数
首先我们需要在类中
说明函数的原型
然后我们在类外
给出函数体的实现
那么实现这个函数的时候呢
跟我们定义普通的函数
其实是很像的
唯一一个区别就是
在函数名前面
要使用类名来加以限定
也就是说
这个函数
它不是一个普通的全局函数
要说明它是属于哪个类的
它是类的成员函数
当然我们也可以在类体中
直接给出函数体定义
那么这个就是内联的成员函数
内联的成员函数
它必须充分简单
这跟我们前面讲过的
内联函数是一样的
在类里面声明成员函数的时候呢
同样也允许函数重载
也允许函数的参数带有默认值
下面我们就来看看
关于内联的成员函数
看看内联成员函数的定义
有哪些规则
我们使用内联成员函数
是为了提高运行时的效果
也就是说
对于比较简单的函数
我们通常可以把它声明为
内联的形式
内联函数的函数体中
不应该有复杂的结构
比如说不应该有循环语句
和switch语句
那么在类中声明内联成员函数
实际上有两种方式
一种就是把函数体
直接写在类的类体中
另外一种方式就是在类体中
只声明函数的原型
然后在类外实现函数
只不过实现函数体的时候
要用inline这个关键字
-导学
--第1章导学
-计算机系统简介
--计算机系统简介
--计算机系统简介 测试题
-计算机语言和程序设计方法的发展
--计算机语言和程序设计方法的发展 测试题
-面向对象的基本概念
--面向对象的基本概念 测试题
-程序的开发过程
--程序的开发过程
--程序的开发过程 测试题
-信息的表示和储存
--计算机的数字系统
--数据的编码表示
--信息的表示和储存 测试题
-实验指导
-导学
--第二章导学
-C++语言概述
--C++语言概述 测试题
-基本数据类型、常量、变量
--程序举例
--基本数据类型、常量、变量 测试题
-运算与表达式
--运算与表达式 测试题
-实验二:简单程序设计(上)
-数据的输入和输出
--数据的输入和输出
--数据的输入和输出 测试题
-选择结构
--if语句
--switch语句
--选择结构 测试题
-循环结构
--for语句
--循环结构 测试题
-自定义类型
--自定义类型
--自定义类型
-第2章小结
--第二章小结
-实验二:C++简单程序设计(下)
-导学
--导学
-函数定义
--函数定义
--函数定义 测试题
-函数调用
--例3-2
--例3-3
--例3-4
--例3-5
--例3-6
--函数调用 测试题
-嵌套与递归
--例3-9
--例3-10
--嵌套与递归 测试题
-函数的参数传递
--函数的参数传递
--函数的参数传递 测试题
-引用类型
--引用类型 测试题
-含有可变参数的函数
--含有可变参数的函数 测试题
-内联函数
--内联函数 测试题
-constexpr函数
--CONSTEXPR函数课后习题
-带默认参数值的函数
--带默认参数值的函数 测试题
-函数重载
--函数重载 测试题
-C++系统函数
--C++系统函数习题
-第3章小结
--第三章小结
-实验三(上)函数的应用
-实验三(下)函数的应用
-导学
--导学
-面向对象程序的基本特点
--面向对象程序的基本特点 测试题
-类和对象
--类和对象的定义
--类和对象 测试题
-构造函数
--构造函数基本概念
--委托构造函数
--复制构造函数
--构造函数 测试题
-析构函数
--析构函数
--析构函数 测试题
-类的组合
--类的组合
--类的组合程序举例
--前向引用声明
--类的组合 测试题
-UML简介
--UML简介
--UML简介课后习题
-结构体与联合体
--结构体与联合体 测试题
-枚举类
--枚举类
--枚举类 测试题
-第4章小结
--第四章小结
-实验四(上)
--实验四(上)
-实验四(下)
--实验四(下)
-导学
--导学
-标识符的作用域与可见性
--标识符的作用域与可见性 测试题
-对象的生存期
--对象的生存期
--对象的生存期 测试题
-类的静态成员
--类的静态成员 测试题
-类的友元
--类的友元 测试题
-共享数据的保护
--共享数据的保护 测试题
-多文件结构和预编译命令
--多文件结构和预编译命令 测试题
-第5章小结
--小结
-实验五
--实验五
-导学
--导学
-数组的定义与初始化
--数组的定义与使用
--一维数组应用举例
--数组的定义与初始化 测试题
-数组作为函数的参数
--数组作为函数的参数 测试题
-对象数组
--对象数组
--对象数组 测试题
-基于范围的for循环
-指针的定义和运算
--指针的定义和运算 测试题
-综合实例
--综合实例
-实验六(上)
--实验六上
-指针与数组
--指针数组
--指针与数组 测试题
-指针与函数
--指针类型的函数
--指向函数的指针
--指针与函数 测试题
-对象指针
--对象指针
--对象指针 测试题
-动态内存分配
--动态内存分配 测试题
-智能指针
--智能指针
-vector对象
--vector对象
--vector对象 测试题
-对象复制与移动
--移动构造
--对象复制与移动 测试题
-字符串
--C风格字符串
--string类
--字符串 测试题
-第6章小结
--第六章小结
-综合实例
--综合实例
-实验六(下)
--实验六(下)