博客
关于我
【C/C++基础进阶系列】C/C++ 对象模型 -- 对象语义
阅读量:353 次
发布时间:2019-03-04

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

C/C++ 对象模型 - 对象语义

1. 类对象的结构 - 对象占用的空间

在C/C++中,类对象的大小主要由非静态成员变量决定。每个类对象至少会分配一个字节来存储其起始地址,即使成员变量为空。成员函数也不占用类对象的内存空间,因为它们是与类对象无关的部分。

例如:

class A{};A a;sizeof(a) = 1 // 等同于 sizeof(A)

这里,a 是一个空类对象,占用了1个字节。

如果类中有成员变量:

class A{public: int ab;}; A a;sizeof(a) = 4 // 等同于 sizeof(A)

此时,对象 a 占用了4个字节,用于存储成员变量 ab

成员函数不影响类对象的大小,因为它们是静态的或与类无关。

结论

  • 成员变量是包含在每个对象中的,占用内存。
  • 成员函数不占用类对象内存空间。

  • 2. 类对象调用方法 - this 指针调整

    在C++中,this 指针用于指向当前对象。在多继承的情况下,编译器会自动调整 this 指针的值,以指向正确的子对象。例如:

    class A{public: void func(){}};class B{public: void func(){}};class C : public A, public B {public: void func() {}};C obj;obj.func(); // 调用A的子对象的func()

    无论调用哪个函数,this 都会指向对象的起始地址。

    示例

    class A{public: int a; A() { cout << "A::A()的this指针是:%p\n"; } void func(){}};class B{public: int b; B() { cout << "B::B()的this指针是:%p\n"; } void func(){}};class C : public A, public B {public: int c; C() { cout << "C::C()的this指针是:%p\n"; } void func(){}};C myc;// sizeof(A)=4, sizeof(B)=4, sizeof(C)=12myc.func(); // 调用A类的子对象的func()

    这里,myc 是一个C对象,继承自A和B。sizeof(C) 为12,因为它包含A和B的成员变量。


    3. 对象初始化与函数传参、返回值

    3.1 对象初始化,函数传参与函数返回对象过程简析

    在C++中,对象的初始化可能涉及构造函数(构造函数)和拷贝构造函数。当函数传递对象作为函数参数时,编译器会自动插入拷贝构造函数调用。

    例如:

    class X{public: int m_i; X(X tmpx) { m_i = tmpx.m_i; } X() { m_i = 0; }};X x0; // 只构造对象,未调用构造函数X x1 = x0; // 调用拷贝构造函数X x2(x0); // 调用拷贝构造函数

    在函数中传递对象时,编译器会自动生成临时对象并调用拷贝构造函数。

    3.2 对象初始化,函数传参与函数返回对象过程优化

    为了优化性能,可以直接构造返回对象,而不是通过拷贝。例如:

    CTempValue Double(CTempValue ts) {    return CTempValue(ts.val1 * 2, ts.val2 * 2);}

    这里,编译器会直接构造并返回临时对象,无需额外拷贝。


    参考致谢

    本文参考了《C++新经典》和《C++11/14高级编程-Boost程序库探秘》等专业书籍,内容基于实际学习和实践经验,力求准确性和易读性。如有错误,请指出。

    转载地址:http://wlmr.baihongyu.com/

    你可能感兴趣的文章
    蓝桥杯基础练习 特殊回文数 (原来暴力破解这么直接……)
    查看>>
    Qt 从文本文件中读入一行内容但不包含换行符
    查看>>
    【STL】容器适配器之stack、queue用法总结
    查看>>
    社区AMA:CasperLabs是如何从众多智能合约平台脱颖而出的
    查看>>
    十大排序算法之三:插入排序(Python)
    查看>>
    利用Python实现循环队列
    查看>>
    十大排序算法之四:希尔排序(Python)
    查看>>
    利用递归实现二叉树的前中后序遍历(Python)
    查看>>
    用最大堆实现最大优先队列(Python)
    查看>>
    A*寻路算法(Python)
    查看>>
    NP问题以及一些相关知识
    查看>>
    Python刷题输入输出
    查看>>
    C++数组知识注意点
    查看>>
    冒泡排序又来啦(C/C++版本)
    查看>>
    笔试题:找亲戚(Python列表全排列,找能被7整除的数)
    查看>>
    python负数存储
    查看>>
    求二维数组中最大值的位置
    查看>>
    python中sort和sorted的区别
    查看>>
    防碰撞算法
    查看>>
    在vue中添加echarts
    查看>>