成员变量和成员函数分开存储

Posted boyboy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了成员变量和成员函数分开存储相关的知识,希望对你有一定的参考价值。

  • 当创建 一个空对象,空对象也占有一个字节的空间,目的是为了区分空对象所占内存的位置

  • class person

    void text()
    person p;
    sizeof(p);
  • 非静态成员变量由类型所占的字节数有关,不属于类对象上

  • 静态成员变量是不属于类对象上

  • 静态成员函数不属于类对象上

this指针

  • this指针指向被调用的成员函数所属的对象

  • 每一个非静态成员都有this指针,无需书写

this指针的作用

class person

public:
person(int age)

this->age=age;//由this的定义指向的是p1.

int age;

void text()

person p1(15);
  • 可利用*this返回对象的本体,实现链式编程思想

  • 链式this的返回值是引用,引用直接返回对象。不返回引用则会复制一份数据,返回的不是原来的对象

空指针可以调用成员函数

  • 令对象为空

  • class person

    public:
    void shouperson()

    cout<<"校长"<<endl;

    void shouperson02()

    if(this==NULL)

    return ;

    cout<<m_age<<endl;//这里默认一个this->m_age;调用时this指向了空指针

    int m_age;
    ;
    void test()

    person *p=NULL;

const修饰成员函数

  • 常函数

  • 成员函数后加入const

  • 成员函数属性的声明前加入关键字mutable后,常函数中依然可以修改

    • //在类中
      class person

      public:
      void shouperson()const

      this->m_a=100;//const下的this的指向不可以改变,属于指针常量。

    • class person

      public:
      int m_age;
      mutable int m_b;
  • 常对象

  • 声明对象前加入const称该对象为常对象,也是不可以属性也是不可以修改的。

  • 常对象只能调用常函数,就是都加const

         class person
      public:
      void person(int age)const
     
      m_age=age;
     
      int m_age;
      ;
      int main()
     
        const person p(10);//常对象
     
  •  

函数指针成员变量

【中文标题】函数指针成员变量【英文标题】:function pointer member variable 【发布时间】:2020-09-11 15:53:42 【问题描述】:

我在 double ()(double) 类型的类中有一个成员变量,但是有些函数 id 喜欢存储,它们有第二个默认参数,所以它们是 double ()(double , double) 所以我不能将它存储在我当前的成员变量中。

我是否可以将我的成员变量设为双精度 ()(double, double),以便它也可以存储 ()(double)?有什么不同的方法可以完成我想要的吗?或者在使用 2 个参数 vs 1 个参数的情况下,我需要 2 个不同的变量吗?

【问题讨论】:

请显示您所指的代码,而不是仅仅描述它。 【参考方案1】:

你需要两个变量。调用中的参数数量必须与函数指针变量中的参数数量相匹配,因此您不能将同一个变量用于不同数量的参数。

如果您一次只需要其中一个,则可以通过使用联合来节省结构中的空间。

double somefunc(double);
double otherfunc(double, double);

struct mystruct 
    union 
        double(*onearg)(double);
        double(*twoarg)(double, double);
     func
    // other members
;

mystruct obj;

obj.func.onearg = somefunc;
double foo = obj.func.onearg(1.2);
obj.func.twoarg = otherfunc;
double bar = obj.func.twoarg(2.5, 11.1);

【讨论】:

这正是我想要做的!请您解释一下这是如何节省空间的?我以前从未使用过联合。 联合对两个成员使用相同的内存。你只能阅读你写给它的最后一个成员。

以上是关于成员变量和成员函数分开存储的主要内容,如果未能解决你的问题,请参考以下文章

成员变量,成员函数和对象初始化

零碎记忆

局部变量和成员变量的区别

静态数据成员 和 静态成员函数

请问啥是成员函数的定义?

类型存储和变量