一、this指针
一个对象由属性(数据)和行为(函数)组成。
每个对象都只存储了自己的数据成员,并没有保存函数。例如,sizeof(d1) == 4;
成员函数存储于.text(代码段),只保存一份,则同类型的对象共用。
this 的类型为:类名 * const(例如:Demo * const)
问题:相同的成员函数,如何区分不同的对象?
相同的成员函数通过this
指针来区分不同的对象。
在C++中,类的成员函数是通过对象调用的,每个对象调用成员函数时,编译器会自动将对象的地址作为隐式参数传递给成员函数,这个隐式参数就是this
指针。this
指针是一个指向当前对象自身的指针,它在类的非静态成员函数中自动存在,用于访问类的非静态成员变量和成员函数。
1、this指针的作用
1.访问成员变量
class Student
{
private:
int _age;
public:
void setAge(int age)
{
this->_age = age;//通过this指针访问变量
}
};
2.调用其他成员函数:在成员函数内部调用其他成员函数时
class Student
{
private:
int _age;
public:
void setAge(int age)
{
this->_age = age;
show();//调用另一个成员函数,传递this指针
}
void show()
{
cout << "Age:" << this->_age << endl;//通过this指针访问成员变量
}
};
3.区分同名函数:当成员函数的参数名与成员变量名相同时
class Student
{
private:
int id;
public:
void setId(int id)
{
this->id = id;// 使用this指针区分参数和成员变量
}
};
2、this指针的用法
1、用this表示调用该函数的那个对象的地址
例: this->x = x;
2、用*this表示调用该函数的那个对象本身
例: (*this).x = x;
二、静态成员
用关键字static说明的成员,称为静态成员。
1.静态成员变量
静态成员变量用于同类型的对象之间实现数据共享;
静态成员变量不属于对象,而属于类型,它不占用对象的存储空间;
静态成员变量不能用构造函数初始化,必须在类外初始化;
2.静态成员函数
1. 静态成员函数同样不属于对象,而属于类型;
2. 静态成员函数的调用方式:
(1)使用对象调用
对象名.静态成员函数(参数列表);
(2)使用类名调用
类名::静态成员函数(参数列表);
3. 静态成员函数中没有this
静态成员函数 不能 访问 非静态的成员;
静态成员函数 不能 说明为 只读成员函数;
#include <iostream>
using namespace std;
// 有一个自定义类型,在程序中创建了多个这种类型的对象,在某一时刻,需要统计该类型对象的个数
class Demo
{
public:
Demo()//构造函数
{
++count;
}
~Demo()//析构函数
{
--count;
}
// 静态成员函数
static int getCount()
{
return count;
}
private:
static int count; // 静态成员变量声明
};
// 静态成员变量必须类外初始化
int Demo::count = 0;
void foo()
{
Demo d1;
// count = 200; // error
}
void bar()
{
Demo d2[100];
// 输出Demo类型对象的个数
cout << "count = " << d2[0].getCount() << endl; //
}
int main(int argc, char const *argv[])
{
cout << Demo::getCount() << endl;
Demo d0;
foo();
bar();
return 0;
}
练习:现实日期Date和时间Time类型
#include <iostream>
#include <time.h>
using namespace std;
class Time
{
public:
Time(int h, int m, int s) : _h(h), _m(m), _s(s) {}
void print() const
{
cout << "Time(" << this->_h << ":" << this->_m << ":" << this->_s << ")" << endl;
}
static Time currentTime()
{
time_t secs = time(NULL);
struct tm *p = localtime(&secs);
int h = p->tm_hour;
int m = p->tm_min;
int s = p->tm_sec;
return Time(h, m, s);
}
private:
int _h;
int _m;
int _s;
};
int main(int argc, char const *argv[])
{
Time t1(0, 0, 0);
t1.print();
Time t2(12, 0, 0);
t2.print();
Time t3 = Time::currentTime();
t3.print();
return 0;
}
标签:函数,静态,成员,int,对象,static,age,指针
From: https://blog.csdn.net/2301_77732216/article/details/143684694