1、this指针
作用:指向成员函数所作用的对象。
非静态成员函数中可以使用this指针指向函数作用的对象的指针。静态成员成员函数中不能this指针,因为静态成员函数并不具体作用于某个对象。所以静态成员函数的参数个数就是实际参数个数,非静态成员函数实际参数个数会比原来多一个this指针。
class Person
{
public:
int score;
Person(int s):score(s){}
Person Add(Person p)//相当于Person Add(Person* this,Person p)
{
this->score += p.score;
return *this;
}
};
int main()
{
Person p1(60),p2(90),p3(0);
p3 = p1.Add(p2);//相当与p3 = Add(&p1,p2);
return 0;
}
2、静态成员
在前面加了static关键字。普通成员变量每个对象都有一份,静态成员变量为所有对象共享。sizeof不会计算静态成员变量。普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象。静态成员不需要通过对象就能访问。
访问静态成员
(1)类名::成员名
(2)和访问普通成员一样(.或*或&),但意思并不是指向这个对象,只是这样表示。
静态成员变量(函数)本质上是全局变量(函数),哪怕对象不存在,类的静态成员变量也存在。设置静态成员的目的就是将和类联系紧密的全局变量和函数写到类里面,看上去像一个整体,易于维护和理解。必须对静态成员变量和函数进行声明。静态成员函数不能访问非静态成员函数(变量)。
class Person
{
private:
int score;
static int sum;
public:
Person(int s):score(s){}
Person Add(Person p1, Person p2)
{
this->sum = p1.score + p2.score;//报错,不能通过this指针访问静态成员变量
Person p;
p.sum = p1.score + p2.score;
return p;
}
static void Print()
{
cout << sum<<endl;
cout << score;//静态成员函数不能访问非静态成员函数(变量)
}
};
//静态成员变量要声明,写不写初始值都行
int Person::sum=0;
int main()
{
Person p1(60),p2(90),p3(0);
cout << Person::score;//报错,不能访问私有成员
p3 = p3.Add(p1,p2);
Person::Print();
return 0;
}
3、常量对象、常量成员
class Person
{
public:
int a;
void func(){}
void myprint() const//myprint是静态成员函数,不能修改它作用的对象
{
a = 0;//错,静态成员函数不能修改成员变量的值,静态成员变量除外,因为它本质上是全局变量。
func();//错,静态成员函数不能调用成员函数,静态成员函数除外
}
};
const Person p;//p是常量对象
p.a = 10;//错,常量对象不能修改
p.func();//错
p.myprint();//常量对象可以执行常量成员函数