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

【C++】构造函数初始化列表 ⑤ ( 匿名对象 生命周期 | 构造函数 中 不能调用 构造函数 )

中传入的 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 构造函数 中 不能调用 构造函数 ; 一、匿名对象 生命周期 1、匿名对象 生命周期 说明 调用 类名(构造函数参数) 创建的是 匿名对象 ; 匿名对象...二、构造函数 中调用 构造函数 ---- 1、构造函数 中 不能调用 构造函数 构造函数中 调用 构造函数 是危险行为 ; 构造函数 中调用 构造函数 , 并不会为本对象进行初始化操作 ; 构造函数 的调用方式..., 天然就会创建一个 匿名对象 , 如果 没有变量 接收 这个 匿名对象 , 该匿名对象 在 本行表达式执行完毕后 , 就会被销毁 ; 2、代码示例 - 构造函数中调用构造函数 下面的代码中 , 先定义...执行 Student 的构造函数" << endl; } 然后 , 在无参的 构造函数中 , 调用 有参构造函数 ; // 构造函数中 调用 构造函数 是危险行为 Student() { /

22120

为什么应该尽可能避免在静态构造函数中初始化静态字段?

不同的是Foo以内联(inline)赋值的方法进行初始化,而Bar则将初始化操作定义在静态构造函数中。...从Foo和Bar的IL代码可以看出,针对它们静态字段的初始化都放在静态构造函数中。...但是当我们调用一个并不涉及类型静态字段的Invoke方法时,定义在Foo中的静态构造函数会自动执行,但是定义在Bar中的则不会,由此可以看出一个类型的静态构造函数的执行时机与类型是否具有beforefieldinit...具体规则如下,这一个规则直接定义在CLI标准ECMA-335中,静态构造函数在此标准中被称为类型初始化器(Type Initializer)或者.cctor。...四、关于“All-Zero”结构体 如果我们在一个结构体中显式定义了一个静态构造函数,当我们调用其构造函数之前,静态构造函数会自动执行。

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

    【C++】构造函数分类 ② ( 在不同的内存中创建类的实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 )

    一、在不同的内存中创建类的实例对象 1、栈内存中创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...栈内存中的 变量 Student s1 ; 这些都是在 栈内存 中创建 类的实例对象 的情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 会自动将栈内存中的实例对象销毁 ; 栈内存中 调用 构造函数 创建的 实例对象 , 不需要关注其内存占用 ; 2、堆内存中创建实例对象 在 栈内存 中声明 类 的 实例对象 方式是 : 该 s1...实例对象存放在栈内存中 , 会占用很大块的栈内存空间 ; Student s1; 在 堆内存 中声明 类 的 实例对象 方式是 : 该 s2 实例对象是存放在堆内存中的 , 栈内存中只占 4 字节的指针变量大小..., 接受两个整数作为 构造函数参数 ; 在 main 函数中 , 使用 使用 new 关键字 来调用 有参构造函数 创建 MyClass 类实例对象 ; class MyClass { public

    18820

    【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

    , 这个增加的参数是 对象本身的指针 ; 在 Student 类中 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身的成员 ; 在全局函数中 , 实现两个 Student 类相加 , 接收两个...height; // 身高 }; 此时就可以使用默认构造函数 , 创建 Student 对象 ; 三、返回匿名对象与返回引用 ---- 在上面的章节中 , 将 两个 Student 对象相加 ,...返回的是一个匿名对象 , 该匿名对象 是在 成员函数 中新创建的对象 ; // 成员函数中, 将两个 Student 对象相加 // 全局函数 转为 成员函数 , 少了一个参数 // 返回一个新...; s2.print(); // 调用全局函数, 将两个 Student 对象相加 // 函数返回的 匿名对象 用于 s3 初始化 // 直接将匿名对象转为普通对象 Student s3

    23820

    【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :...赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向 子类对象 , 父类指针 值为 子类对象 在 堆内存 的地址 , 也就是 将 子类对象 地址 赋值给...类型兼容性原则 : 父类指针 指向 子类对象 Parent* p_parent2 = NULL; p_parent2 = &child; 该原则的应用场景如下 : 定义函数 , 接收 父类指针...); } 2、使用 子类对象 为 父类对象 进行初始化 定义父类对象 , 可以直接使用 子类对象 进行初始化操作 ; // II....类型兼容性原则 : 父类指针 指向 子类对象 Parent* p_parent2 = NULL; p_parent2 = &child; // 通过父类指针调用父类函数

    30820

    C++奇迹之旅:C++内存管理的机制初篇

    localVar 是普通的局部变量,存储在栈中,栈是一种后进先出(LIFO)的数据结构,用于存储函数调用时的局部变量和返回地址等信息,当函数调用结束时,栈中分配给该函数的内存空间会被自动释放。...局部数组 num1 存储在栈中,数组在内存中是连续分布的,因此 num1 占用了一块连续的栈空间。...sizeof(ptr1) = 8; ptr1 是一个指向动态分配的 int 类型数组的指针,在 32 位系统上,指针大小为 4 字节。在 64 位系统上,指针大小为 8 字节。...sizeof: sizeof 是一个操作符,用于获取变量或数据类型的大小(以字节为单位),它在编译时就确定了返回值,不需要在运行时计算,对于数组,sizeof 返回整个数组的大小,而不是单个元素的大小,...如果分配失败,这些函数会返回NULL指针,需要进行错误处理。

    14010

    C++第七弹 -- CC++内存管理

    定义和类型 sizeof:是一种运算符,用于计算对象或类型所占的空间大小(以字节为单位)。它在编译时就已经确定了值,并将结果在编译时嵌入到程序中。...功能和结果 sizeof: 返回的是对象或类型所占的空间大小,单位是字节。 对于数组,sizeof 返回的是整个数组所占的空间大小,包括所有元素和末尾的 \0(如果数组是字符数组的话)。...calloc的初始化特性使得它在分配内存后无需再进行额外的初始化操作。 realloc:适用于已分配的内存块大小不足以满足当前需求,或者分配了过大的内存块需要缩减的场景。...N次构造函数 delete[]的原理 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理 调用operator delete[]释放空间,实际在operator delete[]中调用operator...,new不需要,但是new需 要捕获异常 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new 在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成

    10610

    分享丨CC++内存管理详解--堆、栈

    所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。   ...函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。   (3). 使用free或delete释放了内存后,没有将指针设置为NULL。...对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。...函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。...对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new的语句也可以有多种形式。

    1.1K21

    C++面试知识总结

    指针在定义的时候不必初始化,所以,指针则可以是NULL,可以在定义后面的任何地方重新赋值。 引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用。...2.19 static局部变量和普通局部变量的区别 静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失,直到程序运行结束后才释放。...当操作数具有数组类型时,其结果是数组的总字节数。 联合类型操作数的sizeof是其最大字节成员的字节数。 结构类型操作数的sizeof是这种类型对象的总字节数。...数组做sizeof的参数不退化,传递给strlen就退化为指针了。 sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。...3.5 基类和子类的构造、析构顺序 定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数 先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了 3.6 深拷贝与浅拷贝的区别

    1.8K41

    CC++内存管理-学习笔记

    内存分配成功未初始化 内存空间在申请到后,其缺省值是未知的,所以在空间申请到后,不要嫌麻烦,即便是赋零值也是不可省略的。...释放内存继续使用 栈内存指针在函数返回后依旧调用或者使用free/delete释放动态内存后依旧使用。...在使用中定义需要使用malloc动态分配堆内内存,如果使用一下语句分配内存情况又不一样了,如下: Char P[] = “Hello World”;//函数返回时P自动从栈内释放,所以函数返回报错.../free无法满足动态对象的要求,malloc/free是标准库函数,不是C++的运算符,不在编译器控制权限之内,不能够执行对象的构造函数和析构函数。...,无参数的构造函数操作和基本类型的操作近似,但是对于动态对象类型需要注意参数,并且只能单独创建,不能创建为数组。

    1K20

    Java反射原理

    基础理论 A类 -> A.class字节码文件 -> 加载到JVM后的A字节码文件对象(Class对象) A的Class对象 -> A的实例 Class是反射的基础 当new一个新对象或者引用静态成员变量等时机时...* 请注意,虽然此方法返回Constructor对象的数组(即该类中的构造函数数组),但该方法的返回类型是Constructor[]而不是Constructor[]。...* 如果类具有默认构造函数,则它将包含在返回的数组中。 * 如果class对象表示接口、基元类型、数组类或void,则此方法返回长度为0的数组。 */ public Constructor对象表示的构造函数,使用指定的初始化参数创建和初始化构造函数的声明类的新实例。...* 如果基础方法是静态的,则声明该方法的类在尚未初始化的情况下被初始化。 * 如果方法正常完成,它返回的值将返回给invoke的调用方;如果该值具有基元类型,则首先将其适当地包装在对象中。

    6.7K40

    深入理解java反射机制

    静态加载的时候如果在运行环境中找不到要初始化的类,抛出的是NoClassDefFoundError,它在JAVA的异常体系中是一个Error....动态态加载的时候如果在运行环境中找不到要初始化的类,抛出的是ClassNotFoundException,它在JAVA的异常体系中是一个checked异常,在写代码的时候就需要catch....: Constructor getConstructor(Class[] params)根据构造函数的参数,返回一个具体的具有public属性的构造函数 Constructor getConstructors...() 返回所有具有public属性的构造函数数组 Constructor getDeclaredConstructor(Class[] params) 根据构造函数的参数,返回一个具体的构造函数(不分public...和非public属性) Constructor getDeclaredConstructors() 返回该类中所有的构造函数数组(不分public和非public属性) * 1 反射出无参的构造方法并得到对象

    34820

    嵌入式软件工程师笔试面试指南-CC++

    delete(p); p = NULL; 注:malloc函数分配完内存后需注意: a. 检查是否分配成功(若分配成功,返回内存的首地址;分配不成功,返回NULL。可以通过if语句来判断) b....派生类在构造函数中要对自身成员初始化,也要对继承过来的基类成员进行初始化当基类没有默认构造函数的时候,通过在派生类的构造函数初始化列表中调用基类的构造函数实现。...如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。 注意:类成员在定义时,是不能初始化的 注意:类中const成员常量必须在构造函数初始化列表中初始化。...在一切初始化工作结束后,main函数会被调用,如果某个类的构造函数被执行,那么首先基类的成员变量会被初始化。 当一个类为另一个类的成员变量时,如何对其进行初始化?...因为构造函数没有返回值,所以通知对象的构造失败的唯一方法就是在构造函数中抛出异常。构造函数中抛出异常将导致对象的析构函数不被执行,当对象发生部分构造时,已经构造完毕的子对象将会逆序地被析构。

    1.6K11

    Netty14# 池化内存之线程缓存

    注解@3:禁用线程缓存依然是构造PoolThreadCache,只是传入的参数为0. 小结:初始化赋值过程实际是为了创建一个PoolThreadCache对象。...初始化方法调用 初始化方法PoolThreadLocalCache#initialValue()什么时候调用的呢?在第一次调用FastThreadLocal#get()时进行的初始化。...并将初始化的结果PoolThreadCache放入InternalThreadLocalMap(实际为对象数组)。...FastThreadLocalThread的调用 在初始化赋值注解@2中,只有满足两个条件才会缓存,if (useCacheForAllThreads || current instanceof FastThreadLocalThread...freeSweepAllocationThreshold:默认8192,分配次数阈值,超过后释放内存池 构造函数中,主要给三种类型的缓存数组赋值,包括堆内存和堆外直接内存,结构一致,只走查堆外直接内存

    64620

    c language program_language deficit

    :是子类可以访问,在创建对象后,对象.成员属性是访问不了的 大括号后面在加上; 构造函数对应有个析构函数,~Person(){},它没有参数,不能重载,对象销毁之前会自动调用析构 无参构造时,Person...拷贝构造只是进行了简单的值拷贝,对于旧对象开辟的内存空间并没有进行拷贝 在构造函数前面加中explicit,代表不允许使用隐式构造函数, Person(10,”lucy”)这个是匿名对象,生命周期在当前行...构造函数和析构函数顺序是相反的 c++中malloc是不会调用构造函数,free不会调用析构函数 Person* p=new Person,这个是动态创建对象,delete p释放p对象的内存空间 Person...* p=new Person[10],创建对象数组时,只能调用无参构造,delete []p int* p=new int[10],new数组返回的是数组首元素的地址,释放该空间时,要delete []...,name){tihs->id=id ;}这个是子类的构造函数,因为创建子类对象时,会先创建父类,所以如果父类是有参构造,那么就要在子类的构造函数在带上父类的构造 如果子类有父类同时的成员函数,子类构造时

    42410

    【C++】探索C++内存管理:机制揭秘与内存安全

    它的参数是一个字符数组(字符串),它会返回字符串的有效长度(以字节为单位)。 总结: sizeof用于获取数据类型或变量占用的字节数。...5.2 对于自定义类型 ✨new的原理: 调用operator new函数申请空间 在申请的空间上执行构造函数,完成对象的构造 ✨delete的原理: 在空间上执行析构函数,完成对象中资源的清理工作 调用...在申请的空间上执行N次构造函数 ✨delete[]的原理: 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理 调用operator delete[]释放空间,实际在operator delete...,如果是多个对象,[]中指定对象个数即可 malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型 malloc申请空间失败时,返回的是NULL,因此使用时必须判空...,new不需要,但是new需要捕获异常 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

    15410

    【C++】动态内存管理

    ,未初始化的无名对象 此new关键字在堆空间构造一个int型对象,并返回指向该对象的指针....,如果是多个对象,[]中指定对象个数即可 malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型 malloc申请空间失败时,返回的是NULL,因此使用时必须判空...,new不需要,但是new需要捕获异常 申请自定义类型对象时,malloc/free只会开辟空间/释放空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理...,malloc会返回NULL 自定义类型 new的原理 调用operator new函数申请空间 在申请的空间上执行构造函数,完成对象的构造 delete的原理 在空间上执行析构函数,完成对象中资源的清理工作...[]中调用operator delete来释放空间 定位new表达式(placement-new) 定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。

    12510

    深入理解Java常用类----String

    而我们第一种构造器就很简单,该构造器会将当前的string对象赋值为空(非null)。...在该方法中主要做了两件事情,第一,通过起始位置和终止位置得到新数组的长度,第二,调用本地函数完成数组拷贝。...0,1,2并没有包括3,这种形式的截取方式在String的其他函数中也是常见的。...以上介绍的构建String对象的方式中,基本都是属于操作它内部的字符数组来实现的,下面的几种构造器则是通过操作字节数组来实现对字符串对象的构建,当然这些操作会涉及到编码的问题。...三、获取内部数值的常用函数      此分类下的函数主要有两大类,一个是返回的字符数组,一个是返回的字节数组。我们首先看返回字符数组的方法。

    84890

    【cc++】深入探秘:C++内存管理的机制

    ,malloc会返回NULL 自定义类型: new的原理 调用operator new函数申请空间 在申请的空间上执行构造函数,完成对象的构造 class A { public: A(int a...刚好开辟了四十个字节的空间,因为它不需要调用析构函数 6.简单了解定位new表达式(placement-new) 定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象 使用格式:...,还不能算是一个对象,因为构造函数没有执行 new(p1)A; 显示调用构造函数对一块已经有的空间的初始化 定位new表达式在实际中一般是配合内存池使用。...,如果是多个对象,[]中指定对象个数即可 malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型 malloc申请空间失败时,返回的是NULL,因此使用时必须判空...,new不需要,但是new需要捕获异常 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

    27610

    Java安全之CommonsCollections1链

    Transformer数组,当调用transform方法时,循环遍历传入的数组,并依次调用每个Transformer的transform方法,将前一个回调函数transform返回的结果,作为后一个回调函数...,里面包含两个对象,ConstantTransformer类初始化获取Runtime类对象并返回;InvokeTransformer类初始化获取exec方法并传入参数类型和值calc。...当向修饰后的Map中添加新元素时,就会自动调用作为keyTransformer或valueTransformer的ChainedTransformer对象中的transform方法,从而链式调用数组中Transformer...put元素的环境,是需要把它变成反序列化流的,让它在反序列化后能够自动触发。...TransformedMap链-POC链 由于网络传输需要用字节流而不是字符流,就需要先ByteOutputStream创建字节数组缓存区,再创建对象的序列化流后用writeObject写入序列化流。

    44560
    领券