一、面向对象基础
C++不是纯面向对象语言,而是基于面向对象的。因为c++包含了c,c是面向过程的。
面向对象的三大特性:封装、继承、多态
类(class/struct)包含了数据(成员变量)和函数(成员函数)
知识点一:三种访问修饰符public、protected、private
1、public成员可以在类外部之间访问,其他两个不行。
2、类中没有定义限定符,就默认为private。
3、类的访问限定符体现了面向对象的封装性。
如果在类中只做了成员函数的声明,在类外面定义时,需要表明是那个类:
class A{
public:
void fun1();
private:
int age;
};
void A::fun1(){
cout>>age;
}
知识点二:类的实例化
1、类只是一个定义了成员变量和函数的一个集合,并没有给他们分配实际的空间来存储它们。
2、类的实例化就是创建对象的过程,他给类中的数据分配了空间,这个对象占用实际的物理空间存储类的成员变量。
3、每个对象的大小为类中所有成员变量的大小之和,遵循内存对齐原则。
注意
1、为什么要内存对齐——首先内存对齐的缺点就是浪费空间,但是他的访问速度快。因为计算机都是按4字节的整数倍开始读取,若内存对齐只需读一次,未对齐需要读两次,所以内存对齐大大提高效率。
2、空类也会占一个字节,虽然里面什么也没有,但是为了能实例化出对象,会占1个字节,表示这个空类在计算机系统里存在。
二、类
1、this指针
(1)每个成员函数都有一个指针形参,它就是this指针,它是隐式的。构造函数比较特殊,没有这个this形参。
编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作实参传递给成员函数的第一个形参this指针。
(2)this指针是编译器自己处理的隐含指针形参,我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用时显示传递对象的地址给this指针。
2、类的6个默认成员函数:构造函数、拷贝构造函数、析构函数、赋值操作符重载、取地址操作符运算重载、const修饰的取地址操作符重载
1、构造函数:对象的定义和初始化
成员变量为私有时,要对它进行初始化,必须用一个公有的成员函数来进行访问。同时这个函数应该有且仅在定义对象时自动执行一次,这时调用的构造函数称为构造函数。
构造函数是特殊的成员函数,它具有以下特征:
1、构造函数的函数名和类名相同;
2、没有返回值;
3、实例化对象时自动调用;
4、可重载;
5、可在类中和类外进行定义;
6、如果没有构造函数,编译器会自动生成一个缺省的构造函数,但是只要定义了,系统就不会生成;
7、无参和全缺省值构造函数都认为是缺省的构造函数、并且缺省的构造函数只等有一个。
2、拷贝构造函数:创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数,这也是特殊的构造函数。
特征:
1、拷贝构造函数其实是一个构造函数的重载。
2、拷贝构造函数的参数必须使用引用传参,使用传值会造成无限递归。
3、若未显示的定义,系统会默认缺省的拷贝构造函数。缺省的拷贝构造函数会依次拷贝类成员进行初始化>
3、析构函数:当一个对象的生命周期结束时,c++编译系统会自动调用一个特殊的成员函数——析构函数。
特征:
1、析构函数是在类名前加~。
2、析构函数无参数,无返回值。
3、一个类只有一个析构函数,若未显示定义,系统会自动生成缺省的析构函数。
4、对象生命周期结束时,编译器自动调用析构函数。
5、析构函数并不是删除对象,而是做一些清理工作。
4、运算符重载:C++为了增强程序的可读性,支持运算符重载
注意:不能重载的运算符:.* ?: :: sizeof .
特征:
1、operator+运算符 构成函数名
2、运算符重载以后不能改变运算符 优先级、结合性、操作个数。
(1)赋值运算符重载
拷贝构造函数是创建对象,使用一个已有对象来初始化这个准备创建的对象。
赋值运算符的重载是对一个已经存在的对象进行拷贝赋值。
三、const成员函数/内联/友元/静态成员:
const成员函数:在成员函数后面加const,const修饰this指针所指的对象,也就是调用这个const成员函数的对象在函数内不会改变。
内联:inline修饰的函数叫做内联函数,编译时c++编译器会将调用内联函数的地方展开,没有函数数据压栈的开销,提高了运算效率。
注意:
1、inline是一种空间换时间的做法,省去调用函数的开销,所以代码很长、有循环/递归的函数不适合内联,若有,编译器会自动优化,省略内联。
2、inline必须和函数定义放在一起,仅放在函数定义是不起作用的。
3、定义来类内的成员函数默认为内联函数。
问题:c++建议用const/枚举/内联来代替宏。宏增强代码的复用性,提高性能;但是,宏不方便调试,可读性差,容易发生错误,没有类型安全检查。
友元:c++中友元函数允许在类外访问该类中任何成员,就像成员函数一样,友元函数用关键字friend指明。
注意:友元函数不是类的成员函数;友元函数可以通过对象访问所有成员。
友元一定程度上破坏了c++的封装,友元不宜多用,在最恰当的地方使用友元。
类的静态成员:类里面static修饰的成员,称为静态类成员。类的静态成员是该类型的所有对象所共享的。静态成员函数只能访问静态的成员变量,因为静态的成员函数没有this指针,可以使用 类名::作用域访问符 直接调用静态成员函数。