静态成员变量及函数
使用static关键字定义,需要注意静态变量不单独属于某一个对象,所有该类的对象都可以访问同一个静态变量,但是私有静态变量不能共享。成员函数一样。
class car
{
public:
static string m_name;//静态成员变量
//静态成员函数只能访问静态变量,因为静态成员函数所有对象共享,故调用时里面如果使用了非静态变量
//又因为静态成员函数不属于类对象本身,则编译器无法识别调用的是哪个对象的非静态变量
//更简单的说,当直接使用域作用符,如car::nameIs("BWM",1);里面包含非静态变量
//但是并不能知道调用的是谁的num变量,甚至这个类还没创建过对象,那怎么用
static void nameIs(string name)//static void nameIs(string name,int num)
{
m_name = name;
//m_num = num;
cout<<"The car's name is "<<name<<endl;
}
private:
static int m_num;
};
//静态变量使用前需要在类外初始化
string car::m_name = " ";
car c1;
//可以访问
c1.m_name="sss";//类对象访问
car::m_name="sss";//域符号访问
//不可访问
c1.num=1;//使用错误,没有访问权限
成员变量和成员函数分开存储,只有非静态变量属于类创建的对象的内存空间
class car{};
car c1;
cout<<sizeof(c1)<<endl;
//直接sizeof(car)也是一样的,此时字节大小为1;空对象也占据一个字节,用于区分不同的空对象
class car
{
int a;
};
car c2;
cout<<sizeof(c2)<<endl;
//输出为4,非静态变量占据类对象的存储空间,此时只算上成员变量的存储空间,不会额外再分配一个字节空间
class car
{
int a;
static int b;
};
car c3;
cout<<sizeof(c3)<<endl;
//输出为4,静态变量不占据类对象的存储空间
class car
{
int a;
static int b;
void nameIs(){}
};
car c4;
cout<<sizeof(c4)<<endl;
//输出为4,成员函数不占据类对象的存储空间
//而成员函数实际上只有一个存储空间,所有同类对象都调用的其实是一个成员函数
当调用成员函数的时候,该对象会在函数内调用一个this指针,当然,是隐式的,我们虽然看不到,但是要知道是这么回事,指针指向当前的对象,故,调用的函数也是当前对象的函数了
this指针
this指针是本身就存在的,我们直接使用,其本质是一个指针常量,以下的this指针:car* const this=当前对象地址;
class car
{
public:
car(int num,string name)
{
//this指针指向当前对象,在使用构造函数时,将外部的参数传给形参,当形参名字和类内部变量相同
//this指针指向的表示该对象的变量,而不是传过来的形参
this->num=num;
this->name=name;
}
this* addNum(car &c);
private:
int num;
string name;
};
//this指针可以返回当前对象
```cpp
//该函数在上类之内, 通过this指针解引用取出当前指向的对象,则可以利用同一个函数链式操作
//在这里不能写成car car::addNum(car &c),因为值返回的话会创建新的副本,返回的不是对象本身
//返回的是当前对象经过拷贝构造函数创建的副本对象,下面的链式调用时,不会是c1的num一直加,而是
//执行第一次相加之后,就是副本的num在相加了
car& car::addNum(car &c)
{
this->num +=c.num;
return *this;
}
//函数链式操作如下
car c1(1,"BWM");
car c2(2,"WuLing");
c1.addNum(c2).addNum(c2).addNum(c2).addNum(c2);//此时c1.num结果为1+2+2+2+2