类和对象(一)
面向对象
面向对象程序设计 概念:(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。 对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
C++不是纯面向对象语言,而是基于面向对象的语言 (ps:因为它包含C的部分,C是面向过程)
访问限定符
C++中类中有三种访问限定符,分别是public(公有)private(私有)protected(保护)。
- public成员可从类外部直接访问,private/protected成员不能从类外部直接访问。
- 每个限定符在类体中可使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前。
- 类体中如果没有定义限定符,则默认为私有的。
- 类的访问限定符体现了面向对象的封装性。
###作用域 - 每个类都定义了自己的作用域,类的成员(成员函数/成员变量)都在类的这个作用域内,成员函数内可任意访问成员变量和其它成员 函数。
- 对象可以通过 . 直接访问公有成员,指向对象的指针通过 -> 也可以直接访问对象的公有成员。
- 在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
类的大小
一般来说类的大小是类里面每一个成员的和,不过依旧存在以下的规则:
1.成员函数不占类的大小。
2.空类为了占位大小依旧为一个字节。
3.static修饰的成员存储在静态区不算类的大小。
4.类的大小遵从内存对齐原则。
默认成员函数
C++类里存在六个默认的成员函数,分别为构造函数,拷贝构造函数,析构函数,赋值运算符重载函数,取地址操作符重载函数,const修饰的取地址操作符重载函数。由于前四个很重要,这里重点介绍前四个默认成员函数。
默认构造函数
成员变量为私有的,要对它们进行初始化,必须用一个公有成员函数来进行。同时这个函数应该有且仅在定义对象时自动执行一次,这时 调用的函数称为构造函数(constructor) 。 构造函数是特殊的成员函数,其特征如下:
- 函数名与类名相同。
- 无返回值。
- 对象构造(对象实例化)时系统自动调用对应的构造函数。
- 构造函数可以重载。
- 构造函数可以在类中定义,也可以在类外定义。
- 如果类定义中没有给出构造函数,则C++编译器自动产生一个缺省的构造函数,但只要我们定义了一个构造函数,系统就不会自动 生成缺省的构造函数。
- 无参的构造函数和全缺省值的构造函数都认为是缺省构造函数,并且缺省的构造函数只能有一个。
默认拷贝构造函数
创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数(Copy Constructor),拷贝构造函数是特殊的构造函 数。
特征:
- 拷贝构造函数其实是一个构造函数的重载。
- 拷贝构造函数的参数必须使用引用传参,使用传值方式会引发无穷递归调用。
- 若未显示定义,系统会默认缺省的拷贝构造函数。缺省的拷贝构造函数会,依次拷贝类成员进行初始化。
默认析构函数
当一个对象的生命周期结束时,C++编译系统会自动调用一个成员函数,这个特殊的成员函数即析构函数(destructor)
构造函数是特殊的成员函数,其特征如下:
- 析构函数在类名加上字符~。
- 析构函数无参数无返回值。
- 一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数。
- 对象生命周期结束时,C++编译系统系统自动调用析构函数。
- 注意析构函数体内并不是删除对象,而是做一些清理工作。