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

【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)

前言 之前我们在 类和对象(上)中了解了关于类的定义、对象的创建等一些基本知识: 【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)-...当我们在类中没有显示地定义构造函数时,编译器会自动生成一个无参的构造函数,用于创建对象时的初始化。一旦用户显示定义了构造函数之后,编译器则不会生成。 6....我们在创建对象时,编译器会自动调用构造函数对成员变量进行初始化,这样我们就不需要单独定义或者使用Init函数对某个类进行初始化了。...对于一个局部域中的多个对象在进行销毁时,c++规定后创建的对象先析构。 那么我们什么时候该显示写析构函数呢?...它的特点如下: 1. c++规定对象只要发生拷贝行为,就必须调用拷贝构造,包括对象传参或者做返回值,都需要产生一份临时拷贝。 2. 拷贝构造函数的第一个参数必须是类类型的引用,而不是对象的值。

1.3K10

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

一、在不同的内存中创建类的实例对象 1、栈内存中创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) 中 , 介绍了 三种类型的 构造函数 , 并在 main 函数中 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 类实例对象 , 最终将实例对象赋值给了..., 会自动将栈内存中的实例对象销毁 ; 栈内存中 调用 构造函数 创建的 实例对象 , 不需要关注其内存占用 ; 2、堆内存中创建实例对象 在 栈内存 中声明 类 的 实例对象 方式是 : 该 s1...; Student* s2; 在 C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建类的 实例对象 ; 在下面的 C++ 代码中 , 声明并定义了 MyClass 类 , 该类定义了一个有参构造函数..., 接受两个整数作为 构造函数参数 ; 在 main 函数中 , 使用 使用 new 关键字 来调用 有参构造函数 创建 MyClass 类实例对象 ; class MyClass { public

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

    【JavaScript】对象 ③ ( 使用 new Object 创建对象 | 使用 构造函数 创建对象 | 构造函数语法 | 使用 字面量 和 new Object 创建对象的方法弊端 )

    一、使用 new Object 创建对象 1、使用 new Object 创建对象语法 使用 new Object 创建对象语法如下 : var obj = new Object(); 创建后的对象 是一个空对象... 执行结果 : 二、使用 构造函数 创建对象 1、字面量 和 new Object 创建对象的方法弊端 在 JavaScript 中 , 使用 字面量 和 new Object...- 使用 " 构造函数 " 方式 创建对象 ; 2、构造函数引入 创建对象时 , 属性和方法的结构都是相同的 , 只是 属性值 不同 , 这里就可以通过 构造函数 只设置 不同的 属性值 , 就可以...实现 批量构造 对象 ; 构造函数 的 也是一个函数 , 只是 其中的 函数体 不是 普通的代码 , 而是一个对象 ; 构造函数 的 本质 就是 把 对象中的 属性 和 方法 抽象出来 , 封装到 构造函数...的 函数体 中 ; 3、构造函数语法 在 JavaScript 中 , 可以使用 " 构造函数 " 来创建对象 , 构造函数 本质上是一个普通的函数 , 通常情况下 将 构造函数 函数名 的首字母大写

    1.7K10

    【C++】类和对象(中):类的默认成员函数,构造函数、析构函数、拷贝构造函数、运算符重载

    2.构造函数 构造函数是特殊的成员函数,构造函数虽然名称叫构造,但是它的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时空间就开好了),而是对象实例化时初始化对象。...构造函数的本质就是要代替我们以前Stack类中写的Init函数功能,构造函数能自动调用的特点就完美替代了Init函数。 2.1构造函数的基础特点 共4点: 1.函数名与类名相同。 2.无返回值。...共3点: 1.如果类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显示定义,编译器就不再生成。...所以使用时要注意,确保返回的对象在当前函数结束后还在,再使用。 5.运算符重载 运算符被用于类类型时,C++允许我们通过运算符重载的形式指定新的含义。...这里注意跟拷贝构造函数区分,拷贝构造用于一个对象初始化另一个要创建的对象。 还是拿Date类举例,区分一下赋值运算符重载和拷贝构造。

    1.5K10

    《吃透 C++ 类和对象(中):构造函数与析构函数的核心逻辑》

    前言:在上篇博客中我们初始学习了类和对象的一些知识,今天这篇博客主要是给大家分享一下类中的几个默认成员函数,第一部分我们会先学习构造函数和析构函数。...二.构造函数 构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时,空间就开好了),而是对象实例化时初始化对象...构造函数的本质是要替代我们以前Stack和Date类中写的Init函数的功能,构造函数自动调用的特点就完美的替代的了Init。 构造函数的特点: 函数名与类名相同。 无返回值。...如果类中没有显式定义构造函数,则C++编译器会自动生成⼀个无参的默认构造函数,一旦用户显式定义编译器将不再生成。...//注意:如果通过无参构造函数创建对象时,对象后面不用跟括号。

    15510

    JS 函数中的 arguments 类数组对象

    1. arguments 介绍 2. arguments 转为数组 3. 箭头函数中没有 arguments 1. arguments 介绍 众所周知,js 是一门非常灵活的语言。...当我们在 js 中调用一个函数时,经常会给函数传递一些参数,js 把调用函数时传入的全部实参存储到一个叫做 arguments 的类数组对象里面 arguments 是一个类数组对象,不是一个真正的数组...这里做下总结 arguments 是类数组对象(伪数组),即不是一个真正的数组,而是一个对象。...它有 length 属性,并且可以通过下标获取元素,但是它不能调用数组方法,就是因为它不是真正的数组,这一点可以通过查看它的原型验证 2. arguments 转为数组 arguments 是类数组对象...箭头函数中没有 arguments arguments 只存在于普通函数中,而在箭头函数中是不存在的 下面代码抛出错误异常:Uncaught ReferenceError: arguments is not

    7.4K20

    C++中类的真身和对象的构造(一)

    类的真身 1、类的关键字:      在类的封装文章里面,我们使用了关键字"struct +name"来表示创建了一个类名,但是其实在c++里面,创建类的关键字不是strcut,而是我们的“class”...对象的构造 1、不知道读者有没有注意,在上面定义的类中,类里面的属性没有给它初始化,那到底是多少呢,是0还是随机值呢?...在堆上创建对象时,对象访问类中的属性也是为随机值(这里试验结果虽然是0,但是实际结果不好说;同时这里使用new为指针p 分配了空间,在使用完后,我们要进行释放,这里使用delete关键字;这里类似我们c...2、其实一般来说对象访问类里面的属性都要有一个初始化,在c++里面有一一个构造函数,就可以解决对象访问类中的属性初值问题,就不用管第一条说的那样(分栈、堆啥的),那我们怎样使用构造函数呢?...首先我们要明白构造函数的定义: C++中可以定义与类名相同的特殊成员函数,这个特殊成员函就是构造函数了。 构造函数没有任何返回类型的声明。 构造函数在对象定义时自动被调用。

    65120

    C++:类和对象(中)构造函数与析构函数》

    二、构造函数 构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时,空间就开好了),而是对象实例化时初始化对象。...构造函数的本质是要替代我们以前Stack和Date类中写的Init函数的功能,构造函数自动调用的特点就完美的替代的了Init。 构造函数的特点: 函数名与类名相同。 无返回值。...如果类中没有显式定义构造函数,则C++编译器会自动生成⼀个无参的默认构造函数,一旦用户显式定义编译器将不再生成。...//注意:如果通过无参构造函数创建对象时,对象后面不用跟括号。...C++:类和对象(上)、封装、实例化和this指针详解》 总结:在本篇博客中我们学习了构造函数和析构函数这两个类的默认成员函数,整体来看还是比较有难度的,类的前四个默认成员函数是一定要掌握的。

    13310

    【C++指南】类和对象(二):类的默认成员函数——全面剖析 :构造函数

    这些默认成员函数,包括构造函数、析构函数、拷贝构造函数以及赋值运算符重载函数,是C++类设计中不可或缺的部分,它们定义了对象如何被创建、销毁、复制以及赋值。...拷贝构造函数和赋值运算符重载函数则与对象的复制行为紧密相关,它们定义了如何创建一个对象的副本以及如何将一个对象的状态复制到另一个对象上。...本文旨在详细讲解C++中类的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载函数以及取地址运算符重载函数的基本概念、使用场景、实现细节和注意事项。...深入解析C++类的构造函数 构造函数的概念 C++中的构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。...要注意构造函数的主要任务并 不是开空间创建对象(我们常使用的局部对象是栈帧创建时,空间就开好了),而是对象实例化时初始化。 对象构造函数的名字与类名完全相同,并且没有返回类型(连void也不允许)。

    74210

    【C++指南】类和对象(四):类的默认成员函数——全面剖析 : 拷贝构造函数

    拷贝构造函数是C++中一个重要的特性,它允许一个对象通过另一个已创建好的同类型对象来初始化。...了解拷贝构造函数的概念、作用、特点、规则、默认行为以及如何自定义实现,对于编写健壮和高效的C++程序至关重要。...关于浅拷贝与深拷贝的详细内容可以参考文章: 【C++指南】C++中的浅拷贝与深拷贝:深入剖析-CSDN博客 特点 自动调用:在对象通过另一个对象初始化时,拷贝构造函数会被自动调用。...触发拷贝函数自动调用的情况: 1.对象初始化: 使用另一个同类型的对象来初始化一个新对象时。...Tips: 如果⼀个类显式实现了析构并释放资源,那么他就 需要显式写拷贝构造,否则就不需要 以下是一个包含动态分配内存的类的示例,展示如何自定义拷贝构造函数: #include

    87710

    《挑战30天C++入门极限》C++类对象的复制-拷贝构造函数

    C++类对象的复制-拷贝构造函数   在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a =...,他们之间的特性有相似之处也有不同之处,类对象内部存在成员变量,而普通对象是没有的,当同样的复制方法发生在不同的对象上的时候,那么系统对他们进行的操作也是不一样的,就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的...下面,我们为了说明情况,就普通情况而言(以上面的代码为例),我们来自己定义一个与系统默认拷贝构造函数一样的拷贝构造函数,看看它的内部是如何工作的!   ...“出人意料”,从思维逻辑上说,当无名对象创建了后,是应该调用自定义拷贝构造函数,或者是默认拷贝构造函数来完成复制过程的,但事实上系统并没有这么做,因为无名对象使用过后在整个程序中就失去了作用,对于这种情况...c++会把代码看成是: Internet a("中国软件开发实验室",www.cndev-lab.com);   省略了创建无名对象这一过程,所以说不会调用拷贝构造函数。

    91620

    C++中类中同时存在继承以及组合时候,构造函数的构造顺序

    C++的一大特点就是面向对象,面向对象主要就是类的一些相关特性(封装、继承、多态)。 那么在类的继承以及类的成员属性包含其他类实例对象的时候,构造函数的构造顺序到底是怎么样子的呢?...相信大家都知道,实例化对象首先需要的是调用自身的构造函数进行分配内存空间之后进行实例化对象,这就是构造函数的整个过程(两步)。...那么当一个类对象既包含了继承关系同时也在自身的成员属性中包含了其他类对象的实例化的时候,那么这时候实例化该类的对象时候,构造函数的顺序会是怎么样子的呢?下面来看看这一段代码吧。...类的构造函数" << endl; } private: B b; // 类C中组合有B类对象成员 int i_c; }; int main() { C...A 类的构造函数 B 类的构造函数 C 类的构造函数 构造顺序是首先构造继承的父类,其次构造组合中的实例对象,最后才是构造自己本身。

    1.8K20

    【CC++】类和对象(中):(一)类的默认成员函数——构造函数,析构函数

    默认成员函数是既重要又复杂,我们要从下面这两个方面去重点学习—— 二、构造函数 (一)构造函数的概念 构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象...(我们常使用的局部对象是栈帧创建时,空间就开好了),而是对象实例化时初始化对象。...构造函数的本质是要替代我们以前Stack和Date类中写的Init函数的功能,构造函数自动调用的特点就完美的替代的了Init。...3、对象实例化时系统会自动调用对应的构造函数; 4、构造函数可以重载; 5、如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。...+】类和对象(上):(二)实例化——类实例化出对象,对象大小,this指针,对比C++/C两种语言实现Stack 【C/C++】类和对象(上):(一)类和结构体,命名规范——两大规范,新的作用域——类域

    19010

    【c++】类和对象 (中) (类的默认成员函数)

    类的默认成员函数 在C++中,如果你定义了一个类但没有显式地提供特定的成员函数(比如构造函数、析构函数、拷贝构造函数、拷贝赋值运算符等),编译器会为这些函数生成默认的实现。...构造函数  构造函数是特殊的成员函数,需要注意的是,构造函数完成的并不是在内存中开空间的过程。当创建一个类的对象时,系统会为这个对象分配一块内存空间,以存储对象的数据成员。...下面的是用c语言实现的链表的初始化,相比之下我们可以发现c++中的构造函数并不需要显式的调用  带参构造函数 #include using namespace std; //创建一个类...拷贝构造函数是构造函数的⼀个重载。 2. 拷贝构造函数的第一个参数必须是类类型对象的引用,使用传值方式编译器直接报错,因为语 法逻辑上会引发无穷递归调用。 3....C++规 定类类型对象使用运算符时,必须转换成调用对应运算符重载,若没有对应的运算符重载,则会编译报错。 • 运算符重载是具有特名字的函数,他的名字是由operator和后面要定义的运算符共同构成。

    8310

    【C++修行之道】类和对象(二)类的6个默认成员函数、构造函数、析构函数

    2.4 一般情况,建议每个类,都可以写一个全缺省的构造(好用) 三、析构函数 3.1 概念 3.2 特性 3.3 C++实现括号匹配和C语言的不同 一、类的6个默认成员函数 如果一个类中什么成员都没有,...这是因为C++的语法允许这样的歧义,而且函数声明的优先级高于对象定义。因此,即使你本意是想创建一个对象,编译器也会将其视为一个函数声明。为了避免这种歧义,最好不要在对象定义时使用空括号。...在实际应用中,通常建议在类的构造函数中初始化这些成员,以确保对象的状态是确定的。...确保成员变量的正确初始化:自动生成的构造函数会调用成员变量的默认构造函数,确保 MyQueue 中的两个 Stack 对象在 MyQueue 对象创建时被正确初始化。...注意:创建哪个类的对象则调用该类的析构函数,销毁那个类的对象则调用该类的析构函数 6.

    72110

    最全面的c++中类的构造函数高级使用方法及禁忌

    说明一下,我用的是gcc7.1.0编译器,标准库源代码也是这个版本的。 本篇文章讲解c++中,构造函数的高级用法以及特殊使用情况。 1....里面使用移动构造就要小心了,一不小心就会出现问题哦,具体移动构造怎么实现可以参考上面第一点中的代码。...,是先执行父类构造函数,再执行子类构造函数,那这里再思考一下上面第二点,如果构造函数可以为虚函数,那根据多态规则,父类的构造函数将不会被执行,这也是不成立的。...怎么防止类对象被拷贝和赋值 防止类对象被拷贝和赋值,换句话说,就是不能调用类的拷贝函数和赋值运算符重载函数,我们首先能想到的就是把这两个函数声明为private的,或者私有继承一个基类,而到了c++11...,而当子类没有实现的时候才调用父类的虚函数,这一幕是不是很熟悉,实际上就是发生了多态的效果,通过gdb跟踪CSon的构造函数,输出当前对象的数据,如下: (gdb) p *this $2 = (CSon

    2.3K30

    【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

    一、继承 + 组合 模式的类对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 , 又 在类中 维护了一个 其它类型 的 成员变量 , 那么 该类 的 构造 与 析构 , 就需要涉及到...类 本身 的 构造函数 和 析构函数 , 父类 的 构造函数 和 析构函数 , 类 成员变量 的 构造函数 和 析构函数 ; 2、调用规则 在 继承 + 组合 的情况下 , 构造函数 与 析构函数 调用规则如下...: 构造函数 : 父类 -> 成员 -> 自身 ; 首先 , 调用 父类 构造函数 ; 然后 , 调用 成员 构造函数 ; 也就是 成员变量 类型的 构造函数 ; 最后 , 调用 自己 构造函数 ;...函数调用" << endl; } public: int z; D d; }; 可根据下面的调用规则 , 分析出 C 类对象中 , 涉及到的 父类构造/析构函数 , 自身构造/析构函数..., 分析构造函数调用顺序 ; A 和 B 的构造函数 , 是 父类构造函数 ; D 构造函数 , 是 成员构造函数 ; C 构造函数 , 是 自身构造函数 ; 构造函数的调用顺序为 : 父类 -> 成员

    97310

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

    一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ 的 " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象的...地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 公有继承 " 的 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 的 完整功能 , 使用 基类 可以解决的问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向

    2K20
    领券