1.定义: class 类名
{
private:(只能被类本身函数和友元访问,系统默认私有)
protected:(类本身函数,友元,该类的派生类成员函数访问)
public:
};
2.成员函数的定义:
(1)类体内:
成员函数规模小,类体内定义,内联函数
(2类体外:
在类体外定义时,用::指定成员函数属于哪个类
格式:
返回类型 类名::成员函数名(参数说明)
{ 函数体 }
3.struct的成员默认public
模板只能写template<class T> 不能写 template<struct T>
4.对象:
类定义的变量叫做对象
定义:
- 常用!!!
2.
3.
5.类作用域中定义的数据成员不能用auto,register,extern修饰符,可以用static;
类作用域外,通过对象名或者指向对象的指针引用类的成员。
对象名和 . 一起使用
指向对象的指针和 ->一起使用 或者 (*对象指针名).成员名
6.构造函数:
在对象被创建时利用特定的初始值构造对象,把对象置于一个初始状态。
性质:
- 和类有完全相同的名字
- 没有类型说明,没有返回值,void也不行
- 可以重载,一个类可以定义多个参数不同的构造函数
- 构造函数的参数可以在声明的参数表中给予初始值
- 每个类必须至少有一个构造函数,如果没有,编译器提供一个默认的构造函数(无参),不做任何初始化的工作
- 程序中不能直接调用构造函数,创建类的对象时自动调用
- 最好是public的,private构造函数不能直接初始化对象
- 无参构造函数
- 带有参数的构造函数
构造函数名(类型1 形参1.类型2 形参2)
类名 对象名 (实参1,实参2)
Tip:对象定义没有给实参,调用无参构造函数。给出实参,调用带参数的构造函数。
7.参数初始化表:
对数据成员的初始化在构造函数首部完成,不是函数体内。
Cuboid::Cuboid(int h,int w,int len):height(h),width(w),length(len)
{ }
8.构造函数重载:
类声明的构造函数个数没有要求,只要每个构造函数的形参表唯一
对于任何一个对象来说,只执行一个构造函数,根据定义对象是否带参数确定指向哪一个构造函数。
9.一般把无参或者全部使用默认值参数的构造函数称为默认构造函数。
10.子对象:
定义一个新类时,把一个已经定义的类的对象作为类的数据成员,这个类对象叫做子对象
子对象构造函数的顺序取决于子对象成员在类中的声明顺序,与它们在成员初始化表的位置无关
定义类的对象时,先调用各个子对象成员的构造函数,初始化相应的子对象成员,然后再执行类 的构造函数,初始化类中其他成员。
11.拷贝构造函数:
同类对象的复制,将一个对象的非静态数据成员值一一复制给另一对象的对应成员。
如果定义了拷贝构造函数,在用一个对象初始化该类另一个对象时就会被调用。
拷贝构造必须和类名称一样,函数的形参时本类型的一个引用变量,必须是引用。
12.拷贝构造函数被调用的三种情况:
(1)用一个已经初始化的对象去初始化同类另一个对象
Sample S2(S1);
(2)如果某函数有一个参数是类A的对象,当该函数被调用时,类A的拷贝构造被调用。
(3)函数返回值是类A的对象,函数返回时,类A的拷贝构造函数被调用
13.析构函数:
当对象脱离作用域系统自动执行。
格式:
要求:
不能带任何参数,没有返回值,void也不行,最多一个析构函数,不能重载
说明:
1.对象数组生命周期结束时,每个元素的析构函数都会被调用
2.析构函数在对象作为函数返回值返回后被调用,函数调用过程中临时对象生成时会有构造函数被调用,临时对象消亡导致析构函数调用
14.构造函数和析构函数的调用顺序:
一般情况:
最先调用构造函数的,最后调用析构函数
特殊情况:
1.全局对象(函数体外定义),在程序开始时(包括main()函数所有函数之前)执行构造函数,程序结束或者调用exit()终止程序调用析构函数。
2. 局部对象(函数体内定义),程序执行到定义对象的地方调用构造函数,函数结束时调用析构函数。
3. 用static定义的静态局部对象,首次到达对象定义位置时调用构造函数,程序结束时调用析构函数。
4. new运算符生成的对象,创建对象的时候调用构造函数,只有用delete释放对象时才调用析构函数。如果不使用delete运算符,析构函数不会被调用。
15.对象的动态建立与释放
,new动态创建对象,首先为类的对象分配内存空间,然后自动调用构造函数初始化对象的数据成员,最后将该对象的起始地址返回。
16.静态成员:
声明为static的类成员叫做静态成员。被类的所有对象共享。
类的静态成员包括静态数据成员和静态成员函数,可以是public,protected,private。
不能在类体内初始化,只能在类体内声明,在类体外初始化。
类外初始化格式: 不能加static
数据类型名 类名::静态数据成员名=初值
说明:
1.不管一个类的对象有多少个,每个静态数据成员只有一个,共享。一旦改变,所有同类对象共享修改后的值。
2.一个类的对象空间,不包括静态成员的空间
3.静态数据成员存储空间的分配在一开始运行分配
4.静态数据成员的初始化语句,不属于任何类,也不属于主函数在内的任何函数
5.如果静态数据成员没有赋初值,自动赋值0.
17.静态成员函数:
静态成员函数属于类,没有this指针,只访问静态成员,也可以访问全局变量。
说明:
1.出现在类体外的不能指定关键字static
2.静态成员函数之间可以相互访问
3.非静态成员函数可以任意访问静态成员函数和静态数据成员
4.静态成员函数不能直接访问非静态成员函数和非静态数据成员。
18. 类的共有静态数据成员可以用类的对象访问,也可以直接用作用域运算符::通过类名来访问。