构造函数
构造函数:与类名相同的特殊成员函数
- 在对象完成创建的时候就自动调用进行初始化
- 无返回值,与类名相同,默认是无参数的,可以重载,可默认参数
- 一旦有显示的构造函数,那么默认的构造函数就会自动的隐藏
- 当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。
- 初始化列表中的初始化顺序,与声明顺序有关,与前后赋值顺序无关。
析构函数
析构函数:在类中定义的一个特殊的成员函数,用来清理对象,命名方式(~类名)
- 对象销毁的时候自动的调用
- 无返值 ,与类名同。无参。不可以重载与默认参数
析构函数的作用,并不是删除对象,而在对象销毁前完成的一些清理工作。
先构造的后析构
拷贝构造函数
拷贝构造函数:由己存在的对象,创建新对象。也就是说新对象,不由构造函数来构造,而是由
拷贝构造函数来完成。拷贝构造函数的格式是固定的。
class 类名
{
类名(const 类名 & another)
{
拷⻉贝构造体
}
}
class A
{
A(const A & another){}
}
- 系统提供默认的拷贝构造器。一经实现,不复存在。
- 系统提供的时等位拷贝,也就是所谓的浅浅的拷贝。
- 要实现深拷贝,必须要自定义。
友元
友元位置:友元声明以关键字 friend 开始,它只能出现在类定义中。
因为友元不是授权类的成员,所以它不受其所在类的声明区域 public private 和 protected 的影响。
通常我们选择把所有友元声明组织在一起并放在类头之后.
友元利弊:友元不是类成员,但是它可以访问类中的私有成员。友元的作用在于提高
程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问
类的私有成员。不过,类的访问权限确实在某些应用场合显得有些呆板,从而容
忍了友元这一特别语法现象。
注意事项:
1.友元关系不能被继承。
2.友元关系是单向的,不具有交换性。若类 B 是类 A 的友元,类 A 不一定是类
B 的友元,要看在类中是否有相应的声明。
3.友元关系不具有传递性。若类 B 是类 A 的友元,类 C 是 B 的友元,类 C 不一
定 是类 A 的友元,同样要看类中是否有相应的声明。
友元函数
友元函数:友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外
的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元
的名称前加上关键字 friend
一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
友元对象
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中
的隐藏信息(包括私有成员和保护成员)。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类
的友元类。
static
静态成员是属于整个类的而不是某个对象,静态成员变量只存储
一份供所有对象共用。
类的静态成员,属于类,也属于对象,但终归属于类。
注意事项:
- static 成员变量实现了同类对象间信息共享。
- static 成员类外存储,求类大小,并不包含在内。
- static 成员是命名空间属于类的全局变量,存储在 data 区。
- static 成员只能类外初始化。
- 可以通过类名访问(无对象生成时亦可),也可以通过对象访问。
- 静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员, 完成对静态数据成员的封装。
- 静态成员函数只能访问静态数据成员。原因:非静态成员函数,在调用时this 指针被当作参数传进。而静态成员函数属于类,而不属于对象,没有 this 指针。
- 静态成员函数、成员变量属于类
- 静态成员函数不包含指向具体对象的指针
运算符重载
operate后面加运算符 中间不能有空格 例如operate+
- C++不允许用户自己定义新的运算符,只能对已有的 C++运算符进行重载。
- 重载不能改变运算符运算对象(即操作数)的个数。
- 重载不能改变运算符的优先级别。
- 重载不能改变运算符的结合性。
- 重载运算符的函数不能有默认的参数
- 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。
- 用于类对象的运算符一般必须重载,但有两个例外,运算符”=“和运算符”&“不 必用户重载。
- 应当使重载运算符的功能类似于该运算符作用于标准类型数据时候时所实现的功能。
- 运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非类的成员函数也不是友元函数的普通函数
new和delete
用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正
常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分
配空间是否成功。
malloc不会调用类的构造函数,而new会调用类的构造函数
Free不会调用类的析构函数,而delete会调用类的析构函数