this指针、静态数据

本文详细介绍了C++中的this指针,它指向对象本身,用于在成员函数中访问对象的数据成员。同时,文章阐述了静态数据成员的特性,包括它们的初始化、访问方式以及如何通过静态成员函数来访问。示例代码展示了如何在类中使用静态成员函数来统计对象的数量,强调了静态成员函数不能访问实例成员和this指针的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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指针和对象的数据成员!

在类的静态成员函数(类的静态方法)内部,只能访问类的数据成员

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值