类和对象
类简单来说就是将方法和定义封装到一块,类似于“结构体”的一个变量,与结构体不同的是,结构体中只有变量,而类中不仅有变量,还有对变量操作的方法。
写一个简单的类
calss A
{
friend class B;
public: //公共的(该文件中的任意位置都可以访问)
int Max(int a,int b)
{
return a > b ? a : b;
}
private: //该类私有的(只有该类的成员才能访问)
int a;
char b;
char *c;
protected: //本类和子类类中的变量可以访问
}
private 关键字:类默认的访问限定,将其中的实现细节隐藏,对外只提供接口
该类中的方法实现在类中,也可以在类外实现,但必须在类中声明;
类外实现需要添加空间作用域;
类成员方法使用:
①本类变量直接访问
②非本类的变量访问则需要在本类的类中声明友元函数,如上面的代码,需要注意的是
友元关系是单向的,而本类不可以访问该类中的方法
友元关系会破坏封装性,不安全,尽量不要使用
使用类成员方法时
①类中的方法以内联函数的形式展开
②类外的函数以普通函数压栈入栈的方式调用
调用类成员方法,生成函数符号时,用_thiscall调用约定;函数自带this指针,指向该
类的入口地址
类中默认的六个函数
①构造函数
②析构函数
③拷贝构造函数
④赋值运算符的重载函数
⑤取地址操作符的重载函数
⑥const修饰的取地址操作符的重载函数
默认函数如果用户不提供,则由系统提供;反之亦然
构造函数
作用:给对象的内存做初始化
函数名:与类名相同,无返回值
参数:参数数目由用户确定
构造函数可以重载,只能由系统调用
不依赖对象
默认的构造函数体为空
析构函数
作用:释放对象所占的资源(除了栈以外的资源)
函数名:~+类名
参数:对象
可以由用户调用(但不建议),系统一定会自己调用,调用两次会使程序直接奔溃
依赖对象
不可以重载
拷贝构造函数
作用:用一个已存在的对象生成一个同类型的对象
函数名:与类名相同
参数:一定写成引用的形式
如果不加引用将递归调用该函数,形成死循环导致栈溢出,程序奔溃,无法生成形参对象
系统提供的构造函数为浅拷贝,当有指针存在时,会使两个指针指向同一块内存块,析构
函数调用时,该内存块将重复释放,导致程序奔溃
深拷贝:为指针new一个新得内存块,其他的数据依次赋值
赋值运算符的重载函数
作用:用一个已存在得对象给相同类型得对象赋值
函数名:类名+&+operator+=()
参数:对象
步骤:
①自赋值判断
②释放旧资源
③生成新资源
④赋值
注意:有指针时也需要深拷贝
拷贝构造函数与赋值运算符的重载函数区别:
拷贝构造函数从字面上看,是属于构造函数,因此,拷贝构造函数和构造函数一样,也是为了生成新对象 。相反,赋值运算符的重载函数则不会生成新对象,它是给一个已存在的对象赋值。