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

#include <iostream>

using namespace std;

class Test {
public:
    Test():x(0), y(0)
    {
        cnt++;
    }
    int x;
    int y;
    void print() const;
    static int cnt;
    static void print_s();              //静态成员函数不能够设置为const函数 ( cv qualifier??? )
};

int Test::cnt = 0;                      //静态成员变量的初始化

void Test::print_s()
{
    cout<<cnt<<" object(s) has(have) been created"<<", visited by print_s function"<<endl;
}

void Test::print() const
{
    cout<<"x = "<<x<<" y = "<<y<<endl;
}
int main()
{
    int Test::*ptr;                     //声明指向类非静态成员变量的指针
    void (Test::*print_p)() const;      //声明指向类非静态成员函数的指针
    print_p = &Test::print;             //赋值
    ptr = &Test::x;                     //赋值
    Test a;
    a.*ptr = 1;                         //调用
    (a.*print_p)();                     //调用,前面的括号不能掉(运算符的优先级)

    int *ptr_1 = &Test::cnt;            //声明和初始化指向类静态成员变量的指针
    cout<<*ptr_1<<" object(s) has(have) been created"<<", visited by pointer"<<endl;    //通过指针访问静态成员变量
    Test::print_s();                    //通过静态成员函数访问静态成员变量
    return 0;
}
时间: 2024-10-27 14:07:27

c++指向类(非)静态成员的指针用法的相关文章

C++静态成员函数不能调用非静态成员变量

其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话 因为无论是静态成员函数还是静态成员变量,它们都是在类的范畴之类的,及在 类的整个生存周期里始终只能存在一份.然而非静态成员变量和非静态成员函数 是针对类的对象而言. 然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能 调用具体实例对象的成员. 下面我们来测试一下: 先在静态成员函数中调用静态成员变量: 1 #include <iostream> 2 using namespace std; 3 4

C++静态成员函数访问非静态成员的几种方法

大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去.当然在C++灵活性下面,类还具备了静态成员和静态函数,即 class A { public: static void test() { m_staticA += 1; } private: static int m_staticA; int m_a }; 此时你的test函数只能去访问m_staticA成员,而不能去访问m_a.同学可能会问,这算

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静

c++: 指向类成员函数的指针

指向函数的指针有和指向类成员函数的指针的有什么不同? int f(char a, float b);如果它是普通函数,则它的类型是 int (*)(char, float);如果它是非静态成员函数,则它的类型是 int(ClassName::*)(char, float);如果它是静态成员函数,则它的类型是和普通函数一样. 如何把一个类的成员函数传递给event handler, 线程启动函数等? 类的成员函数必须和一个类的实例结合起来才有意义.可以写一个函数来包装类的成员函数. class X

关于C++静态成员函数访问非静态成员变量的问题

静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存.静态成员函数没有隐含的this自变量.所以,它就无法访问自己类的非静态成员 代码如下: class a{public:  static FunctionA()  {     menber = 1;  } private:  int menber;} 编译上述代码,出错.原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的

指向类成员函数的指针

//类中的普通成员变量,类名::变量名,在栈上 //类名 *指针名=new 类名,在堆上 //类的静态成员变量,在静态区 //函数都在代码区,类的函数.静态函数都是共享的 void(myclass::*p1)() = myclass::run;//指向类成员函数的指针 void(*p2)() = myclass::go;//指向静态成员函数的指针 1 #include <iostream> 2 3 class myclass 4 { 5 public: 6 int num; 7 int dat

为什么c++中,有时可以用类名直接访问非静态成员函数?

正规的C++语言标准目前(截止到C++14)应该还不支持这种调用方法.目前微软似乎在它的VC++中推行一种叫做C++/CLI的标准,有可能会支持这种调用,如果一定要用这种调用方法的话,还应该用VS2013尝试编译运行一下. 实际上,C++语言中类的静态成员函数本身应该是所有这一类对象的集体所具有的行为,就是说,不是某一个对象能够具有或者说实现的:而非静态成员函数应该是某一个对象自己的动作行为,跟本类其他对象乃至整个类关系不大,是对象依靠自己的数据以及函数参数就可以完成的行为.根据以上的讨论,我们

C++对象模型:成员变量&lt;一&gt;非静态成员

非静态成员变量,分别两种可能,要么类自定义,要么继承而来.根据<深度探索C++对象模型>的解读. class X { private: int x,y,z; }; 在这个类中,有三个私有成员变量(不管私有,保护,或公有),都按照某个次序排列(一般根据定义的先后顺序),唯一需要注意的是:某些变量需要对齐填充.在内存中的排列次序依次为:x,y,z:假如需要对这三个变量进行操作,实际会在成员函数中填充一个指针,参照<深入浅出MFC>. class X { public: void f()

静态成员(static的用法)

摘要:为实现一个类的多个对象之间的数据共享,C++提出了静态成员的概念,包括 静态数据成员和静态成员函数:现在分别进行讨论: 静态数据成员:格式如下:static  数据类型  数据成员名; #include<iostream> using namespace std; class Node { private: double x_; double y_; static double E; //节点处的弹性模量 public: Node(double x=0,double y=0) { x_=