类和对象提高
this指针
作用:指向成员函数所作用的对象
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
class Complex
{
public:
double real, imag;
void Print(){
cout << real << ',' << imag;
}
Complex(double r, double i):real(r), imag(i)
{}
Complex AddOne()
{
//等价于real++
this -> real ++;
//等价于Print()
this -> Print();
return *this;
}
};
静态成员函数中不能使用this指针,因为静态成员函数并不具体作用于某个对象,因此,静态成员函数的真实的参数的个数就是程序中写出的参数个数
静态成员变量&静态成员函数
静态成员:在说明前面加了static关键字的成员
class CRectangle
{
private:
int w, h;
//静态成员变量
static int nTotalAre;
static int nTotalNumber;
public:
CRectangle(int w_, int h_);
~ CRectangle();
//静态成员函数
static void PrintTotal();
};
- 普通成员变量和静态成员变量的区别是普通的成员变量每个对象各有一份,而静态的成员变量只有一份为所有对象所共享,另外sizeof运算符不会计算静态成员变量,普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象,因此静态成员不需要通过对象就能访问。
- 静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在。
- 静态成员函数本质上是全局函数
- 必须在定义类的文件中对静态成员变量进行一次说明或初始化,否则编译能通过,链接不能通过。
- 在静态成员函数中,不能访问非静态成员变量,也不能跳用非静态成员函数
如何访问静态成员
//类名::成员名
CRectangle::PrintTotal();
//对象名、成员名
CRectangle r;
r.PrintTotal();
//指针->成员名
CRectangle *p = &r;
p -> PrintTotal();
//引用.成员名
CrRectangle &ref = r;
int n = ref.nTotalNumber;
成员对象和封闭类
有成员对象的类叫做封闭类
任何生成封闭类对象的语句,都要让编译器明白成员对象,是如何初始化的,具体做法就是通过封闭类的构造函数的初始化列表
CCar::CCar(int p, int tr, int w):price(p), tyre(tr, w)
{};
封闭类构造函数和析构函数的执行顺序
- 封闭类对象生成时,先执行所有对象成员的构造函数,然后才执行封闭类的构造函数
- 对象成员的构造函数调用次序和对象成员在类中的说明次序一致,与它们在成员初始化列表中出现的次序无关
- 当封闭类的对象消亡时,先执行封闭类的析构函数,然后再执行成员对象的析构函数。次序和构造函数的调用次序相反
常量对象
如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字
在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数,常量成员函数在执行期间不应该修改他所作用对象。因此,在常量成员函数中不能修改成员变量的值,也不能调用同类的非常量成员函数。
- 两个成员函数,名字和参数表都一样,但是一个是const,一个不是,算重载
友元
友元分为友元函数和友元类两种
1、友元函数:一个类的友元函数可以访问该类的私有成员
2、友元类:如果A是B的友元类,那么AA的成员函数可以访问B的私有成员,友元类之间的关系不能传递不能继承