C++入门Step18【类的静态成员】

类的静态成员:

  1. 类的静态成员变量:

    1. 引出:比如Student类中,姓名,学号,性别等属于个体成员,但是要表达学生的校长,或学校等信息时,不能说每个学生都有一个校长和学校,这个信息应该属于学生这个Student类,并非个体,所以这类信息不便于作为普通成员变量;这时就需要用到静态成员变量了。

    2. 作用与特点:

      ①. 所有对象都可以直接访问这个静态成员变量,而且值相同;
      ②. 静态成员变量在内存中只占用一份存储空间;
      ③. 静态成员变量的值对于所有对象来说都是一样的。如果其中一个对象调用函数将其改变了,那么其他成员在访问这个静态成员变量的时候的值都是改变之后的;
      ④. 只要在类中定义了类的静态成员变量,那么就占用存储空间了,不管有没有定义这个类的对象,因为静态成员变量不属于任何类对象,而是属于该类;
      ⑤. 静态数据成员需要在类外进行声明或声明并初始化,否则在使用的时候会报链接的错误;
      ⑥. 类的静态成员在定义的时候需要加 static,在类外声明的时候不需要加 static 关键字;
      ⑦. 不能用构造函数的参数初始化表的形式对静态成员进行初始化操作;
      ⑧. 静态数据成员既可以通过对象名引用,也可以通过类名来直接引用;
      ⑨. public 公有类型的静态数据成员,可以被类的对象引用,也可以直接用类名来引用。但如果静态数据成员被定义成private私有的,那么通过对象或者类名来引用都是不可以的,必须通过类的public类型的静态成员函数来引用了。

  2. 类的静态成员函数:
    跟类的静态成员变量一样,类的静态成员函数也不属于该类的对象,而是属于这个类。
    ①. 类的静态成员函数可以通过类对象调用,也可以通过类名调用;
    ②. 类的普通成员函数中可以使用标识该类对象的this指针,但是类的静态成员函数是属于类,不属于任何对象,所以静态成员函数中没有this指针,也就无法访问本类的非静态成员变量,因为不知道是哪个对象的。
    ③. 所以,类的静态成员函数可以直接引用类的静态成员变量,因为他们的作用域相同,都是属于该类的。

  3. 举个栗子:

//inc.h文件
class Student
{
private:
    static std::string school;	//定义私有静态成员变量
    char* p_name;
    char* p_No;
    int age;
    bool sex;
public:
    void set_nnas();
    void print_imt();
    static void set_schl(std::string schl);	//定义公有静态成员函数设置学校信息
    static std::string get_schl();	//定义公有静态成员函数获取学校信息
    Student();
    explicit Student(char* t_name, char* t_No, int t_age, bool sex);
    ~Student();

};

//export.cpp文件
#include <iostream>
#include <cstring>
#include "inc.h"
#define LEN 8
#define DFT "default"
#define HINT1 "1.构造函数被成功调用"
#define HINT2 "2.析构函数被成功调用"

std::string Student::school = DFT;	//初始化静态成员变量school

void Student::print_imt()
{
    std::cout << "The information of student:\n\tSchool:"<<school<<"\n\tName:" << p_name <<"\n\tNo.: "<<p_No<<"\n\tAge: "<<age<<"\n\tSex: "<<sex<<std::endl;
}

Student::~Student()
{
    delete [] p_name;
    delete [] p_No;
    std::cout<< HINT2 <<std::endl;
}

Student::Student(char* t_name, char* t_No, int t_age, bool t_sex):age(t_age),sex(t_sex)
{

    int ne_len = std::strlen(t_name),no_len = std::strlen(t_No);
    p_name = new char[ne_len+1];
    memset(p_name,0,ne_len+1);
    strcpy(p_name,t_name);
    p_No = new char[no_len+1];
    memset(p_No,0,no_len+1);
    strcpy(p_No,t_No);
    std::cout<< HINT1 <<std::endl;
}

Student::Student()
{
    p_name = new char [LEN];
    memset(p_name, 0, LEN);
    strcpy(p_name,DFT);
    p_No = new char [LEN];
    memset(p_No, 0, LEN);
    strcpy(p_No,DFT);
    age = 0;
    sex = true;
    std::cout<< HINT1 <<std::endl;
}

void Student::set_schl(std::string schl) {	//实现set_schl()函数
    school = schl;
}

std::string Student::get_schl() {	//实现get_schl()函数
    return std::__cxx11::string(school);
}

//main.cpp文件
#include <iostream>
#include <cstring>
#include "inc.h"
using namespace std;

void test()
{
    Student::set_schl("延安大学");	//用Student类通过set_schl()设置学校信息
    Student* stud01 = new Student("王*", "1110618*******", 21, true);
    stud01->print_imt();	//用stud01获取学校信息
    delete stud01;
    Student* stud02 = new Student;
    stud02->print_imt();	//用stud02获取学校信息
    stud02->set_schl("西安理工大学");	//用stud02通过set_schl()设置静态成员school
    cout<<"\n学校:"<<Student::get_schl()<<"\n"<<endl;	//用Student类通过get_schl()获取学校信息
    delete stud02;
}
int main()
{
    test();
    return 0;
}

在这里插入图片描述
部分解释性话术引自VC驿站:https://www.cctry.com/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值