首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++初阶】和对象修炼上

只是一个类型,并不是一个实体,从得到实体的过程就被称为实例化....+中这里的参数变成了隐含的this指针,后面第9点会讲) 8./对象的大小 通过上面的知识点,我们已经知道:成员函数并没有存储在每一个实例化出的对象中,所以,对象/大小就只是包括成员变量的大小之和...,当然要满足"内存对齐规则" 只是包括成员变量的话,其实就是和C语言中struct结构体中的内存对齐规则一样,这里就不多赘述; 值得一提的是大小是多少呐?...} 通过打印结果我们看得出,实际上,大小不是0,这里为了避免实例化出来了对象,对象在取地址时出现的都为,(在内存中没有开辟空间却定义出了变量的尴尬问题),所以C++中编译器给实例化出的对象都给与了一个字节空间的大小...答案是代码1正常运行,代码2运行崩溃 或许有人说:这个p是,p->这里不是就是错的吗?

65940
您找到你想要的搜索结果了吗?
是的
没有找到

C++C++入门 — 和对象初步介绍

_class = 01; return 0; } 3 对象模型 问题:中既可以有成员变量,又可以有成员函数 那么一个的对象中包含了什么? 如何计算一个大小?...我们来做一下实验:对刚才的 person 进行大小计算: 可见person大小是 16(X64环境) 结论:一个大小,实际就是该类中”成员变量”之和,当然要注意内存对齐 注意大小类比较特殊...,编译器给了一个字节来唯一标识这个的对象 的成员函数不占用对象内存区,函数的分布位置为代码区,同一个实例化的所有对象共享相同的函数。...在C++中,(class)的成员变量在内存中的布局需要遵循内存对齐规则,主要是出于以下几个关键原因: 性能优化:(主要原因) 访问未对齐的内存地址在某些硬件架构上可能导致性能下降。...this指针可以为吗? this指针存在于哪里? 在C++中,this指针是一个隐含的、非静态成员函数内部可用的特殊指针,它指向当前正在调用该成员函数的对象实例

8310

C++大小的计算

首先我们看什么都没有的时候的例子: class test{ }; 可以看到,实例化的对象的大小为1。...这是因为即使是空白,编译器也会分配一个字节的空间来占位,用来和真正的空白/变量区别开来(毕竟实例化其实就是分配一定的内存空间,如果没有分配空间,那么就和没有实例化差不多了)。...不过注意的是,如果空白作为基被继承了的话,是不会对继承它的的空间产生影响的,即在继承的一瞬间,基大小变为0,而继承它的大小只与自己的成员变量有关(此处默认为单一继承): #include <...如果不是连续放着的,那么会分别补齐到4字节。因此,尽量“凑”变量类型到4字节,这样可以让补齐后的实例大小小一些。...++中空占一字节原因详解:建议看,对空白的讲解比较详细 sizeof计算空间大小的总结 《C++ Primer 第5版》

95620

C++】运算符重载案例 - 字符串 ③ ( 重载 左移 << 运算符 | 自定义使用技巧 | 直接访问的私有指针成员 | 为指针分配指定大小内存并初始化 0 )

一、重载 左移 << 运算符 1、左移 << 运算符作用 左移运算符重载 , 可参考 【C++】运算符重载 ⑧ ( 左移运算符重载 | 友元函数 / 成员函数 实现运算符重载 | 对象 使用 左移运算符...// 内存占用空间大小 = 字符串长度 + 1 int m_len; // 字符串指针, 指向堆内存中的字符串 char* m_p; }; 2、为指针分配指定大小内存并初始化 0 在 有参构造函数...中 , 接收 int 类型的参数 , 该参数表示字符串大小 ; 如果 参数 为 0 , 则创建一个空字符串 , 指针指向的内存空间大小为 1 , 只存放一个 ‘\0’ 字符 , 表示字符串的结尾 ;...如果 参数 大于 0 , 为 字符串指针 分配 该大小 + 1 的内存空间 , 然后将这块内存空间赋值 0 ; 代码示例 : // 有参构造函数 , 接收 int 类型值 , 表示字符串大小 String...// 内存占用空间大小 = 字符串长度 + 1 int m_len; // 字符串指针, 指向堆内存中的字符串 char* m_p; }; 2、String.cpp 实现 // 使用 strcpy

13210

C++心决之类和对象详解(上篇)(封装入门篇)

目录 1.面向过程和面向对象 2.的引入 3.的定义 4.的访问限定符及封装 4.1 访问限定符 4.2 封装 5.的作用域 6.实例化 7.对象模型 7.1 如何计算对象的大小 7.2...或者只有成员函数的会有1个字节的占位大小,仅仅只用来标记该类存在。...{ public: void f2() {} }; // 中什么都没有--- class A3 {}; 结论:一个大小,实际就是该类中 ” 成员变量 ” 之和,当然要注意内存对齐...注意大小类比较特殊,编译器给了一个字节来唯一标识这个的对象。...平台(移植性)原因不是所有的硬件平台都能够访问任意地址上的任意数据。例如:特定的硬件平台只允许在特定地址获取特定类型的数据,否则会导致异常情况。

5610

C++与对象理解和学习(上)

//通过.来调用函数Print return 0; } 对象大小的计算 既然实例化后才会占有具体的空间,那么实例化后,它的空间大小应该是多少呢?...假如是个实例化后还会不会占用空间呢?...所以实例化后的对象的大小,只需要计算成员变量大小即可,当然,对象大小的计算与struct一样遵循结构体内存对齐规则。...这里需要注意的是,假如一个中只有成员函数而没有成员变量,或者什么都没有,则实例化后对象的大小为1byte。...第一个成员在与结构体偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。

43640

C++之面向对象(上)

实例化出对象就像现实中使用建筑设计图建造出房子,一个可以实例化出多个对象,实例化出的对象是占用实际的物理空间,存储成员变量。...如何计算一个大小? 正常情况下,我们都会认为对象中应该同时包含了的成员变量和成员函数,大小应该是成员变量和成员函数在内存中所占空间的大小,那么事实如此吗?..." "<< sizeof(A3) << endl; return 0; } 运行结果如下: 结论:一个大小,实际就是该类中”成员变量”之和,当然要注意内存对齐 注意大小,其中只有成员函数或者...对象而不是设置d2对象呢?...①平台原因(移植原因) 某些编译器不能对任意内存位置进行操作,所以要将数据存储在可被操作的位置。 ②性能原因 如果没有内存对齐,对数据的访问要进行两次,有内存对齐,对数据的访问只要进行一次。

28820

精选 30 个 C++ 面试题(含解析)

不存在指向值的引用,但是存在指向值的指针。 22.基的析构函数不是虚函数,会带来什么问题? 派生的析构函数用不上,会造成资源的泄漏。 23.全局变量和局部变量有什么区别?是怎么实现的?...} 大小是1, 在C++中空会占一个字节,这是为了让对象的实例能够相互区别。...具体来说,类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给隐含加上一个字节,这样实例化之后就会拥有独一无二的内存地址。...当该空白作为基时,该类的大小就优化为0了,子类的大小就是子类本身的大小。这就是所谓的空白基最优化。...实例大小就是大小,所以sizeof(a)=1字节,如果a是指针,则sizeof(a)就是指针的大小,即4字节。

49030

浅析C++内存布局

C++程序在内存中的布局是怎样的?总结下C++内存布局的相关知识。 概述 简单总结下C++变量在内存中的布局和可执行文件相关的知识。暂未涉及虚函数,虚函数表,的继承和多态等C++对象的内存模型。...对象所占的内存空间  一个实例化对象所占空间的大小? 注意不要说大小,是的对象的大小。 首先,大小是什么?...int main() { Test test; std::cout << sizeof(test) << std::endl; //1 return 0; } 可以看到一个对象的大小...一个对象的大小是1,为什么不是0A明明是,它的大小应该为0,为什么编译器输出的结果为1呢?...这就是实例化的原因类同样被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个隐含的加一个字节,这样实例化后在内存中得到了独一无二的地址,所以obj的大小

1.1K40

C++和对象 (上篇)

文章目录 一、面向过程和面向对象初步认识 二、的引入 三、的定义 四、的访问限定符及封装 五、的作用域 六、实例化 七、对象模型 1、对象的大小计算 2、对象的存储方式 3、结构体内存对齐规则...大小 上面我们探讨的是普通大小,那么对于一些特殊的,比如或者是只有成员函数,没有成员变量的,他们的大小是多少呢?是0还是别的值?...0,那么为什么不是1呢?...因为当我们使用一个实例化多个对象时,需要用不同的空间来标识区分它们,所以编译器给了一个字节来唯一标识这个的某一具体对象,该字节不存储有效数据。...原因如下: 程序2在 p->Print 处虽然可以正常运行,但是在Print函数内部,_a 会被转化为 this->_a,发生了指针的解引用。

58000

C++初阶-和对象上

C++和对象起点之章 一、前言 二、面向过程/对象区别 三、的引入 四、的定义 五、的访问限定符及封装 1、访问限定符 2、封装 六、的作用域 七、实例化 八、对象模型 1、对象的大小计算...称为实例化 说明: 就像一个模型,限定了有哪些成员(类型和方法) 定义出只是相当于一种承诺,并不会分配实际的内存空间来存储成员 一个可以实例化出多个对象,实例化出的对象占用实际的物理空间...,实例化出的对象才能实际存储数据,占用物理空间 示图: 八、对象模型 1、对象的大小计算 存储规则 只保存成员变量,成员函数存放在公共的代码段 说明: 每个对象中成员变量是不同的,所以不能同时使用一份成员变量...} 解释: 对象计算的是成员变量的大小,如果没有成员变量,为了能便于找到实例化的对象的地址,会使用1byte大小来做为对象的占位符,不表示实际占用空间 虽然是一种承诺,只是规划了成员,...对齐规则: 第一个成员在与结构体偏移量为0的地址处 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍

45850

C++】STL学习之旅——初识STL,认识string

标准string提供了类似标准字符容器的接口,而且添加了单字节操作的特性。 string 是 basic_string模版的一个实例,使用char类型来实例化basic_string 模版。...注意这个独立于所使用的编码来处理字节: 如果使用 multi-byte 或 多长度字符(例如UTF-8编码),这个的所有成员(比如 长度和大小),以及该类的迭代器将仍然在该字节(而不是实际的编码字符...) cout << "实际长度:" << s1.length() << endl; //检查是否为 (为返回1 不为返回0) cout <<"是否为:" << s1.empty() <<...) cout << "实际长度:" << s1.length() << endl; //检查是否为 (为返回1 不为返回0) cout << "是否为:" << s1.empty() <<...) cout << "实际长度:" << s1.length() << endl; //检查是否为 (为返回1 不为返回0) cout << "是否为:" << s1.empty() <<

9510

C++修炼之路】2. 和对象(上)

总结 本节目标 面向过程和面向对象初步认识 的引入 的定义 的访问限定符及封装 的作用域 实例的对象大小的计算 成员函数的this指针 1....事实上,在C++中,这并不是结构体的定义,而是的封装。(由于C++兼容C因此定义结构体与C语言是一样的。)...return 0; } Person是没有空间的,只有Person实例化出的对象才有具体的年龄。只有先定义一个对象,才能对其内部属性进行操作。 做个比方。...注意大小类比较特殊,编译器给了一个字节来唯一标识这个的对象。...我们来分析一下: 由于p为指针,但是这里的p->Print();并不是解引用去访问,通过上面对象的存储方式猜测我们知道,因为成员函数的地址不在对象中,而是在公共代码区域。

34000

C++打怪升级(四)- 和对象入门1

** 外成员函数实现的一个错误:** 原因是编译器不知道函数Init()到底是属于哪个的。...命名空间中变量或函数等是已经定义的,有着储存空间,是一个实际对象;而只是一种类型 - 类型,不占任何储存空间,不是一个实际的对象,只有在实例化 - 定义了对象后,才能访问到对象内部成员。...---- 计算对象的大小 普通 一个对象中可能存放着不同类型变量和许多成员函数。那么实例(对象)的大小是多少呢?...---- 或空成员函数 class A { void func2() { ; } }; // class B{ }; //储存方式的选择: //大小的计算:与C语言结构体相同 int...} 和没有成员函数的的对象大小是1byte,而不是0byte; 这一个字节大小不储存有效数据,而是占位,标识该对象存在,用以区分没有的情况0byte。

37910

和对象(上篇)

很简单的例子就是我们之前在数据结构的学习中所写的栈: 如果我们用C语言来写的话我们就是将栈的初始化等函数单独写出去,而不是放入结构体,而C++就是直接将函数写入我们的结构体中,实现了封装的功能 typedef...一个可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储成员变量 例如: 下面这段代码会出现编译错误 因为你还没有为开辟空间就直接进行了实例化 nt main() { Person...,而建房子才是实例对象模型 如何计算对象的大小 下面给出一段代码,求他的所占内存的大小 class A { public: void PrintA() { cout<<_a<<...第一个的大小是4我相信大家应该都能答对 但是第二个第三个的答案是1! 大家都在想,明明里面完全是的,为什么还有一个字节的空间呢?...原因就是: 类比较特殊,编译器给了一个字节来唯一标识这个的对象。

8910

与对象上篇

声明和定义分离的原因:方便别人阅读你的代码,其次导入静态库时,避免源码泄露。...6.实例化 用创建对象的过程称为实例化 1.是对对象进行描述的,是一个模型一样的东西,限定了有哪些成员,但定义出一个并没有分配实际的内存空间来存储它, 2.一个可以实例化出多个对象,实例化出的对象占用实际的物理空间...return 0; } 3.做个比方,实例化出对象就像现实中使用建筑设计图建造出房子,就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样也只是一个设计,实例化出的对象才能存储实际数据...2.一个大小实际上就是该类中成员变量之和,当然要注意内存对齐。            3.大小为1byte:占位,不存储有效数据,表示对象存在。...3.什么是大小端?如何测试某台机器是大端还是小端,有没有遇到过要考虑大小端的场景? 结构体内存对齐规则: 1. 第一个成员在与结构体偏移量为 0 的地址处。 2.

35820

HotSpot源码分析之C++对象的内存布局

也会占用内存空间的,而且大小是1,原因C++要求每个实例在内存中都有独一无二的地址。...在HotSpot中,经常需要计算本身需要占用的内在大小,只要通过sizeof来计算即可。...因为和对象本来就不是一个概念,分别使用不同的对象模型描述符合软件开发的设计思想。...| base1_var1 1> 4 | base1_var2 1> +--- 可以看到,成员变量是按照定义的顺序来保存的,对象的大小就是所有成员变量的大小之和。 ...好了,关于对象的布局我们就简单的介绍到这里,因为毕竟不是在研究C++,只要够我们研究HotSpot时使用就够了,更多关于内存布局的知识请参考其它文章或书籍。

52020
领券