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

【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)

而根据类创建对象的过程,叫做类的实例化,我们在内存中创建出的每一个对象都是类的实例。...{ //... } private: int _x; }; int main() { MyClass a;//类的实例化,创建一个对象叫a return 0; } 在上述代码中,我们对类进行定义时...其次,c++规定,对象的成员变量才存储时要符合结构体的内存对齐规则。 规则如下: 1.结构体的第一个成员对齐到和结构体的起始地址的偏移量为0的地址处,也就是说第一个成员的偏移量记为0。...B { }; int main() { cout << sizeof(A) << endl; cout << sizeof(B) << endl; return 0; } 运行结果: 当类中只有成员函数或者类为空类时...总结 今天,我们初入了c++类和对象的大门,学习了类的概念及定义、类实例化出对象,以及this指针的概念及作用。

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

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

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

    69640

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

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

    12210

    C++类与对象深度解析(一):从抽象到实践的全面入门指南

    2.3 对象大小:空类情况 在C++中,对象的大小是由类的成员变量决定的,而类的成员函数不会影响对象的大小。因此,如果一个类没有任何成员变量,而只有成员函数,我们称之为空类。...这种空类的对象大小在C++中也是有规定的。 空类对象大小 尽管空类没有成员变量,但在C++中,空类的对象大小仍然不是零。空类的对象大小是1字节。...原因是静态成员属于整个类,而不是某个具体的对象,因此静态成员(无论是函数还是变量)不会影响对象的大小。...结论: 空类对象的大小是1字节,即使类中没有成员变量,C++仍然会为每个空类对象分配1字节的空间,以确保每个对象有唯一的内存地址。...静态成员不影响对象的大小,因为它们属于类,而不是对象,空类或仅含有静态成员函数或者变量的类对象同样占用1字节。

    9900

    【C++从小白到大牛】类和对象

    五、类的实例化 用类类型创建对象的过程,称为类的实例化(类和对象的关系) 一个类可以实例化出多个对象,实例化出的对象才占用实际的物理空间,存储类成员变量 Person类是没有空间的,只有Person类实例化出的对象才有具体的年龄...return 0; } 类的实例化正确使用方法: 六、如何计算类对象的大小 问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?...所以我们采取下面的存储方式 结论: 一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐 注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。...这里的p作用表示在编译时检查Print是不是在类里面。 再对比看看下面的代码: 因为this指针就是空指针,而解引用空指针去访问成员变量肯定是报错的!...静态成员变量一定要在类外进行初始化!类里面声明,类外面定义 原因: 类里面初始化的缺省值,本质上是给初始化列表的,但是静态成员变量不要走初始化列表,因为初始化列表要定义一个对象里的成员。

    8110

    C++类与对象深度解析(一):从抽象到实践的全面入门指南

    2.3 对象大小:空类的情况 在C++中,对象的大小是由类的成员变量决定的,而类的成员函数不会影响对象的大小。因此,如果一个类没有任何成员变量,而只有成员函数,我们称之为空类。...这种空类的对象大小在C++中也是有规定的。 空类对象的大小 尽管空类没有成员变量,但在C++中,空类的对象大小仍然不是零。空类的对象大小是1字节。...原因是静态成员属于整个类,而不是某个具体的对象,因此静态成员(无论是函数还是变量)不会影响对象的大小。...静态成员不影响对象的大小,因为它们属于类,而不是对象,空类或仅含有静态成员函数或者变量的类对象同样占用1字节。...同时,我们讨论了对象的实例化及其内存存储机制,包括了空类对象的内存占用问题。通过this指针的机制,我们了解了C++中对象访问成员的内部逻辑。

    17310

    【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

    26210

    【C++】踏上C++的学习之旅(六):深入“类和对象“世界,掌握编程的黄金法则(一)

    return 0; } Person类是没有空间的,只有Person类实例化出的对象才具有空间。...想必大家对最后两个类的大小有疑问,这里明明没有成员变量,为什么这里的大小不是0? 那我们可以这样想,假如这个类的大小是0,那么通过这个类创建出的对象大小也是0。...可是编译器是支持我们也一个空类的,也就意味着这个类创建的对象一定存储在内存中,如果大小为0,那就代表对象不在内存中,编译器就无法在内存找到这个变量,为此编译器采用了1个字节大小用作空类对象的标记。...为此,我们可以做一个总结: 一个类的大小,实际就是该类中"成员变量"大小之和,当然注意内存对齐。 注意空类的大小,空类比较特殊,编译器会给空类一个字节来唯一标识这个类的对象。...} 答案:B 原因:针对于题目一,我们定义了一个 A类型的指针p,指针p的值设为空。

    11010

    C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)

    由于成员函数不占用类实例的内存空间(它们通常存储在代码段中,而不是数据段中),所以 A1 类实例的大小只与成员变量有关。...如前所述,成员函数不占用类实例的内存空间。然而,对于空类,编译器通常会为其分配至少一个字节的大小,以确保每个对象在内存中都有一个唯一的地址。...但在实践中,某些编译器可能会为空类分配更大的大小,以确保对象之间的内存地址有足够的间隔,这被称为“空基类优化”。...结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。 结构体内存对齐规则 1....} 而在这段代码中,程序崩溃的原因是解引用了一个空指针 p 来调用 PrintA 成员函数。

    16210

    C++类大小的计算

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

    1.1K20

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

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

    16910

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

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

    2.3K30

    C++之面向对象(上)

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

    33520

    浅析C++内存布局

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

    1.2K40

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

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

    48140

    C++初阶-类和对象上

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

    48850

    【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() <<

    15910

    爆学C++之类和对象(上)

    • 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。...//那么多报错 //就说明我们这个类还不是完全体,那么我们就需要进行后面的学习了 访问限定符 • C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接⼝...那么我们在计算类的对象的大小的时候我们只考虑成员变量,不考虑成员函数 */ return 0; } //类里面是不能存真实数据的,我们需要先用这个类实例化出一个对象...C语言中求结构体的大小的规则是一样的 需要遵循内存对齐规则 • 第⼀个成员在与结构体偏移量为0的地址处。...这个就是为什么函数在被调用的时候能进行对象的区分的原因了 而且我们的这个类函数中的打印函数里面的代码 类成员变量的访问本质都是通过this指针进行访问的 cout _year

    8810
    领券