博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++对象原型
阅读量:7142 次
发布时间:2019-06-28

本文共 1306 字,大约阅读时间需要 4 分钟。

hot3.png

C++的对象在内存中是怎么表示的,数据成员和成员函数之间有什么关系,this指针到底是干嘛的。

这里不考虑虚函数表

一个对象内存中占的大小其实就是他的数据成员的大小

   这是我用的例子

  

class T{public:    T() {}    void info() const {        cout << "info\n";    }    void printValue() const {        cout << "value is " << m_value << '\n';    }    void fun() const {        cout << "fun!\n";    }private:    int m_value;};
注释掉fun函数和没注释的大小都是一个int的大小,4byte。

那么成员函数类是共用一份代码,但是我们在使用的时候,为什么感觉是每个对象都自己有一份,这和两个方面有原因。我们在施加一个动作给一个对象时,这个对象的状态只能由它的数据成员能够记录和表示,我们在需要施加操作的对象身上由它的对象的数据成员所代表的状态是我们预期的结果,是我们感觉是各自一份。还有就是this指针是造成假象的技术实现。

int main(){    T *p = NULL;    p->info();//    p->printValue();//    t *p2 = NULL;//    info(p2);    //    cout << sizeof(T) << endl;            return 0;}
我们在main函数中写了这段代码,你认为只是不可接受的,确实是,你不能对一个NULL执政施加操作,可是结果是

这样的

它很好的运行了。

现在我们写了这一段代码

struct t {    int m_value;};void info(const t *p) {    cout << "info\n";}void printValue(const t *p) {    cout << "value is " << p->m_value << '\n';}
在main函数中写了这段

int main(){//    T *p = NULL;//    p->info();//    p->printValue();    t *p2 = NULL;    info(p2);//    cout << sizeof(T) << endl;    return 0;}
其实这两个已经可是了解C++对象的原型了,p2就是this指针,它是NULL,不过我们在info中没有使用它,所以它没什么影响,这就是第一段代码能够运行的原因,可是如果我们call了printValue函数,this是NULL,我们在函数中访问了它的m_value,我们省略了this->,这就和
void printValue(const t *p)
一样

一个内存段错误。

转载于:https://my.oschina.net/u/854744/blog/418435

你可能感兴趣的文章
历史画作遭破坏,3D打印和 AI 来帮忙
查看>>
Atom飞行手册翻译: 3.8 编写spec
查看>>
智能健康行业突破不大,却走向“歪路”
查看>>
机器人也有触感了!斯坦福大学开发人工感觉神经系统让蟑螂抽搐
查看>>
5 Reasons Why You Should Try Kibana
查看>>
阿里云网络漏洞扫描系统AVDS(商业化)发布
查看>>
Pam认证模块
查看>>
解决tomcat"Could not reserve enough space for object heap"
查看>>
sersync实现主机实时双向同步
查看>>
卸载并重新配置mysql服务
查看>>
同行的一个案例---删除表,需要恢复
查看>>
python splinter 小坑说明
查看>>
JAVA并行框架:Fork/Join
查看>>
控制input输入格式
查看>>
linux系统上安装java
查看>>
38.进程管理与计划任务---PS、Top、Crontab
查看>>
0301_互连模拟
查看>>
一次XEN启动中的错误捕获
查看>>
重大里程碑:顶级科学家达成23条人工智能发展原则!
查看>>
esxi嵌套华为Fusioncomputer安装VRM几个关键步骤。
查看>>