this指针
- this指针是一个特殊的指针,其指向的就是对象的本身
Human::Human(int age, int salary) {
cout << "调用自定义的构造函数" << endl;
this->age = age; //this是一个特殊的指针,指向这个对象本身
this->salary = salary;
name = "无名";
addr = new char[64];
strcpy_s(addr, 64, "China");
}
静态数据成员
-
对于非const的类静态成员,只能在类的实现文件中初始化。
const类静态成员,可以在类内设置初始值,也可以在类的实现文件中设置初始值。(但是不要同时在这两个地方初始化,只能初始化1次)
//定义静态数据成员
static int number;
//初始化静态数据成员(初始化要在类的外面进行)
int Student::number = 0;
// 类的普通成员函数,可以直接访问静态成员(可读可写)
int get_number() {
return number;
}
1)静态数据成员
对象的成员函数(没有static的成员函数)内部,可以直接访问“静态数据成员”
类的静态成员函数(有static的成员函数)内部,可以直接访问“静态数据成员”
即:所有的成员函数,都可以访问静态数据成员。
类不能直接访问普通的静态数据成员(Human::humanCount 非法)
- 示例
#include <iostream>
#include <string>
using namespace std;
class Student {
public:
//自定义的默认构造函数
Student() {
name = "无名";
age = 18;
++number;
}
//析构函数
~Student() {
cout << "调用析构函数" << endl;
--number;
}
//获取姓名
string get_naem() {
return name;
}
//获取年龄
int get_age() {
return age;
}
// 类的普通成员函数,可以直接访问静态成员(可读可写)
int get_number() {
return number;
}
private:
string name;
int age;
//定义静态数据成员
static int number;
};
//初始化静态数据成员
int Student::number = 0;
int main(void) {
Student s;
cout << s.get_naem() << "的年龄是:" << s.get_age() << endl;
cout << "一共创建了" << s.get_number() << "个学生" << endl;
return 0;
}
静态成员函数
-
上一节get_number的讨论:
当需要获取总的人数时,还必须通过一个对象来访问,比如s.get_number();
如果当前没有可用的对象时,就非常尴尬,不能访问get_number();
void test() {
cout << "总人数: ";
// ??? 没有可用的对象来访问get_number();
}
如果为了访问总的人数,而特意去创建一个对象,就很不方便,
而且得到的总人数还不真实(包含了一个没有实际用处的人)
解决方案:
把get_number()方法定义为类的静态方法!
// 在类里面声明
static int get_number();
/*我把静态成员函数定义在类的外面
(定义在类的里面也是可以的,我为了使文章看起来方便,就把定义实现在类里面)*/
//静态方法的实现,不能加static
int Student::get_nubmer() {
// 静态方法中,不能访问实例成员(普通的数据成员)
// cout << age;
// 静态方法中,不能访问this指针
// 因为this指针是属于实例对象的
// cout << this;
//静态方法中,只能访问静态数据成员
return number;
}
//使用方法
Student::get_number()
类的静态方法:
\1. 可以直接通过类来访问【更常用】,也可以通过对象(实例)来访问。
\2. 在类的静态方法中,不能访问普通数据成员和普通成员函数(对象的数据成员和成员函数)
- 示例
#include <iostream>
#include <string>
using namespace std;
class Student {
public:
//自定义的默认构造函数
Student() {
name = "无名";
age = 18;
++number;
}
//析构函数
~Student() {
cout << "调用析构函数" << endl;
--number;
}
//获取姓名
string get_naem() {
return name;
}
//获取年龄
int get_age() {
return age;
}
//获取人数
static int get_number();
private:
string name;
int age;
//定义静态数据成员
static int number;
};
//初始化静态数据成员
int Student::number = 0;
/*我把静态成员函数定义在类的外面
(定义在类的里面也是可以的,我为了使文章看起来方便,就把定义实现在类里面)*/
//静态方法的实现,不能加static
int Student::get_number() {
// 静态方法中,不能访问实例成员(普通的数据成员)
// cout << age;
// 静态方法中,不能访问this指针
// 因为this指针是属于实例对象的
// cout << this;
//静态方法中,只能访问静态数据成员
return number;
}
int main(void) {
cout << "一共创建了" << Student::get_number() << "个学生" << endl;
return 0;
}
2)静态成员函数
对象可以直接访问静态成员函数
类可以直接访问静态成员函数(Human::getHumanCount())
在类的静态成员函数(类的静态方法)内部,不能直接访问this指针和对象的数据成员!
在类的静态成员函数(类的静态方法)内部,只能访问类的数据成员