统计对象中某个成员变量的访问次数

实例1:适用于非const对象

#include <iostream>
#include <string>

using namespace std;

class Test
{
private:
    int m_value;
    int m_count;
public:
    Test(int value = 0)
    {
        m_value = value;
        m_count = 0;
    }

    int getValue()
    {
        m_count++;
        return m_value;
    }

    void setValue(int value)
    {
        m_count++;
        m_value = value;
    }

    int getCount()
    {
        return m_count;
    }
};

int main()
{
    Test t;

    t.setValue(100);
    cout << "t.m_value = " << t.getValue() << endl;

    cout << "t.m_count = " << t.getCount() << endl;

    return 0;
}

实例2:适用于const对象和非const对象

mutable是为了突破const函数的限制而设计的
mutable成员变量将永远处于可改变的状态 
mutable在实际的项目开发中被严禁滥用

通过mutable来进行修饰,const对象将名存实亡。

mutable的深入分析
-mutable成员变量破坏了只读对象的内部状态
-const成员函数保证只读对象的状态不变性
-mutable成员变量的出现无法保证状态不变性

#include <iostream>
#include <string>

using namespace std;

class Test
{
private:
    int m_value;
    mutable int m_count;
public:
    Test(int value = 0)
    {
        m_value = value;
        m_count = 0;
    }

    int getValue() const
    {
        m_count++;
        return m_value;
    }

    void setValue(int value)
    {
        m_count++;
        m_value = value;
    }

    int getCount() const
    {
        return m_count;
    }
};

int main()
{
    Test t;

    t.setValue(100);
    cout << "t.m_value = " << t.getValue() << endl;

    cout << "t.m_count = " << t.getCount() << endl;

    const Test ct(200);
    cout << "ct.m_value = " << ct.getValue() << endl;
    cout << "ct.m_count = " << ct.getCount() << endl;

    return 0;
}

这种方案不是很完美,因为你适用了mutable,该关键字破坏了const成员函数的特性。

实例3:完美的方案

#include <iostream>
#include <string>

using namespace std;

class Test
{
private:
    int m_value;
    int * const m_pCount; //一旦指向某片存储空间,那么将不能被改变。但里面的值可以改变
public:
    Test(int value = 0): m_pCount(new int(0))
    {
        m_value = value;
    }

    int getValue() const
    {
        *m_pCount = *m_pCount + 1;
        return m_value;
    }

    void setValue(int value)
    {
       *m_pCount = *m_pCount + 1;
        m_value = value;
    }

    int getCount() const
    {
        return *m_pCount;
    }
};

int main()
{
    Test t;

    t.setValue(100);
    cout << "t.m_value = " << t.getValue() << endl;

    cout << "t.m_count = " << t.getCount() << endl;

    const Test ct(200);
    cout << "ct.m_value = " << ct.getValue() << endl;
    cout << "ct.m_count = " << ct.getCount() << endl;

    return 0;
}

这个地方很巧妙,就是利用const关键字修饰的指针变量,一旦被初始化后它所指向的存储空间不能被改变,但是这片存储空间中的值是可以改变的。正好对应了const成员函数中,成员变量的值是不能被改变的(在此处指的是指针所指向的存储空间不能改变)

原文地址:https://www.cnblogs.com/-glb/p/12294624.html

时间: 2024-10-05 11:25:04

统计对象中某个成员变量的访问次数的相关文章

【c++程序】在数组对象中初始化成员变量

#include<iostream> using namespace std; class area { public: area(int l,int w){length=l;width=w;cout<<"调用构造函数,设置长和宽:"<<length<<"\t"<<width<<endl;} ~area(){cout<<"调用析构函数释放内存,此时长和宽:"<

java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况

/* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Parent{ } class Child extends Parent{ int num = 4; } */ /* 样例3: class Parent{ void show(){ System.out.println("Parent Show!"); } } class Child exten

JavaSE8基础 当父类与子类中的成员变量重名了,使用super.名字 来访问父类的成员变量

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: /* * 当父类与子类中的成员变量重名了,使用super.名字 来访问父类的成员变量 */ //基类 class Person { public int num = 1; } //子类 class Javaer extends Person { //子类中的成员变量与父类重名了 public int num

为什么C++中复制构造函数可以调取其他对象中的私有变量

私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有成员变量,因而,产生了困惑.下面以具体实例进行说明: 疑惑:为什么第26行和第32行代码可以编译通过,而第39行和第40行代码会产生编译错误? 1 class CTest { 2 public: 3 CTest(int i); 4 CTest(const CTest& rhs); 5 CTest

java中的成员变量、类变量,成员方法、类方法 属性和方法区别

成员变量:包括实例变量和类变量,用static修饰的是类变量,不用static修饰的是实例变量,所有类的成员变量可以通过this来引用. 类变量:静态域,静态字段,或叫静态变量,它属于该类所有实例共有的属性.而且所有的实例都可以修改这个类变量的值(这个类变量没有被final修饰的情况),而且访问类变量的时候不用实例,直接用类名.的方式就可以. 成员方法:包括实例方法和类方法,用static的方法就是类方法,不用static修饰的就是实例方法.实例方法必须在创建实例之后才可以调用. 类方法:和类变

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

福利-&gt;KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型. 废话不多说,直接上代码: 1.工具类(其实就是NSObject的一个分类)头文件 1 #import <Foundation/Foundation.h> 2 3 @interface NSObject (YSRuntime) 4 5 /** 6 返回当前类的属性数组 7 8 @return 属

Objective-c中定义成员变量

ios定义成员变量的方法: 如果只是内部访问,完全可以直接用_xxx(下划线),无需自己定义,编译器会自动生成 如果需要外部访问这个变量,可以用 @property xxx ; @synthesize xxx = _xxx ,这样,编译器会自动生成 get,set函数 :可以很明确的表明这是一个向外部提供set.get方法的属性. http://www.tairan.com/archives/194 Objective-c中定义成员变量

C++对象中数据成员的布局

首先,对于类中定义的变量,各个编译器内部并没有强制规定成员布局的情况. 只有一些简单的标准: 1    在同一个访问控制标号(public,private,protected)中定义的非static变量在对象的内存布局顺序是按照定义的顺序. 2    不同的访问控制标号下的(非static)成员变量并无先后顺序的要求. 3    编译器可能还会合成一些内部使用的数据成员,比如虚函数表的指针vptr:C++标准并没有规定那些内部产生的指针的位置 在内存中的位置,甚至可以放在其他成员变量之间. 比如