C/C++小课之类和对象

简介

如何理解类和对象?

类是一种自定义数据类型,用定义出来的变量就是对象

格式:

  • 数据类型 数据;
  • int a;
  • A a();

这一章的主要问题就是如何设计实现使用类。

设计和实现分别对应类的抽象和封装;使用即最后一步,用类实现功能。

简单地说:面向对象就是将事物定义(包括抽象和封装)成类并使用。

类的抽象和封装

抽象

计算机软件开发采用的抽象方法主要有两种:

  • 过程抽象

    结果给出了函数的名称、接收的参数和能够提供的功能。

  • 数据抽象

    数据抽象是面向对象程序设计方法,以数据为中心

    结果形成某事物的类,其中包括成员变量成员函数

简单来说,就是找出一个类有哪些变量功能,但不用封装

比如这是一个点餐系统。

点餐系统类图.png

封装

分为两部分:

  • 接口

    使用者看到的东西

  • 实现

    实现抽象出的类,写.cpp代码

简单地说,就是写代码。

比如:对老师来说,课代表就是接口,课代表怎么收作业就是实现。

提问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Cxy{
public:
double height;
void growTaller()
{
cout << "drinkMilk" << endl;
height+=2;
};
};

int main()
{
Cxy cbh;
cbh.growtaller();
return 0;
}

请找出代码里的类、对象、抽象、封装。

成员函数

常量成员函数

C++中,为了禁止成员函数修改数据成员的值,可以使用常量成员函数。

语法:

1
2
3
class X{
T f(T1, T1, ...) const;
};

注意

  • 只有类的成员函数才能定义为常量函数,普通函数不能。
  • 常量成员函数与const参数没有关系

对象

  • 每个对象的数据成员都有自己独立的存储空间。就像int变量一样。
  • 注意:一个类的成员函数只有一份,所有对象共用。
  • 注意:类的static成员只有一份,它并不算对象的数据成员。

构造函数设计

默认构造函数

定义

书上P97下边给的定义是最准确的。

想想之前讲的默认的含义。

简单来说:如果用类定义对象时,我们没有给参数的话,调用的就是默认构造函数。

分类

默认构造函数有两种:

  • 不带参数的构造函数

    1
    A();

    可以是我们自己定义的,也可以是编译器合成的。

  • 所有形参都提供了默认值的构造函数

    这个当然是我们自己定义的。

构造函数与初始化列表

初始化列表次序

初始化列表中的成员初始化次序与他们在类中的声明次序相同,与初始化列表中的次序无关。

1
2
3
4
5
6
7
8
9
class A{
public:
int a;
int b;
int c;
A(int aa,int bb,int cc):b(aa),a(bb),c(cc){
cout << "I am a handsome constructor yo" << endl;
}
};

提问:初始化次序是什么?

初始化列表执行时间

类内初始值$\rightarrow$构造函数初始化列表$\rightarrow$构造函数体

what必须采用初始化列表?

C++11之前

一个类的

  • 常量成员
  • 引用成员
  • 类对象成员
  • 子类构造函数对基类构造函数的调用
  • 等等

必须通过初始化列表进行初始化。

C++11之后

除了初始化列表,可以用类内初始值yo。

析构函数

若有几个对象同时结束生存期,析构函数调用顺序与构造函数顺序相反。

静态成员

关键字:static

静态成员可以是变量,也可以是函数。

注意:静态成员函数不可以访问非静态成员。think why?

意义

表示这个成员是属于整个类的。

声明和定义

示例:

1
2
3
4
5
6
class Boy{
public:
static int boyNum; //男孩的数量
};
static int Boy::boyNum; //未初始化
//static int Boy::boyNum = 0;//初始化

在类内static int number;,仅仅是声明

原则上,定义必须写在类外:static int Boy::boyNum;,值默认为0,也可以进行初始化。

访问

两种方式:

  • 通过类名访问(非静态成员不能以这种这样访问

    1
    cout << Boy::boyNum << endl;
  • 通过对象访问

    1
    2
    Boy cbh();
    cout << cbhboyNum << endl;

看看下边讲的this指针?

this指针

含义

this用来标识一个对象,是该对象的地址,类型是Boy* const,隐含在非静态成员函数的参数里。

应用

静态成员函数没有this指针,所以不可以访问非静态成员。

常量成员函数的this,类型是const Boy *


作者:@臭咸鱼

本文为作者原创,转载请注明出处:https://chouxianyu.github.io

欢迎讨论和交流!