第二章 面向对象的基本概念-04737-C++程序设计【自考笔记】

考核目标

1.了解传统的结构化程序设计的不足,初步理解面 向对象程序设计的思想、概念和特点。

2.熟悉类的定义使用方式

3.通过示例程序剖析对象,理解类成员的可访问范围

第1节 结构化程序设计

结构化程序设计的基本方法 :采用自顶向下、逐步求精及模块化的思想,将复杂的大问题层层分解为许多简单的小问题。

结构化程序设计的三种基本结构 :顺序结构、选择结构、循环结构

结构化程序设计的基本思想

数据结构+算法=程序

结构化程序设计的缺点 :程序在代码规模庞大时,变得难以理解难以扩充难以查错难以复用

这种情况下,面向对象的程序设计方法就应运而生了。

第2节 面向对象程序设计的概念和特点

一、面向对象思想的提出

面向对象程序设计方法是20世纪90年代以来软件开发方法的主流,它继承了结构化程序设计方法的优点,同时又比较有效地改善了结构化程序设计的不足

面向对象的程序设计方法 :使分析、设计和实现一个系统的方法尽可能地接近人们认识一个系统的方法 ,通常包括3个方面:面向对象的分析面向对象的设计面向对象的程序设计

面向对象技术把问题看成是对象 的集合。对象具有两个特性:一是对象本身的信息 ,也称为属性 ;一是对对象的操作 ,也称为行为

对象=数据(属性)+函数(行为)

是对象的一个抽象

二、面向对象的特点

面向对象程序设计的四个基本特点 :抽象封装继承多态

1)抽象 :将同一类事物的共同特点概括出来,这个过程就叫作 "抽象"

类是对现实世界中客观事物的抽象。对于一个具体的类,它有许多具体的个体,这些个体叫做"对象"。

对象 是系统中用来描述客观事物的一个实体,用对象名属性操作三要素来描述对象。

描述属性的数据称为成员变量数据成员 ,对这组属性进行操作的函数称为成员函数 。对象由数据成员成员函数构成。

2)封装:就是把对象的属性和操作结合成一个独立的单元。

封装作用 :

数据和操作数据的函数紧密联系起来;

将对象的一部分属性和函数隐藏 起来,让这部分属性和函数对外不可见 ,起到保护作用。另一些属性和函数对外可见,作为对对象进行操作的接口

3)继承 :在编写一个"新"类的时候,以现有的类作为基础,使得新类从现有的类**"派生"** 而来,从而达到代码扩充和代码复用的目的

4)多态 :不同的对象可以调用相同名称的函数,但可导致完全不同的行为的现象称为多态性 。利用多态性,程序中只需进行一般形式的函数调用,函数的实现细节留给接受函数调用的对象,这大大提高了人们解决复杂问题的能力

第3节 类的初步知识

一、类的定义

1.类的基本概念

是具有相同的属性和操作的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述 ,其内部包括属性(数据变量 )和操作(成员函数 )两个主要部分。

是一种用户自己构造的数据类型 ; 要先声明后使用、是具有唯一标识符的实体;

2.声明类

C++中声明类的一般形式为:

class 类名{

private :

私有变量和函数

public :

公有变量和函数

protected:

保护变量和函数

};

说明:

① private 是完全私有的,只有本类内可以访问,派生类和外部都不可以访问

② protected 是受保护的,只有本类内和派生类可以访问,外部不能访问;

③ public 内、外部都能访问;

④ 如无访问权限的关键字,则默认声明为private ;

不能 在类的声明中对数据变量 进行初始化

⑥类声明中可以给出成员函数的参数的默认值;

⑦类中声明的任何成员不能使用extern、autoregister关键字修饰;(存储类型)

⑧类中可以不含有任何成员变量和成员函数,这样的类称为空类

3.定义成员函数

返回值类型 类名::成员函数名(形参列表)

{成员函数的函数体}

说明:

① 返回类型是指这个成员函数返回值的类型;

② 类名是指成员函数所属类的名字;

③ "::"是类作用域运算符,用于表示其后的成员函数属于这个特定的类;

例:定义属于Point类的成员函数Setxy

void Point::Setxy(int a, int b)

{x=a;y=b;}

④ 类中定义的成员函数允许重载

⑤可以使用关键字inline 将成员函数定义为内联函数(凡是出现调用该函数的地方,编译程序自动将其转换为该函数的函数体,不再在程序执行时调用该函数,大大提高了效率)。

如:inline int Point::Getx

{return x;}

⑥如果在声明类的同时,在类体内给出 成员函数的定义 就默认为内联函数

如将声明Getx的语句"int Getx();"改为"int Getx(){return x;}",则Getx为内联函数。

二、类的定义示例

cpp 复制代码
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

//定义日期类myDate
class myDate
{
public:
myDate();//构造函数
myDate(int,int,int);//构造函数
void setDate(int,int,int);//设置日期
void setDate(myDate);//设置日期
myDate getDate();//获取日期
void setYear(int);//设置年
int getMonth();//获取月
void printDate()const;//打印日期
private:
int year,month,day; //成员变量,表示年、月、日

};
//在类体外定义成员函数
myDate::myDate()
{year=1970;month=1;day=1;
}
//构造函数用来初始化

myDate::myDate(int y, int m, int d)
{year=y;month=m;day=d;
}
//构造函数

void myDate::setDate(int y,int m,int d)
{year=y;month=m;day=d;
return;
}
//用变量设置日期

void myDate::setDate(myDate oneD)
{
year=oneD.year;month=oneD.month;day=oneD.day;
return;
}

myDate myDate::getDate() {
    return *this;
}

void myDate::printDate()const //打印日期
{
cout<<year<<"年"<<month<<"月"<<day<<"日";
}


//定义学生类Student

class Student
{
public:
void setStudent(string,myDate);//设置学生信息
void setName(string);//设置姓名
string getName();//获取姓名
void setBirthday(myDate);//设置生日
myDate getBirthday();//获取生日
void printStudent()const;//打印信息
private:
string name;//姓名
myDate birthday;//生日

};

//在类体外定义成员函数
void Student::setStudent(string s,myDate d)
{
name=s;
birthday.setDate(d);
return;
}
//设置学生信息
void Student::setName(string n)//设置姓名
{
name = n;
return;
}
string Student::getName()//获取姓名
{return name;
}

void Student::setBirthday(myDate d)//设置生日
{
 birthday.setDate(d);
return;
}
myDate Student::getBirthday()//获取生日
{return birthday;
}

void Student::printStudent()const //打印信息
{
cout<<"姓名:"<<name<<"生日:";
birthday.printDate();//调用类myDate的成员函数
cout<<endl;
}


int main() {
// 设置控制台输出编码为UTF-8
    SetConsoleOutputCP(CP_UTF8);

    // 启用缓冲区处理UTF-8字节序标记(BOM)
    setvbuf(stdout, nullptr, _IOFBF, 1000);
Student ss;
int y,m,d;
string name_;
cout<<"请输入学生的姓名和生日,生日以 年、月、日 的次序输入: ";
cin>>name_>>y>>m>>d;
ss.setStudent(name_,myDate(y,m,d));//调用成员函数
ss.printStudent();
return 0;
    
}

第4节 类的示例程序刨析

一、程序结构

一个完整的C++程序包括以下几部分

  • 一个主函数,可以调用其他函数,但不能被调用,也称为主程序。
  • 用户定义的任意多个的类及全局函数。
  • 全局说明。在所有函数和类定义之外的变量说明及函数原型。
  • 注释。
  • 头文件。

二、成员变量与成员函数的定义

1.成员变量:一般均定义为私有访问权限 ,这样的成员仅能在本类内访问。类外需要通过访问本类函数来访问私有的成员变量。

2.成员函数的定义

返回值类型 类名::成员函数名(形参列表)

{函数体}

成员函数并非每个对象各自存一份。成员函数和普通函数一样,在内存中只有一份,它可以作用于不同的对象,为类中各对象共享。

三、创建类对象的基本形式

定义一个普通对象,即类变量的基本方法有两种。

1)

类名 对象名;

类名 对象名(参数);//定义对象的同时初始化

类名 对象名=类名(参数):

类名 *对象指针名=new 类名;

类名 *对象指针名=new 类名();

类名 *对象指针名=new 类名(参数);

用new创建对象时返回的是一个对象指针,这个指针指向本类刚创建的这个对象。

声明对象引用

类名 &对象引用名=对象;

声明对象指针

类名 *对象指针名=对象的地址;

声明对象数组

类名 对象数组名[数组大小]:

第5节 访问对象的成员

一、使用对象访问成员变量与调用成员函数

对象访问成员变量的格式

对象名.成员变量名

二、使用指针访问对象的成员

通过对象的指针访问成员变量的格式

对象的指针->成员名

三、使用引用访问对象的成员

通过对象的引用访问成员变量的格式

对象的引用.成员变量名

调用成员函数的格式:

对象名.成员函数名(参数表)

对象的指针->成员函数名(参数表)

对象的引用.成员函数名(参数表)

第6节 类成员的可访问范围

一、访问范围说明符的含义

public:是公有的,使用它修饰的类的成员可以在程序的任何地方被访问。

private:是私有的,使用它修饰的类的成员仅能在本类内被访问。

protected:是保护的,它的作用介于public与private之间,使用它修饰的类的成员能在本类内及子类中被访问。一般会将成员变量声明为私有的,而将相关的成员函数声明为公有的,以便在类的外部可以调用这些成员函数来操纵成员变量。

二、成员的访问

三、隐藏的作用

设置私有成员的机制叫作"隐藏"。

"隐藏"的优点:

1)有利于程序的修改,

2)可以避免对对象的不正确操作

第7节 标识符的作用域与可见性

类名、函数名、变量名、和枚举类型的取值等都是标识符。

标识符的作用域是指标识符的有效范围。

标识符的可见性是指在程序哪个区域可以使用。

C++中标识符的作用域有函数原型作用域局部作用域(块作用域)类作用域命名空间作用域

1.函数原型作用域

在声明函数原型时形参的作用范围就是函数原型作用域,这是C++程序中最小的作用域。例:double ares(double r)

r的作用范围就在函数area形参列表的左右括号之间:

2.局部作用域

程序中使用相匹配的一对大括号括起来的一段程序称为块。作用域局限在块内的称为局部作用域。

3.类作用域

类可以被看成是一组有名字的成员的集合,类X的成员m具有类作用域。

4.命名空间作用域

一个命名空间确定了一个命名空间作用域,凡是在该命名空间之内声明的、不属于前面所述的各个作用域的标识符,都属于该命名空间作用域。

命名空间是为了消除程序各大模块之间同名引起的歧义。

定义命名空间的一般形式如下

namespace 命名空间名

{命名空间内的各种声明(函数声明、类声明、...)

}

在命名空间内部可以直接引用当前命名空间中声明的标识符,如果需要引用其他命名空间的标识符,需要使用下面的方式:

命名空间名::标识符名

具有命名空间作用域的变量也称为全局变量。

相关推荐
Yawesh_best19 小时前
告别系统壁垒!WSL+cpolar 让跨平台开发效率翻倍
运维·服务器·数据库·笔记·web安全
Ccjf酷儿21 小时前
操作系统 蒋炎岩 3.硬件视角的操作系统
笔记
习习.y1 天前
python笔记梳理以及一些题目整理
开发语言·笔记·python
在逃热干面1 天前
(笔记)自定义 systemd 服务
笔记
DKPT1 天前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring
QT 小鲜肉1 天前
【孙子兵法之上篇】001. 孙子兵法·计篇
笔记·读书·孙子兵法
星轨初途1 天前
数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析
c语言·开发语言·数据结构·经验分享·笔记·算法·排序算法
QT 小鲜肉1 天前
【孙子兵法之上篇】001. 孙子兵法·计篇深度解析与现代应用
笔记·读书·孙子兵法
love530love1 天前
【笔记】ComfUI RIFEInterpolation 节点缺失问题(cupy CUDA 安装)解决方案
人工智能·windows·笔记·python·插件·comfyui
愚戏师1 天前
MySQL 数据导出
数据库·笔记·mysql