C++类和对象

来源:互联网 发布:安卓淘宝没有指纹支付 编辑:程序博客网 时间:2024/06/10 22:28

类和对象

类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。

与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间。而对象是类这种数据类型的一个变量,或者说是通过类这种数据类型创建出来的一份实实在在的数据,所以占用内存空间。 
类的定义 
类是用户自定义的类型,如果程序中要用到类,必须提前说明,或者使用已存在的类(别人写好的类、标准库中的类等),C++语法本身并不提供现成的类的名称、结构和内容。

class是 C++ 中新增的关键字,专门用来定义类。Student是类的名称;类名的首字母一般大写,以和其他的标识符区分开。{ }内部是类所包含的成员变量和成员函数,它们统称为类的成员(Member);由{ }包围起来的部分有时也称为类体,和函数体的概念类似。 

访问限定符:public也是 C++ 的新增关键字,它只能用在类的定义中,表示类的成员变量或成员函数具有“公开”的访问权限。 
与之对应的是private关键字,有“保护”权限。 
注意在类定义的最后有一个分号;,它是类定义的一部分,表示类定义结束了,不能省略。 
整体上讲,上面的代码创建了一个 Student 类,它包含了 3 个成员变量和 1 个成员函数。

类只是一个模板(Template),编译后不占用内存空间,所以在定义类时不能对成员变量进行初始化,因为没有地方存储数据。只有在创建对象以后才会给成员变量分配内存,这个时候就可以赋值了。

类可以理解为一种新的数据类型,该数据类型的名称是 Student。与 char、int、float 等基本数据类型不同的是,Student 是一种复杂数据类型,可以包含基本类型,而且还有很多基本类型中没有的特性,以后大家会见到。 

对象的大小、计算 
对象的大小计算依旧遵守内存对齐的原则 
结构体内存对其规则: 
1.第一个成员在与结构体变量偏移量为0的地址处。 
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 
//对齐数=编译器默认的一个对齐数与该成员大小的较小值。 
VS中默认的值为8 
gcc中的默认值为4

3.结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍。 

4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体 
的对齐数)的整数倍。

空类对象(无成员变量的类)的大小也不一样,VC中为1。 
实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以大小为1。 
 当然在不同的编译器上得到的结果可能不同,但是这个实验告诉我们,不管类是否为空类,是否有成员变量,这个类在创建对象的时候都是需要分配空间的。

四个默认成员函数

1.构造函数
成员变量为私有的,要对它们进行初始化,必须用一个公有成员函数来进行。同时这个函数应该有且仅在定义对象时自动执行一次,这时 
调用的函数称为构造函数(constructor)。 
构造函数是特殊的成员函数,其特征如下: 
1. 函数名与类名相同。 
2. 无返回值。 
3. 对象构造(对象实例化)时系统自动调用对应的构造函数。 
4. 构造函数可以重载。 
5. 构造函数可以在类中定义,也可以在类外定义。 
6. 如果类定义中没有给出构造函数,则C++编译器自动产生一个缺省的构造函数,但只要我们定义了一个构造函数,系统就不会自动 
生成缺省的构造函数。 
7. 无参的构造函数和全缺省值的构造函数都认为是缺省构造函数,并且缺省的构造函数只能有一个。 
2.拷贝构造函数 
创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数(Copy Constructor),拷贝构造函数是特殊的构造函 
数。 
特征: 
1. 拷贝构造函数其实是一个构造函数的重载。 

2. 拷贝构造函数的参数必须使用引用传参,使用传值方式会引发无穷递归调用。

3. 若未显示定义,系统会默认缺省的拷贝构造函数。缺省的拷贝构造函数会,依次拷贝类成员进行初始化。 

3.析构函数 
当一个对象的生命周期结束时,C++编译系统会自动调用一个成员函数,这个特殊的成员函数即析构函数(destructor) 
构造函数是特殊的成员函数,其特征如下: 
1. 析构函数在类名加上字符~。 
2. 析构函数无参数无返回值。 
3. 一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数。 
4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。 
5. 注意析构函数体内并不是删除对象,而是做一些清理工作。 
4.赋值运算符重载 
拷贝构造函数是创建的对象,使用一个已有对象来初始化这个准备创建的对象。 
赋值运算符的重载是对一个已存在的对象进行拷贝赋值。

运算重载符

为了增强程序的可读性,C++支持运算符重载。 
运算符重载特征: 
1. operator+合法的运算符构成函数名(重载<运算符的函数名:operator<)。 
2. 重载运算符以后,不能改变运算符的优先级/结合性/操作数个数。 
5个C++不能重载的运算符: .* /:: /sizeof /?: /.

隐含的this指针

  1. 每个成员函数都有一个指针形参,它的名字是固定的,称为this指针,this指针是隐式的。(构造函数比较特殊,没有这个隐含this形参)
  2. 编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作实参传递给成员函数的第一个形参this指针。
  3. this指针是成员函数隐含指针形参,是编译器自己处理的,我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用时显示传递对象的地址给this指针。
原创粉丝点击