一,静态数据成员
需求分析:
需要获取总的人数,如何实现?
只能使用一个全局变量,然后在构造函数中对这个全局变量进行修改
缺点:使用全局变量不方便,破坏程序的封装性。(全局变量容易被修改,其他人可能也用到这个全局变量,这样的话就会被重定义。开发中少用,或者尽量不用全局变量)
关于这个缺点的解决方案:
使用类的静态成员。
头文件:Human.h
class Human { public: int getCount(); private: string name = "Unknown"; int age = 28; // 类的静态成员 static int count; };
初始化类中的静态成员:
在类Human的实现文件:Human.cpp,中初始化:
#include "Human.h" // 初始化类的静态成员 int Human::count = 0; Human::Human() { cout << "调用构造函数:" << this << endl; name = "无名氏"; age = 18; salary = 30000; addr = new char[ADDR_LEN]; strcpy_s(addr, ADDR_LEN, "China"); count++; } // 类的普通成员函数,可以直接访问静态成员(可读可写) int Human::getCount() { //count = 100; //可以在类的public方法中访问静态成员,不建议这样写,不规范 return count; }
主函数main.cpp文件中的实现:
#include "Human.h" int main(void) { Human h1; cout << h1.getCount() << endl; Human h2; cout << h1.getCount() << endl; system("pause"); return 0; }
对于非const的类静态成员,只能在类的实现文件中初始化。
const类静态成员,可以在类内设置初始值,也可以在类的实现文件中设置初始值。(但是不要同时在这两个地方初始化,只能初始化1次)
二,静态成员函数
关于静态数据成员中,getCount的讨论:
当需要获取总的人数时,还必须通过一个对象来访问,比如h1.getCount().
如果当前没有可用的对象时,就非常尴尬,不能访问getCount()!
void test() { cout << "总人数: "; // ??? 没有可用的对象来访问getCount() }
如果为了访问总的人数,而特意去创建一个对象,就很不方便,
而且得到的总人数还不真实(包含了一个没有实际用处的人),如下:
void test() { Human tmp; //创建一个对象来访问getCount() cout << "总人数: " << tmp.getCount() << endl; }
如何解决呢???
解决方案:
把getCount()方法定义为类的静态方法!
类的静态方法:
1.可以直接通过类来访问【更常用】,也可以通过对象(实例)来访问。
2.在类的静态方法中,不能访问普通数据成员和普通成员函数(对象的数据成员和成员函数)
Human.h:
#pragma once ...... class Human { public: static int getCount(); };
Human.cpp:
//静态方法的实现,不能加static int Human::getCount() { // 静态方法中,不能访问实例成员(普通的数据成员) // cout << age; // 静态方法中,不能访问this指针 // 因为this指针是属于实例对象的 // cout << this; // 静态方法中,只能访问静态数据成员 return count; }
main.cpp:
void test() { // 直接通过类名来访问静态方法! // 用法:类名::静态方法 cout << Human::getCount(); } int main(void) { Human h1, h2; test(); return 0; }
图像说明:
总结:
1)静态数据成员
对象的成员函数(没有static的成员函数)内部,可以直接访问“静态数据成员”
类的静态成员函数(有static的成员函数)内部,可以直接访问“静态数据成员”
即:所有的成员函数,都可以访问静态数据成员。
类不能直接访问普通的静态数据成员(Human::humanCount 非法)
2)静态成员函数
对象可以直接访问静态成员函数
类可以直接访问静态成员函数(Human::getHumanCount())
在类的静态成员函数(类的静态方法)内部,不能直接访问this指针和对象的数据成员!
在类的静态成员函数(类的静态方法)内部,只能访问类的数据成员,也就是静态数据成员!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)