c++指向类的非静态成员和静态成员的指针的用法

类的成员按照功能包括两种:数据成员和函数成员。  而按照状态又分为静态和非静态。 所以下面将从这几个方面来简介。

 一.非静态成员:

一:数据成员

声明语法:

类型说明符  类名::*指针名;          //声明指向数据成员的指针,注意这个指针和this指针一样,是每个实例化后的对象共有的

eg:int point::*num_ptr;

对指针赋值的语法:

指针名=&类名::数据成员名 

ed:num_ptr=&point::m_a; //num_ptr是上面我们定义的指针的名字,point是我们自定义的类,m_a是point类中的一个数据成员

访问方式:

1.具体实例化的对象名.*类成员指针名

2.具体实例化的对象指针名->*类成员指针名   //看似复杂,其实仔细看看就能和我们之前学过的原理结合上

具体程序实例:

#include <iostream>
using namespace std;
class point {
public:
	int m_a;
	int m_b;
	point(int m_a, int m_b) {
		this->m_a = m_a;
		this->m_b = m_b;
	}
	int get_a() {
		return m_a;
	}
	int get_b() {
		return m_b;
	}
};
int main(){
  point p(1,2);  point *p1=&p;//定义一个指针去指向p这个整体的大对象
  int  point::*num_ptr; //定义一个指向类的成员的指针
  num_ptr=&point::m_a; //指向m_a这个元素
  
  //调用方法1
  cout<<p.*num_ptr<<endl;
  //调用方法2
  cout<<p1->*num_ptr<<endl;

}

二:函数成员

声明语法:

类型说明符  (类名::*指针名)(参数表,没有参数就为空);

eg:  int(point:: * funptr)();

赋值语法:

funptr = &point::get_a;

 

调用语法: 

1.(对象名.*类成员指针名)(参数表)

2.(对象指针名->*类成员指针名)(参数表)

#include <iostream>
using namespace std;
class point {
public:
	int m_a;
	int m_b;
	point(int m_a, int m_b) {
		this->m_a = m_a;
		this->m_b = m_b;
	}
	int get_a() {
		return m_a;
	}
	int get_b() {
		return m_b;
	}
};
int main() {
	point p(1, 2);
	point* p1 = &p;
	int(point:: * funptr)();  //相比于指向数据成员,指向函数的情况也不过就是多了几层括号而已,便于我们简记用法。
	funptr = &point::get_a;  //注意这里的函数名后面不加()
    //调用方法1
	cout << (p.*funptr)() << endl;
    //调用方法2
	cout << (p1->*funptr)() << endl;

   //顺便提一下我们之前的两个访问方式,横向对比记忆
   cout<<p.get_a()<<endl;
   cout<<p1->get_a()<<endl;

}

 

 

二:静态成员类型。 

一:静态数据成员

 

#include <iostream>
using namespace std;
class person {
public:
	static int count;
	person() {
		++count;
	}
	static void print() {
		cout << count << endl;
	}
};
int person::count = 0;
int main() {
	person p;
    //与非静态数据成员不同,前半部分定义指针的时候省略了类名
	int* p1 = &person::count;
    //因为静态成员是类对象共有的,所以不依赖于每个对象,直接解引用就可以
	cout << *p1 << endl;
}

二:静态函数成员

#include <iostream>
using namespace std;
class person {
public:
	static int count;
	person() {
		++count;
	}
	static void print() {
		cout << count << endl;
	}
};
int person::count = 0;
int main() {
    //相比于非静态函数的写法,类的静态函数也是前半部分不用写类名
	void (*p2)() = &person::print;

	p2();//调用的时候写成p2()或者*p2;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ad_m1n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值