首页
学习
活动
专区
圈层
工具
发布

【C++基础篇】学习C++就看这篇--->类和对象入门

类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者 成员函数。...所以结论如下: 1️⃣ 类声明(Class Declaration): 描述类的"蓝图"或"模板" 包含成员变量类型和成员函数原型 不占用实际内存(除了编译器内部使用的类型信息) 2️⃣ 对象实例化...(Object Instantiation): 根据类声明创建具体的对象 占用实际内存(在栈或堆上分配) 大小由类的数据成员决定 类声明不占内存:在没有实例化对象前,类定义只是编译器使用的类型信息...上面我们简单的看到了,sizeof(类名)的大小,事实上那就是类对象的大小,也可以观察到,里面只计算了成员变量的大小,并没有成员函数的大小,为什么呢?...别走,我还有话说,我知道你有疑惑,先别急,听我说,A1大家肯定都理解,上面知识点在那,还不懂的再看下,对于A2和A3,为什么都是1,说明它们都是一样的对不,那A3没有函数,A2却有函数,这不正说明,函数在类里面不占有空间

48210

注解就这么简单

这里写图片描述 ---- 3.3@SuppressWarnings 抑制编译器警告注解 该注解在我们写程序的时候并不是很常见,我们可以用它来让编译器不给予我们警告 当我们在使用集合的时候,如果没有指定泛型...、枚举类、注解 有的人可能会奇怪,为什么注解上还要定义注解成员变量??...4.3使用自定义注解 上面我们已经定义了一个注解了,下面我们来使用它吧 4.3.1常规使用 下面我有一个add的方法,需要username和age参数,我们通过注解来让该方法拥有这两个变量!...例子: @xxx是我自定义的注解,我现在使用@xxx注解在Base类上使用…....使用@Inherited修饰@xxx注解 当有类继承了Base类的时候,该实现类自动拥有@xxx注解 ---- 六、注入对象到方法或成员变量上 6.1把对象注入到方法上 前面我们已经可以使用注解将基本的信息注入到方法上了

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

    收集飞花令碎片——【C语言】自定义类型(结构体、联合体、枚举)

    编译器就懵了: “我还在定义它呢,我也不知道多大啊!” 于是编译器报错。 ✅ 指针为什么就没问题?...结构体Point的成员x和y被赋值,并作为返回值返回。 在main函数中,p1 得到返回的结构体,直接打印其成员。...节省运行效率 如果需要返回一个结构体的指针,应该返回一个 动态分配的结构体(malloc 或者静态变量)。...从第2个成员变量开始,都要对齐到某个对齐数的整数倍的地址处 对齐数 = 编译器默认的一个对齐数与该成员变量大小的较小值 VS 中默认的值为 8 Linux中 gcc 没有默认对⻬数,对⻬数就是成员...BLUE = 4 }; enum Color clr = GREEN; // 使用枚举常量给枚举变量赋值 如果你觉得这篇文章对你有帮助,麻烦给个三连吧 我的博客即将同步至腾讯云开发者社区,

    16910

    CC++刁钻问题各个击破之细说sizeof

    为什么呢?问得好,我将尽全力对此作出解释:其实指针也是变量,只不过这个变量很特殊,它是存放其他变量的地址的变量。...基于上面三个规则我们来看看为什么sizeof(B)等于24:首先假设结构体的首地址为0,第一个成员num1的首地址是0(满足规则2,前面无须字节填充,事实上结构体绝对不会在第一个数据成员前面进行字节填充...按照上面的三个规则和分析过程,你可以很容易地知道为什么sizeof(A)等于16。特别需要说明的是,我这里给出了三个结论性的规则,而没有阐述为什么要这样。...你或许有很多疑问:为什么要结构体成员对齐,为什么要定义规则1等。如果你有这样的疑问,并尝试去弄清楚的话,那么我敢断言,不久的将来你必定会有大成就,至少在学习c++上是这样。...这是两给非常好的问题,事实上我之前没有看到任何关于这方面的论述(可能是我看的资料不足),我正是在看到sizeof(item.b)不能通过编译时想到了这两个问题,然后通过验证得出了后面的结论:对包含位域的结构体是可以使用

    1.5K20

    为什么结构体的 sizeof 不等于每个成员的 sizeof 之和

    问题 为什么结构体的 sizeof 不等于每个成员的 sizeof 之和? 回答 失传的C结构体打包技艺 — 内存对齐 作者:Eric S....通常,采用我在下文介绍的方式,可以节省相同或相近的内存。...如果你处于这种困境,且不了解我所讲述的内容,那你已深陷泥潭,祝君好运。 填充 我们来看一个关于变量在内存中分布的简单案例。思考形式如下的一系列变量声明,它们处在一个 C 模块的顶层。...在具有自对齐类型的平台上,char、short、int、long 和指针数组都没有内部填充,每个成员都与下一个成员自动对齐。 在下一节我们将会看到,这种情况对结构体数组并不适用。...因为 struct foo2 的指针需要与其最宽的成员为基准对齐,这变得不再可能。现在 c 需要指针对齐,接下来填充的 7 个字节被锁定了。

    1.5K20

    使用C# (.NET Core) 实现单体设计模式 (Singleton Pattern)

    A: 那么, 有没有哪个对象可以使用这个private的构造函数呢? B: 额, 我认为只有MyClass里面的代码可以调用这个构造函数, 但是感觉那没什么用啊. A: 为什么没用呢?...里面最重要的一部分代码: image.png 如果该实例引用为null, 那么创建一个实例, 并把这个实例赋給类的那个成员变量....这就是首先检查实例是否被创建了, 如果没有那么进入sync块....所以如果性能是问题, 就可以使用这个方法. 其他问题 Q: 如果我创建一个类, 里面都是静态方法和静态变量, 那么它的效果和单体模式不是一样的吗?...A: 是的, 如果你类没有其他依赖并且初始化并不复杂的话. Q: 可以继承单体模式吗? A: 简单的回答就是: No. Q: 为什么单体模式比全局变量好?

    1.2K40

    C语言入门指南:从0开始,手把手教你搞懂结构体

    但是,如果我要管理100个学生呢?难道我要定义400个变量吗?name1, name2, name3... age1, age2, age3... 这简直是一场灾难!...,我们直接跟上了花括号定义成员,然后紧跟着就定义了变量x,中间没有Stu这样的标签。...此时Node还没有被定义! } Node; 这个代码会报错。因为在定义结构体成员Node* next的时候,编译器还不知道Node是谁。Node是在整个typedef语句的末尾才被定义出来的。...如果我们用char(8比特)来存这些数据,就有7、5、3个比特被白白浪费了! 位段,就是允许你直接以“比特(bit)”为单位来定义结构体成员,从而实现极致的内存压缩。...因此,位段成员是没有独立的内存地址的。 后果:你不能对位段成员使用取地址符&!

    23310

    使用 C#.NET Core 实现单体设计模式

    A: 那么, 有没有哪个对象可以使用这个private的构造函数呢? B: 额, 我认为只有MyClass里面的代码可以调用这个构造函数, 但是感觉那没什么用啊. A: 为什么没用呢?...里面最重要的一部分代码: ? 如果该实例引用为null, 那么创建一个实例, 并把这个实例赋給类的那个成员变量....这就是首先检查实例是否被创建了, 如果没有那么进入sync块....所以如果性能是问题, 就可以使用这个方法. 其他问题 Q: 如果我创建一个类, 里面都是静态方法和静态变量, 那么它的效果和单体模式不是一样的吗?...A: 是的, 如果你类没有其他依赖并且初始化并不复杂的话. Q: 可以继承单体模式吗? A: 简单的回答就是: No. Q: 为什么单体模式比全局变量好?

    80760

    宋牧春: Linux内核内存corruption检查机制KASAN实现原理

    KASAN的使用真的很简单。但是我是一个追求刨根问底的人。仅仅止步于使用的层面,我是不愿意的,只有更清楚的了解实现原理才能更加熟练的使用工具。不止是KASAN,其他方面我也是这么认为。...KASAN使用编译时检测每个内存访问,因此您需要GCC 4.9.2或更高版本。检测堆栈或全局变量的越界访问需要GCC 5.0或更高版本。...char a[4]; 转换 struct { char original[4]; char redzone[60];} a; //32 bytes aligned 如果这里你问我为什么填充...另外从我的测试发现,如果上述的数组a的大小是33的时候,填充的redzone就是63 bytes。所以我推测,填充的原理是这样的。...bug; 4) 在3)步骤发生前没有任何的对该内存的写操作; 如果你也能得到以上4点猜测,我觉的我写的这几篇文章你是真的看明白了。

    2.7K10

    深入理解synchronized底层原理,一篇文章就够了!

    synchronized和volatile都具有可见性,其中synchronized对一个类或对象加锁时,一个线程如果要访问该类或对象必须先获得它的锁,而这个锁的状态对于其他任何线程都是可见的,并且在释放锁之前会将对变量的修改刷新到主存当中...但是普通成员属性、成员方法是归实例化的对象所有,必须实例化之后才能访问,这也是为什么静态方法不能访问非静态属性的原因。...弄清楚这些锁是上给谁的就应该很容易懂synchronized的使用啦,只要记住要进入同步方法或同步块必须先获得相应的锁才行。...我无论运行多少次都是小于200万的,为什么呢?...释放锁,在执行monitorenter之前需要尝试获取锁,如果这个对象没有被锁定,或者当前线程已经拥有了这个对象的锁,那么就把锁的计数器加1。

    98220

    sizeof,终极无惑(上)

    sizeof值与指针所指的对象没有不论什么关系,正是因为全部的指针变量所占内存大小相等,所以MFC消息处理函数使用两个參数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向结构体的指针)。...为什么受伤的总是我?...再看看内存,原来成员c后面仍然有3个填充字节,这又是为什么啊?别着急,以下总结规律。...这时s是一个总体,它作为结构体变量也满足前面三个准则,所以其大小为8,偏移量为4,c1与s之间便须要3个填充字节,而c2与s之间就不须要了,所以c2的偏移量为12,算上c2的大小为13,13是不能被4整除的...如今,朋友们能够轻松的出一口气了,:) 另一点要注意,“空结构体”(不含数据成员)的大小不为0,而是1。试想一个“不占空间”的变量怎样被取地址、两个不同的“空结构体”变量又怎样得以区分呢?

    57110

    宏使用心得-汇总

    假期,我尝试使用rust做一款命令行工具,来磨砺自己的rust技术熟练度。起初,面对各式各样的字符串格式化功能点,我傻乎乎地尝试自己造轮子。但,实在是遇到了太多技术难点(可难死我了)。...相反,编译器会 在当前作用域内, 寻找同名绑定变量, 使用该绑定变量的值。(馁馁地逆天了) naming parameter是identifier字符串。...即,【空格】填充。 < 左 (默认) ^ 中 > 右 某个Value argument值 或,当前作用域内,某个绑定变量的值 要么,缺省。即,没有限制。...(或左侧)的Value argument代表最多显示字符数 某个Value argument值 或,当前作用域内,某个绑定变量的值 要么,缺省。...填充符号仅能是数字0 0填充优先级高于padding-char [例程11] 与padding-char填充符作用不同, 某个Value argument值 或,当前作用域内,某个绑定变量的值 要么,缺省

    1.6K30

    【C++ 类和对象 基础篇】—— 抽象思维的巅峰舞者,演绎代码的深邃华尔兹

    类名通常采用大写字母开头的驼峰命名法,类的主体部分包含在一对花括号{}中,在花括号内部可以定义成员变量和成员函数,类中定义的变量叫做成员变量,类中定义的函数叫做成员函数,并且可以使用访问修饰符(private...访问权限作用域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为至,如果后面没有访问限定符,作用域就到 }即类结束。...这种情况下,对象的大小会增加一个指针的大小(通常是 4 字节或 8 字节,取决于平台)。 静态成员变量: 静态成员变量属于类而不属于某个对象,因此也不包含在对象大小中。...内存对齐: 编译器会为数据成员添加填充字节,以确保数据对齐符合系统要求。 对象大小的计算涉及到内存对齐,我们先来理解什么是内存对齐? 2.3.2、内存对齐 为什么需要内存对齐?...3.2、this指针的使用场景 区分成员变量和局部变量/参数: 当成员变量与函数参数或局部变量同名时,可以使用 this 指针来明确指向成员变量。

    1.6K10

    深入理解synchronized底层原理,一篇文章就够了!

    synchronized和volatile都具有可见性,其中synchronized对一个类或对象加锁时,一个线程如果要访问该类或对象必须先获得它的锁,而这个锁的状态对于其他任何线程都是可见的,并且在释放锁之前会将对变量的修改刷新到主存当中...但是普通成员属性、成员方法是归实例化的对象所有,必须实例化之后才能访问,这也是为什么静态方法不能访问非静态属性的原因。...弄清楚这些锁是上给谁的就应该很容易懂synchronized的使用啦,只要记住要进入同步方法或同步块必须先获得相应的锁才行。...我无论运行多少次都是小于200万的,为什么呢?...从反编译的同步代码块可以看到同步块是由monitorenter指令进入,然后monitorexit释放锁,在执行monitorenter之前需要尝试获取锁,如果这个对象没有被锁定,或者当前线程已经拥有了这个对象的锁

    42.1K3133

    字节面:什么是伪共享?

    大家好,我是小林。 周末的时候,有个读者跟我说,面试字节的时候被问到:「什么是伪共享?又该怎么避免伪共享的问题?」 这个其实是考察 CPU 缓存的问题,我之前的图解系统也有提到过。...我们来思考一个问题,如果这两个不同核心的线程分别修改不同的数据,比如 1 号 CPU 核心的线程只修改了 变量 A,或 2 号 CPU 核心的线程的线程只修改了变量 B,会发生什么呢?...所以,可以发现如果 1 号和 2 号 CPU 核心这样持续交替的分别修改变量 A 和 B,就会重复 ④ 和 ⑤ 这两个步骤,Cache 并没有起到缓存的效果,虽然变量 A 和 B 之间其实并没有任何的关系...中的 7 个 long 类型数据则作为 Cache Line 后置填充,这 14 个 long 变量没有任何实际用途,更不会对它们进行读写操作。...Line,这整个 Cache Line 里都没有会发生更新操作的数据,于是只要数据被频繁地读取访问,就自然没有数据被换出 Cache 的可能,也因此不会产生伪共享的问题。

    76620

    通过在非特权进程中查找泄漏的句柄来寻找特权升级和 UAC 绕过

    最近我一直在寻找某种类型的漏洞,它可能导致权限升级或 UAC 绕过。既然我认为它还没有被彻底解释清楚,更不用说自动化了,我们为什么不开始这个新的冒险呢?...OpenProcess(如果它没有因某种原因失败)被放入hProcess变量中以供以后使用。...不幸的是,在我的研究中,我没有发现直接提取结构ObjectAddress成员指向的进程的 PID 的直接方法SYSTEM_HANDLE。...该快照被分配给类型为 的snapshot变量,这是wil::unique_handleWIL 库的一个 C++ 类,它使我们摆脱了在使用句柄后必须正确清理句柄的负担。...如果它具有高完整性或更高的完整性(例如 SYSTEM),我们会将有SYSTEM_HANDLE问题的内容保存在我们的内部vSysHandle以供以后(ab)使用。

    1.4K40

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

    C++ 类与对象——详细入门指南 前言 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!...1.4 成员命名规范 在C++中,通常会为类的成员变量使用特定的命名约定,以避免与函数参数或局部变量混淆。这些命名约定可以提高代码的可读性和维护性。...2.3 对象大小:空类的情况 在C++中,对象的大小是由类的成员变量决定的,而类的成员函数不会影响对象的大小。因此,如果一个类没有任何成员变量,而只有成员函数,我们称之为空类。...这是因为C++规定每个类的对象都必须占有唯一的地址,即使类中没有成员变量。这1字节的大小用于确保不同的对象在内存中拥有唯一的地址。 为什么空类对象占1字节?...这就导致了未定义的行为,成员变量没有被正确的赋值。

    53110

    理一理字节对齐的那些事

    那么就要求各种数据类型按照一定的规则在空间上排列,这就是对齐。 对齐准则是什么 总的来说,字节对齐有以下准则: 结构体变量的首地址能够被其最大基本类型成员字节数大小所整除。...结构体每个成员相对结构体首地址的偏移都是成员大小的整数倍,如不满足,对前一个成员填充字节以满足。 结构体的总大小为结构体对最大成员大小的整数倍,如不满足,最后填充字节以满足。...在b后面填充后,d已经满足对齐要求了,为什么最后还要填充字节呢?或者说,为什么需要满足第三条准则呢?...,但是如果这个double数据的地址没有对齐,数据就可能被放在两个8字节块中,那么我们可能需要执行两次内存访问,才能读写完成。...总结 虽然我们不需要具体关心字节对齐的细节,但是如果不关注字节对齐的问题,可能会在编程中遇到难以理解或解决的问题。

    1.1K30

    字节对齐,看这篇就懂了

    那么就要求各种数据类型按照一定的规则在空间上排列,这就是对齐。 对齐准则是什么 总的来说,字节对齐有以下准则: 结构体变量的首地址能够被其对齐字节数大小所整除。...结构体每个成员相对结构体首地址的偏移都是成员大小的整数倍,如不满足,对前一个成员填充字节以满足。 结构体的总大小为结构体对最大成员大小的整数倍,如不满足,最后填充字节以满足。...在b后面填充后,d已经满足对齐要求了,为什么最后还要填充字节呢?或者说,为什么需要满足第三条准则呢?...,但是如果这个double数据的地址没有对齐,数据就可能被放在两个8字节块中,那么我们可能需要执行两次内存访问,才能读写完成。...总结 虽然我们不需要具体关心字节对齐的细节,但是如果不关注字节对齐的问题,可能会在编程中遇到难以理解或解决的问题。

    27.5K44
    领券