类和对象详细介绍
1.1、类和对象基本概念
1.2、什么是对象?
1.3、什么是类?
2.1、类的声明
2.2、实例化对象
3.1、类的属性定义--数据成员
3.2、类的数据成员的特例-静态数据成员
4.0、类的方法--成员函数
4.1、类方法的定义
4.2、静态成员函数
4.3、成员函数的类别(const 的另一种用法)
5.0、特殊成员函数-构造函数 和 析构函数
5.1、构造函数的概念
5.2、构造函数的 声明 和 定义
5.3、构造函数的调用(带参数)
5.4、构造函数调用(不带参数)
5.5、构造函数声明(带有默认参数)
5.6、构造函数的重载
5.7、特殊构造函数--拷贝构造函数
5.8、析构函数
5.9、类和函数的联系
5.10、this指针
1.1、类和对象基本概念
(1)类和对象是面向对象程序设计中最基础,最重要的两个概念。
(2)在面向对象程序设计中,所有操作都是以对象为基础的。
(3)程序中的对象 是对 现实对象的抽象。
1.2、什么是对象
现实对象包括可感知的物体,以及思维中的概念;
例如:
汽车客运被看做是一个对象;学校作为一个概念也可以看成一个对象;
现实对象
有个特点:属性 和 行为的整体
示例:
一辆汽车具有车型、颜色 -》属性
并有启动,转向、刹车等-》行为
程序对象:
属性可以看做为数据;行为可以抽象为函数。
对象是:数据 和 函数 的集合。
对象是:一个完整的个体。
例如:
所有汽车都具有车型,颜色等属性,所有属性的个数相同,所有汽车都具有启动、转向、刹车等行为。
1.3、什么是类?
类:
类是指整个一类实物,一个类定义了一个模板;
类对 数据 以及 处理数据的方式(函数)进行封装;
汽车类:包括(汽车对象1、汽车对象2、汽车对象3)
类 -具体实例-》对象
类《-抽象----对象
类(class):
是将一组对象的 数据结构 和 操作相同的部分 抽出来 组成的集合,是 对象 的 共同特征 。
2.1、类的声明:
关键字class声明
class:只定义一种数据类型,并不分配内存单元;
成员访问指示符:
(1)public:
(公用成员,包括类的 属性 和 方法);
提供类的外部界面,它允许类的使用者来访问它。
(2)private:
(私有成员,包括类的属性和方法);
只能被该类成员函数访问,即只有类的本身能够访问它,任何类以外的函数对私有成员访问都是非法的。
(3)protected:
对于派生类来说,保护成员像是公有成员,可以任意访问。
但对于程序的其他部分来说,就像是私有成员不应许访问。
(4)类中的成员默认是私有的。
2.2、实例化对象
类是抽象的,不能赋值,但是 实例化的类 即 对象 能够赋值了,而且可以通过对象直接调用函数。
3.1、类的属性定义--数据成员
3.2、类的数据成员的特例-静态数据成员
static修饰;
在定义类对象时,不会为每个类对象复制一份静态数据成员,而是让所有类对象都共享一个静态数据成员。[无论new多少个,公共使用一个]
如:
class Student
{
static int counter;//用于记录学生人数
int id;
};
静态变量在定义时要进行初始化,虽然大多少编译器对静态变量会赋默认值,但还是应该自己进行初始化。
4.0、类的方法--成员函数
详讲解:一般定义方法,特殊的成员函数(构造函数 和 析构函数)
4.1、类方法的定义
又称类的成员函数,成员函数主要处理类的数据成员;
下面是 类体中的声明和定义 和类体外声明和定义
4.2、静态成员函数
static修饰,在类的各个实例化间是共享的。(和静态属性定义意思差不多)
4.3、成员函数的类别(const 的另一种用法)
const放在 函数的参数列表 和 函数体之间。
const成员函数只能读类数据成员,而不能修改类成员数据。
5.0、特殊成员函数-构造函数 和 析构函数
定义类后,经常需要一一为 对象的 成员变量指定 初始值;
虚构函数 用于定义了 类的 对象数组 后进行 初始化。
5.1、构造函数的概念
类 包含 数据成员 和 成员函数;
一个类可以创建多个对象,创建对象后,需要为每个对象的数据成员赋初值。
但一一为多个数据成员赋初值是非常烦琐的;
并且在类中声明的数据成员,是不给数据成员赋初值的。
错误例子:
class A
{
int a=0;//错误,此处不能给数据成员a赋值
};
所以c++通常使用 构造函数 来解决 这个问题。
构造函数 的 定义 和 主要功能:
构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。
在下面的示例中,定义了一个具有一个简单的构造函数,名为 Taxi 的类。然后使用 new 运算符来实例化该类。在为新对象分配内存之后,new 运算符立即调用 Taxi 构造函数。
public class Taxi
{
public bool isInitialized;
public Taxi() //构造函数 与类同名,可重载
{
//在类被实例化的时候自动调用 一般用于初始化 类的一些属性
isInitialized = true;
}
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi(); //这时会自动运行Taxi类的构造函数Taxi()
System.Console.WriteLine(t.isInitialized);
}
}
不带参数的构造函数称为“默认构造函数”。无论何时,只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。
构造函数性质:
(1)构造函数的名字必须与类同名;
(2)构造函数没有返回类型,它可以带参数,也可以不带参数;
(3)声明类对象时,系统自动调用构造函数,构造函数不能被显式调用;
(4)构造函数可以重载,从而提供初始化类对象的不同方法;
(5)若在声明时未定义构造函数,系统会自动生成默认的构造函数,此时构造函数的函数体为空.
(6)静态构造函数,用static修饰,用于初始化静态变量,一个类只允许有一个构造函数,在类实
例化时加载,这时修饰符public、private失去作用.
(7)可以使用public、protected、private修饰符。.
(8)引用父类构造时用():base()方法,引用自身重载的构造使用():this(int para).
(7)可以使用public、protected、private修饰符。
5.2、构造函数的 声明 和 定义
实际应用中,一般都要给类声明和定义构造函数;
如果没有声明和定义,编译系统会自动生成一个默认的构造函数,这个默认的构造函数不带任何参数,只能给对象开辟一个存储空间,而不能为对象中的数据成员赋初值,此时数据成员的值是随机的。程序运行时可能会出错。
5.3、构造函数的调用(带参数)
在定义了构造函数后就可以调用,一般来说,在定义对象的同时调用构造函数。
注意:一般不需要显示调用,在声明对象时系统会自动调用构造函数。
5.4、构造函数调用(不带参数)
构造函数一般需要完成对类中私有数据成员的初始化,因此它需要包含参数完成对象的初始化。
事实上,构造函数可以不带参数。
5.5、构造函数声明(带有默认参数)
5.6、构造函数的重载
C++支持函数的重载,一个类中可以有多个不同参数形式构造函数。
用类去创建一个对象,也就是在内存中产生一个类的实例时,程序将根据参数在动调用该类中的构造函数。
增加了程序设计的灵活性。
同一个类中不同构造函数的区别:参数个数,参数类型。
注意:当定义带参数的构造函数时采用默认参数,在调用时若指定了参数值,则使用指定参数值。
5.7、特殊构造函数--拷贝构造函数
C++中除了普通的构造函数外,还有特殊构造函数--拷贝构造函数
分类:
1、用户自定义拷贝构造函数
例子2:系统默认拷贝构造函数。
当用一个已经存在的对象初始化本类的新对象时,如果没有自定义拷贝构造函数,系统会自动生成一个默认的拷贝构造函数来完成初始化的工作。
5.8、析构函数
与构造函数类似,析构函数也是一种特殊的成员函数。
作用:释放分配给对象的内存空间,并做一些善后工作。
例子:
5.9、类和函数的联系
(1)类对象可以作为函数参数,也可以作为函数返回值。
(2)类对象作为函数参数传递时,可以值传递和引用传递。
(3)类对象值传递时,实参中的成员变量目录中的变量被拷贝到形参中相应的成员变量。
5.10、this指针
是隐含在成员函数内的一种指针,称为本对象的指针。
作用:
(1)显示指明类中数据成员,尤其是和形参以及全局变量相区分。(当他们同名时)
(2)返回本对象的指针和引用。
在函数成员返回时:
如果需要返回该对象的指针,使用”return this“;
如果需要返回对象的引用时,使用”return *this“;
(3)类对象值传递时,实参中的成员变量目录中的变量被拷贝到新参中相应的成员变量。