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

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
2025版最新开发一款大模型需要经过哪些步骤?开发一款大模型的完整流程,收藏这篇就够了
2023-01-25
$.inArray函数判断数组中的是否包含字符串
2023-01-25
2025版最新渗透测试和黑客工具列表,零基础入门到精通,收藏这一篇就够了
2023-01-25
2025版最新网络安全入门书籍整理大全,零基础入门到精通,收藏这篇就够了
2023-01-25
2025版最新网络安全知识入门及学习流程(非常详细)零基础入门到精通,收藏这篇就够了
2023-01-25
2025版最新网络安全等级保护测评指南,零基础入门到精通,收藏这篇就够了
2023-01-25
2025版最新运维怎么转行网络安全?零基础入门到精通,收藏这篇就够了
2023-01-25
2025版最新黑客学习网站(非常详细),零基础入门到精通,看这一篇就够了
2023-01-25
2025版网络工程11个高含金量证书(非常详细)零基础入门到精通,收藏这篇就够了
2023-01-25
2025自学成为黑客必读的5本书籍,带你从小白进阶成大佬
2023-01-25
20万高薪专业-网络安全(非常详细)零基础入门到精通,收藏这一篇就够了
2023-01-25
23张图告诉你组建一个网络需要用到哪些硬件设备?路由器、交换机、防火墙是不是就够了?
2023-01-25
24 WEB漏洞-文件上传之WAF绕过及安全修复_阿里云盾waf绕过怎么修复
2023-01-25
#12 btrfs文件系统
2023-01-25
#3194. 去月球
2023-01-25
24.线程
2023-01-25
#Leetcode# 28. Implement strStr()
2023-01-25
$route 和 $router详解、区别、示例代码
2023-01-25
$scope angular在controller之外调用
2023-01-25
&和&&的区别
2023-01-25