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

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

一、不同的内存创建类的实例对象 1、栈内存创建实例对象 在上一篇博客 【C++构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...实例对象存放在栈内存 , 会占用很大块的栈内存空间 ; Student s1; 堆内存 声明 类 的 实例对象 方式是 : 该 s2 实例对象是存放在堆内存的 , 栈内存只占 4 字节的指针变量大小...; Student* s2; C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建类的 实例对象 ; 在下面的 C++ 代码 , 声明并定义了 MyClass 类 , 该类定义了一个有参构造函数...堆内存中分配内存 , 该对象使用完毕后 , 要使用 delete 关键字释放 堆内存的空间 , delete obj , 避免出现内存泄漏的情况 ; delete obj; 如果在栈内存 创建 MyClass...实例对象 , 则不需要关心 该对象 的内存占用情况 , 在这块代码块作用域结束 , ( 一般是函数大括号内的代码执行完毕 ) , 该 栈内存 的 MyClass 对象会被系统自动销毁 ; MyClass

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

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

一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ 的 " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象的...地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :...可以解决的问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " 和 " 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法...父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向 子类对象 , 父类指针 值为 子类对象 堆内存 的地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针...指向 子类对象 定义 一个子类对象 Child child ; 定义父类的指针 , 将 指针 指向 子类对象 的地址 , 这是合法的 ; 代码示例 : // 父类对象 Parent parent

22020

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

一、全局函数 与 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 类的 成员函数 转为 全局函数 , 转换 , 会 增加一个参数到参数列表开始为止..., 这个增加的参数是 对象本身的指针 ; Student 类 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 成员函数 , 通过 this 指针访问对象本身的成员 ; 全局函数 , 实现两个 Student 类相加 , 接收两个...Student 引用类型的参数 , 引用相当于一级指针 ; // 全局函数 , 将两个 Student 对象相加 // 引用的 等同于 一级指针 , Student 引用用法与 Student 对象用法相同..., 创建 Student 对象 ; 三、返回匿名对象与返回引用 ---- 在上面的章节 , 将 两个 Student 对象相加 , 返回的是一个匿名对象 , 该匿名对象 成员函数 中新创建的对象

17720

CC++面试题之语言基础篇(一)

准备C/C++面试需要深入研究语言基础知识,掌握控制流结构、函数、指针和标准库,同时准备好回答各种与C/C++编程相关的问题,这将有助于你面试脱颖而出。...使用 void * 指针需要谨慎,必须进行类型转换 示例(int 型转换): int * intPtr=static_case(ptr); 因为不提供类型检查,可能导致运行时类型错误。...简述C++从代码到可执行二进制文件.exe的过程 有四个过程,预编译、编译、汇编、链接 C++函数只声明,不定义会在哪步报错 实际的错误通常发生在链接阶段,当链接器尝试将所有编译单元(源文件)组合在一起...class MyClass { public: MyClass(int x, double y) { // 带参数的构造函数 } }; 拷贝构造函数:拷贝构造函数用于创建一个对象...注意:当数据成员中有指针,必须要用深拷贝 左值引用和右值引用区别和目的 左值是能够出现在表达式左边的值如变量,右值是只能出现在等号右边的值,如常量。 左值可以取地址,右值不可。

19010

万字长文【C++】高质量编程指南

(s1+s2); return temp; 上述代码将发生三件事: 1,首先temp对象被创建,同时完成初始化 2,然后拷贝构造函数把temp拷贝到保存返回值的外部存储单元 3,最后,temp函数结束被销毁...0) // 错误,缺省值出现在函数的定义体 { ⋯ } 为什么?...根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成,因此把对象的初始化放在构造函数,把清除工作放在析构函数,当对象被创建时候,构造自动执行,对象消亡,析构自动执行,不要担心忘记对象的初始化和清除工作了...{ m_a = a; … } 注意:成员对象初始化的次序完全不受他们再初始化表的次序的影响,只由成员对象声明的次序决定,因为类的声明是唯一的,而类的构造函数可以有多个,因此会有不同次序的初始化表...如果成员对象按照初始化表的次序进行构造,将导致析构函数无法得到唯一的逆序。

1.4K20

C++】异常+智能指针+特殊类和类型转换

异常是C++引入的处理错误的一种方式,当一个函数或者接口发生错误时,可以直接throw异常对象,然后catch会捕获异常对象,对发生的异常作相关的处理。...异常对象在被catch块捕获,catch块通常都是用引用来作为接收异常对象类型的参数。 C++,当异常被抛出,异常处理机制会确保异常对象在对应的catch块执行期间保持有效。...C++11,通过final关键字来修饰类,表示该类为最终类,无法被继承。 2.单例模式(只有唯一的一个实例化对象) 1....但GetInstance_lazy有线程安全的问题,当多个线程竞争的执行GetInstance_lazy的new Singleton,可能出现实例化出多个对象的场景,例如当某个线程判断空指针成功之后...(复习一个知识点,当类成员变量出现const修饰,引用的成员变量,或自定义对象没有合适的默认构造函数,必须在初始化列表的位置显示初始化,不可以构造函数内部对成员变量赋初值) 除此之外还需要说明的一个问题是关于释放单例对象资源的话题

30440

C++重要知识点小结---1

[cpp] view plaincopy >上有个好记的方法:const*号左边修饰的是指针所指的内容;const*号右边修饰的是指针。  ...13.VC,sizeof有着许多的用法,而且很容易引起一些错误。下面根据sizeof后面的参数对sizeof的用法做个总结。   ...由于C++提供的默认拷贝构造函数只是对对象进行浅拷贝复制。如果对象的数据成员包括指向堆空间的指针,就不能使用这种拷贝方式,此时必须自定义拷贝构造函数,为创建的对象分配堆空间。...《C++程序设计教程》P352 例子并没有声明派生类GraduateStudent的构造函数,根据类的实现机制,派生类对象创建,将执行其默认的构造函数。...内联函数不能是虚函数,因为内联函数是不能在运行动态确定其位置的。即使虚函数类的内部定义,编译,仍将其看作非内联的。 构造函数不能是虚函数,因为构造对象还是一片未定型的空间。

74691

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

C++通过引入this指针解决该问题 即:C++ 编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),函数体中所有“成员变量”的操作,都是通过该指针去访问...this指针存在于哪里? C++,this指针是一个隐含的、非静态成员函数内部可用的特殊指针,它指向当前正在调用该成员函数的对象实例。...每次调用非静态成员函数,编译器都会自动将对象的地址作为额外的第一个参数传递给该函数 尽管源代码我们并不直接看到这个参数。函数体内部,this关键字用于引用这个隐含的指针。...然而,在某些特定情况下,this指针确实可能为空,特别是不正确的使用情况下,比如: 当对象尚未完全构造完成,即在构造函数初始化列表结束前或进入构造函数主体之前访问this,这时的行为是未定义的,编译器不会阻止这样的行为...,移动构造函数或移动赋值运算符,当源对象即将被移动(资源转移)后置为无效状态,也可能出现类似情况,但这不是this本身为空,而是对象即将变成无效状态。

9510

C++复习大全(各种知识点)

C++允许作用域内的任意地方定义变量,所以可以正好使用它之前定义,可以定义变量对它初始化以防止某种类型的错误  指定存储空间分配  1.全局变量  全局变量是在所有的函数体的外部定义的,程序的所有部分...C++通过命名技术把每一个成员函数都转换成了名字唯一的全局函数,并把通过对象指针和引用对每一个成员函数的调用语句改写成相应的全局函数调用语句。...,可以生成一个中间临时变量直接优化代码(生成匿名对象一个表达式里面就会优化 } -C++,初始化和清楚地概念是简化库的使用的关键之处,并可以减少那些客户程序员忘记去完成这些操作时会引发的细微错误...当编译器需要创建一个对象又不知道任何细节时,默认的构造函数就显得非常重要  - 当有构造函数而没有默认构造函数,定义的变量就会出现一个编译错误  - 因为由编译器生成的构造函数应该可以做一些智能化的初始化工作...- 解决办法,如果我们还是想要把内存初始化为0,那就得显式地编写默认的默认构造函数。  - 构造函数的重载,当我们想要初始化对象不同个数的数据,我们就可以同时声明类外定义多个构造函数。

1K20

C++ new与delete的使用规范

C++的动态内存管理是通过new和delete两个操作来完成的,即用new来申请空间,用delete来释放空间。使用new和delete,注意以下原则。...由此可知,多次释放同一块内存空间,即使不导致程序运行中断,也会破坏环境,使指针与所对应的空间的隶属关系出现混乱,从而导致逻辑错误大型程序设计,这种逻辑错误的查找会变得十分费时费力。...2.new[]与delete[]需一一对应 申请对象数组,需要使用new[]运算符,与之对应,释放对象数组,需要使用delete[]运算符。...3.构造函数的new/new[]与析构函数的delete/delete[]需一一对应 当类的成员中有指针变量构造函数中用new申请空间并且析构函数中用delete释放空间是一种“标准的”、安全的做法...C++,一个构造函数不能调用本类的另一个构造函数,其原因就是为了防止构造函数的相互调用打破了内存申请与释放之间的这种对应关系。

1.3K41

CC++常见面试知识点总结附面试真题—-20220326更新

int *p = new int(1); 特别的,C++,如下的代码,用new创建一个对象(new 会触发构造函数, delete会触发析构函数),但是malloc仅仅申请了一个空间,所以C++引入...转换的目标类型必须是指针或者引用 拓展 C++,普通类型可以通过类型转换构造函数转换为类类型,那么类可以转换为普通类型吗?答案是肯定的。...如果用 ifndef 包含某一段宏定义,当这个宏名字出现“撞车”,可能会出现这个宏程序中提示宏未定义的情况(在编写大型程序时特别需要注意,因为有很多程序员同时写代码)。...类型名 (*数组标识符)[数组长度] 指针数组,C语言和C++,数组元素全为指针的数组称为指针数组,其中一维指针数组的定义形式如下。指针数组每一个元素均为指针,其本质为数组。...如果拷贝构造函数的参数不是当前类的引用,而是当前类的对象,那么调用拷贝构造函数,会将另外一个对象直接传递给形参,这本身就是一次拷贝,会再次调用拷贝构造函数,然后又将一个对象直接传递给了形参,将继续调用拷贝构造函数

1.4K10

如何把CPP源程序改写成C语言?

方法有两种: 第一种是将C++的面向对象特征去掉,先全部理解源代码的逻辑,然后改写;第二种是C中保留面向对象的部分特征,用结构体实现类的功能。...1)对于类的数据成员可以直接转为C结构体的数据成员。 2)函数则需转化为对应的函数指针,因为struct里不允许出现函数的声明和定义。...C,无论是哪个struct都用函数指针U替代析构函数。...这样调用的时候,会根据你输入的参数不同,调用不同的函数。 C只好分别起不同的名字,没有别的解决办法。 2)运算符重载 运算符重载只是为了满足一般的运算符使用的习惯而又不会出现错误。...类之间的继承关系是复杂且多变的,为了保证基类在所有子类唯一而且方便修改,最好的方法就是把基类的结构体部分做成宏,子类中直接使用即可。

2.1K20

《逆袭进大厂》之C++篇49问49答

语言的头文件,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,.c文件包含了extern "C"时会出现编译语法错误。...构造,根据对象的类型去初始化虚指针vptr,从而让vptr指向正确的虚表,从而在调用虚函数,能找到正确的函数 (3)所谓的合适时机,派生类定义对象,程序运行会自动调用构造函数,构造函数创建虚表并对虚表初始化...构造子类对象,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写...,那么再释放浅拷贝的指针的资源就会出现错误。...,使用delete会造成内存泄漏或者之后释放内存出现运行时错误

1.9K10

《逆袭进大厂》之C++篇49问49答(绝对的干货)

语言的头文件,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,.c文件包含了extern "C"时会出现编译语法错误。...构造,根据对象的类型去初始化虚指针vptr,从而让vptr指向正确的虚表,从而在调用虚函数,能找到正确的函数 (3)所谓的合适时机,派生类定义对象,程序运行会自动调用构造函数,构造函数创建虚表并对虚表初始化...构造子类对象,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写...,那么再释放浅拷贝的指针的资源就会出现错误。...,使用delete会造成内存泄漏或者之后释放内存出现运行时错误

2.5K40

RuntimeException和非RuntimeException的区别「建议收藏」

C++异常分类的不同 : ① JavaRuntimeException这个类名起的并不恰当,因为任何异常都是运行时出现的。...(在编译出现错误并不是异常,换句话说,异常就是为了解决程序运行时出现的的错误)。...对于一个异常对象,真正有用的信息异常的对象类型,而异常对象本身毫无意义。比如一个异常对象的类型是ClassCastException,那么这个类名就是唯一有用的信息。...③ 异常对象通常有两种构造函数:一种是无参数的构造函数;另一种是带一个字符串的构造函数,这个字符串将作为这个异常对象除了类型名以外的额外说明。...③ 异常对象包含的信息 :一般情况下,异常对象唯一有用的信息就是类型信息。但使用异常带字符串的构造函数,这个字符串还可以作为额外的信息。

1.7K10

C++学习知识点

(4)C++的纯虚函数C#叫虚构函数。...对象赋给另外一个对象的引用或者指针,如何传递的 当对象赋给另外一个对象的引用或者对象时候,将调用被赋值的拷贝构造函数。此时就存在深拷贝和浅拷贝。...如果只是简简单单的进行浅拷贝,也就是值拷贝,会出现一个对象被析构后,另一个对象的成员变量,比如指针会指向被释放的内存空间,这就是指针悬挂问题。此时就需要手动书写拷贝构造函数,完成深拷贝。...附:C++出现拷贝的情况有三种: (1) 建立一个新对象,并用另一个同类的已有对象对新对象进行初始化。...(3) 函数的返回值是类的对象函数调用结束,需要将函数对象复制一个临时对象并传给改函数的调用处。 12.

1.7K20

C++ new 与 delete 的使用规范

由此可知,多次释放同一块内存空间,即使不导致程序运行中断,也会破坏环境,使指针与所对应的空间的隶属关系出现混乱,从而导致逻辑错误大型程序设计,这种逻辑错误的查找会变得十分费时费力。...2.new[] 与 delete[] 需一一对应 申请对象数组,需要使用new[]运算符,与之对应,释放对象数组,需要使用delete[]运算符。...为了避免出现上面的错误,建议不要对数组使用 typedef,或者采用 STL 的 vector 代替数组。...3.构造函数的 new/new[] 与析构函数的 delete/delete[] 需一一对应 当类的成员中有指针变量构造函数中用new申请空间并且析构函数中用delete释放空间是一种标准的... C++ ,一个构造函数不能调用本类的另一个构造函数,其原因就是为了防止构造函数的相互调用打破了内存申请与释放之间的这种对应关系。

72110

内存泄漏漫谈

对于内存泄漏,维基百科的定义是:计算机科学,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。...对于new[]/delete[],由于需要调用对象构造和析构函数,分配还需要记录数组的长度(VC下会使用分配的内存的前4字节来记录),所以,这种情况下new[]和delete[]必须配对使用。...3、C++类设计不当 典型的,对于C++子类的动态分配的指针,析构函数执行释放操作,如果基类析构函数不是virtual,泄漏也会发生: class BaseClass { public: BaseClass...还有如果缺少或错误的拷贝构造函数(包括赋值运算符重载)造成的对象浅拷贝问题,封装函数返回动态分配的对象留下内存泄漏隐患等等。...比如程序中使用了某个全局的容器(比如内存池),运行,程序不断地生成对象放到这个容器,当且仅当程序退出,这个容器才会对其中的对象进行释放,但是实际上很多对象程序可能只需要引用一次,也就是说容器实际存储的是大量的垃圾对象

2.5K70

C++ 为什么不加入垃圾回收机制

使用指针形式的对象(请注意,由于引用在初始化后不能更改引用目标的语言机制的限制,多态性应用大多数情况下依赖于指针进行),程序员必须自己完成存储器的分配、使用和释放,语言本身在此过程不能提供任何帮助...因此,我们可以将需要分配的资源构造函数申请完成,而在析构函数释放已经分配的资源,只要对象的生存期结束,对象请求分配的资源即被自动释放。...智能指针 幸运的是,出于某些原因,C++的标准库至少引入了一种类型的智能指针,虽然使用上有局限性,但是它刚好可以解决我们的这个难题,这就是标准库唯一的一个智能指针::std::auto_ptr。...,因此函数退出点生存期结束,此时auto_ptr的析构函数调用,自动销毁内部指针维护的string对象(先前构造函数通过new表达式分配而来的),并进而执行string的析构函数,释放为实际的字符串动态申请的内存...最后,整个过程,除了使用shared_ptr 的构造函数使用了new表达式创建新之外,并没有任何删除指针的动作,但是所有的内存管理均正确无误,这就是得益于shared_ptr的精巧的设计。

79730
领券