
【C/C++基础进阶系列】C/C++ 对象模型 -- 对象语义
成员变量是包含在每个对象中的,占用内存。 成员函数不占用类对象内存空间。
发布日期:2021-05-07 20:53:19
浏览次数:12
分类:精选文章
本文共 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程序库探秘》等专业书籍,内容基于实际学习和实践经验,力求准确性和易读性。如有错误,请指出。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月01日 14时25分36秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【SSL】1072砝码称重
2019-03-04
js数据结构--队列--常见操作
2019-03-04
vue.js常用指令及用法
2019-03-04
vuex的核心概念和运行机制
2019-03-04
SSLOJ1692 USACO 3.2 Magic Squares 魔板&P2730
2019-03-04
暴打算法:王者级数据结构与LeetCode笔记,一路绿灯杀进字节Java岗
2019-03-04
限时开源!公布半小时下载量达10W:阿里大牛出品「MyCat笔记」
2019-03-04
阿里Java全线成长宝典,从P5到P8一应俱全
2019-03-04
计算机系统原理——cachelab 实验1(第一周)
2019-03-04
JAVA初窥-DAY07
2019-03-04
数组--Go语言学习笔记
2019-03-04
Redis (三)——Linux 上安装 Redis
2019-03-04
c编程常见错误-函数声明没有参数类型声明
2019-03-04
概率论 贝叶斯公式
2019-03-04
java 重写(override)和重载(overload)区别
2019-03-04
java 多态
2019-03-04
java 多态类型转换
2019-03-04
java ==和equals
2019-03-04
java 接口(Interface)多态特性
2019-03-04
搜集整理随机产生人的姓名的2种方法
2019-03-04