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

【C++】This指针和复制构造函数

因为this表示这个对象的指针,所以*this就表示这个对象了 (*this).调用成员变量/函数和this->调用成员变量/函数,是一样的效果!...注意给*this添加括号,因为.运算符的优先级比较高 复制构造函数 复制构造函数和普通构造函数有一些相似处的,也没有返回值,类名作为函数名!...复制构造函数一种特殊的构造函数,在创建一个新的对象时将其他对象作为参数时, 编译器将会调用复制构造函数。不提供时使用默认构造函数。默认构造函数内部各个成员变量赋值。...,需要在其他函数前面先实现) 复制构造函数也是构造函数的一种!...如果我们把复制构造函数 CTime::CTime(CTime& time)修改为CTime::CTime(CTime time) CTime& time是一个引用类型的参数,现在将引用去掉的话,就满足了调用复制构造函数中的一种

83720

C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造

C++ 构造函数构造函数是 C++ 中一种特殊的成员函数,当创建类对象时自动调用。它用于初始化对象的状态,例如为属性分配初始值。构造函数与类同名,且没有返回值类型。...拷贝构造函数: 用于从另一个已存在的对象创建新对象。移动构造函数: 用于从即将销毁的临时对象转移资源到新对象。默认构造函数默认构造函数是最简单的构造函数,不接受任何参数。...参数可以是任何有效的 C++ 数据类型,包括基本类型、自定义类对象和指针。...它通常用于复制另一个对象的属性值,而不共享原始对象的数据。...总结构造函数是 C++ 中重要的面向对象编程机制,用于初始化和管理对象的状态。通过理解不同类型的构造函数及其用法,您可以创建健壮且可维护的 C++ 代码。

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

    C++:堆与拷贝构造函数及补充this指针

    delete p;//释放堆对象的空间,此时C++自动调用析构函数~student() } 如果需要调用有参构造函数,参考以下程序片段 class Tdate{ public:...delete[] p;//释放这5个对象数组空间 } delete[]即是告诉 C++ 该指针指向的是一个数组,[]不需要写上数组长度,如果有,C++ 编译器也会将其忽略,但绝不能忘记写[]。...与构造函数类似,当开发者没有定义自己的拷贝构造函数时,C++ 将提供一个默认拷贝构造函数。...浅拷贝与深拷贝 浅拷贝即是像默认拷贝构造函数那样对数据成员进行简单的复制,那么如果对象中存在分配的资源(如堆内存)我们就不能在进行简单的浅拷贝,那样会使多个对象拥有同一块内存资源,如果其中一个对象遭到释放...【补充】this 指针 this 指针,其实我们看名字可以知道,这个指针肯定是指向与自己相关的,或正在处理的内存空间。

    81420

    C++核心准则讨论:如果一个类是资源句柄,则它需要一个构造函数,一个析构函数以及复制和或移动操作

    class is a resource handle, it needs a constructor, a destructor, and copy and/or move operations 讨论:如果一个类是资源句柄...,则它需要一个构造函数,一个析构函数以及复制和/或移动操作 Reason(原因) To provide complete control of the lifetime of the resource....如果所有成员都是资源句柄,请尽可能依靠默认的特殊操作。...现在,Named类具有默认的构造函数,析构函数以及有效的复制和移动操作(如果T具有)。...但是,如果类具有某些默认操作,则应具有全部默认操作,并且如果类具有作为资源句柄的成员,则应将其视为资源句柄。

    55120

    《C++中的移动构造函数与移动赋值运算符:高效编程的利器》

    二、移动语义的背景 在 C++中,传统的拷贝构造函数和拷贝赋值运算符在处理对象时,会进行深拷贝,即将源对象的所有数据成员逐一复制到目标对象中。...,首先检查是否是自我赋值,如果不是,则释放目标对象的现有资源,然后将源对象的资源转移到目标对象中,并将源对象的资源指针置为 nullptr 。...与移动构造函数协同工作 移动赋值运算符与移动构造函数协同工作,为对象的资源管理提供了更完整的解决方案。...如果函数返回的是一个右值对象,编译器可以自动调用移动构造函数将返回值对象的资源转移到接收对象中,避免了不必要的资源复制。 3. ...七、总结 C++中的移动构造函数和移动赋值运算符是提高程序性能和资源管理效率的重要工具。它们通过避免不必要的资源复制,实现了资源的高效转移和更新。

    10010

    C++初阶类与对象(三):详解复制构造函数和运算符重载

    上次介绍了构造函数和析构函数:C++初阶类与对象(二):详解构造函数和析构函数 今天就来接着介绍新的内容: 文章目录 1.拷贝构造函数 1.1引入和概念 1.2特性 2.赋值运算符重载 2.1运算符重载...因为: Stack类里成员变量有一个指针,当我们传值调用函数会形成一个拷贝,在函数结束,fun2里st对象生命周期结束会自动调用析构函数进行销毁,所以指针指向的空间已经被free()还给操作系统了,而...再次销毁必然崩溃 看到c++里值拷贝是有风险的(默认拷贝),所以解决方案: 规定,自定义类型对象拷贝的时候,调用一个函数,这个函数就叫拷贝构造函数 1.2特性 拷贝构造函数也是特殊的成员函数...Stack类涉及到涉及到资源申请有一个_a指针和动态开辟,使用默认的会发生最初的问题(连续两次释放) 注意:类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构造函数是一定要写的...和上面拷贝构造一样:日期类这样的是不需要实现的(使用默认的就够了);但是像是Stack类这样的一旦涉及到资源申请时,则拷贝构造函数是一定要写的(要用深拷贝) 赋值运算符重载与拷贝构造调用区别: int

    21410

    《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

    在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。...,如果不是,则释放目标对象的现有资源,然后将源对象的  data  指针转移到目标对象,并将源对象的  data  指针设置为  nullptr 。...但是,如果我们明确使用移动构造函数和移动赋值运算符,仍然可以提高代码的可读性和可维护性。...三法则 如果一个类定义了析构函数、复制构造函数或复制赋值运算符中的任意一个,那么它通常也应该定义移动构造函数和移动赋值运算符。这被称为三法则。...如果一个类定义了析构函数、复制构造函数、复制赋值运算符、移动构造函数或移动赋值运算符中的任意一个,那么它通常也应该定义其他四个。这被称为五法则。

    7700

    C++基础——C++面向对象之类、对象与继承基础总结(类和对象概念、构造函数与析构函数、this指针、继承)

    实际上定义类时, 如果没有人为定义构造函数和析构函数, 编译器就会生成一个构造函数和析构函数, 只是他们不会做任何事情,所以对我们来说不会关注到。...构造函数特点: 1)构造函数必须与类名同名; 2)可以重载; 3)没有返回类型,即使是 void 也不行。         析构函数与构造函数相反, 在对象结束其生命周期时系统自动执行析构函数。...<<endl; } }; int main() { People people; cout构造与析构函数示例"<<endl; return 0; }         仍然是定义一个...1.3 this指针         每个对象都拥有一个 this 指针, this 指针记录对象的内存地址,在 C++中, this 指针是指向类自身数据的指针, 简单的来说就是指向当前类的当前实例对象...+中类和对象的基本概念,给出了构造函数和析构函数的区别,并总结了this指针的使用方法,有了以上基础后,进一步总结了C++语言的三大特征之一继承的基本概念,并结合实例演示了继承的使用方法。

    92850

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

    一、全局函数 与 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 类的 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止...等同于 一级指针 , Student 引用用法与 Student 对象用法相同 // 全局函数 转为 成员函数 , 少了一个参数 Student StudentPlus(Student& s1, Student...---- 为 Student 类定义了有参构造函数 , 则其默认的无参构造函数 , 就不会生成 ; // 带参构造函数 Student(int age, int height) { this..., 只能调用上述 有参构造函数 , 如果使用 Student s2 的方式调用 默认构造函数 创建 Student 对象 , 就会报错 ; 如下带参数的构造函数 , 并且为其 有参构造函数 的参数 设置一个默认值...height = " height << endl; } // 全局函数中 , 将两个 Student 对象相加 // 引用的 等同于 一级指针 , Student 引用用法与

    23820

    c++ thread探坑

    只有在明确要新线程修改局部变量,并且通过join()等手段确保线程会在函数完成前结束。 补充:新线程访问局部变量指针很好理解,只需要把指针传入构造函数的参数中即可。...thread过程实现了一次参数的复制构造和移动构造,第一次复制构造在当前线程空间创建参数的副本,第二次移动构造应该是在堆上创建了副本的副本,所以最后离开作用域之后只有原变量和第一副本被析构。...如果一定要在新线程中修改原始变量的话,则可以通过std::ref()。...同理,也可以对thread构造函数的第一个参数使用std::ref(),这种情况下就不会复制(或移动)函数指针或可调用对象。...但是实际上构造函数会将buffer指针一路复制(或移动)到新线程的存储,最后在新线程中调用f,此时才会自动构建string。

    1.3K100

    C++基础-类和对象

    关于复制构造函数的注意事项如下: 类包含原始指针成员(char *等)时,务必编写复制构造函数和复制赋值运算符。 编写复制构造函数时,务必将接受源对象的参数声明为 const 引用。...声明构造函数时务必考虑使用关键字 explicit,以避免隐式转换。 务必将类成员声明为 std::string 和智能指针类(而不是原始指针),因为它们实现了复制构造函数,可减少您的工作量。...除非万不得已,不要类成员声明为原始指针。...如果对象很大,两次复制造成的性能影响不容忽视。 为避免这种性能瓶颈, C++11 引入了移动构造函数。...增加移动构造函数后,上一示例中,将首先调用移动构造函数,然后调用复制构造函数,复制构造函数只被会调用一次。 3. 析构函数 析构函数在对象销毁时被调用。执行去初始化操作。

    98620

    四、从C语言到C++(四)

    如果 condition 的结果为真(非零),则整个三目运算符的值为 expression_if_true 的值;如果 condition 的结果为假(零),则整个三目运算符的值为 expression_if_false...我们为MyString类提供了一个移动构造函数,它接受一个右值引用参数other,并将other的数据指针“窃取”过来,同时将other的数据指针置为空。...移动构造函数和移动赋值运算符:通过定义移动构造函数和移动赋值运算符,我们可以实现资源的移动。这些函数使用右值引用作为参数,从源对象中获取资源,并将其“移动”到目标对象中。...如果我们简单地使用拷贝构造函数来复制这个类的对象,将会涉及大量的内存分配和复制操作。然而,通过定义移动构造函数和移动赋值运算符,我们可以实现资源的快速移动,避免不必要的开销。...总结 移动语义通过右值引用和移动构造函数/移动赋值运算符实现了资源的快速移动,避免了不必要的资源复制,提高了程序的性能。

    7810

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

    准备C/C++面试需要深入研究语言基础知识,掌握控制流结构、函数、指针和标准库,同时准备好回答各种与C/C++编程相关的问题,这将有助于你在面试中脱颖而出。...需要手动将其转换为适当的类型 new 会调用构造函数来初始化对象(如果是自定义类的对象),而 malloc 不会执行构造函数。 void * void * 是通用指针类型,被称为"无类型指针"。...,会影响实参的值; void baz(int *x) { *x = *x * 2; // 修改原始数据 } 堆和栈的区别 C++ 有几种构造函数 默认构造函数:默认构造函数没有参数,它用于创建对象的默认初始化...移动语义(Move Semantics):移动语义允许将资源从一个对象移动到另一个对象,而不是进行昂贵的数据复制。...构造函数和析构函数:如果基类的构造函数和析构函数是公有的,子类可以直接访问它们;如果基类的构造函数和析构函数是受保护或私有的,子类仍然可以访问它们,但只能在子类的构造函数和析构函数内部调用它们,不能在类外部使用

    30810

    对比 C++ 和 Python,谈谈指针与引用

    如果一个指针缺少指针类型,即 void *,则显然,其虽然保存了内存地址,但这仅仅是一个起点地址,指针会因为无法获知从起点向后进行的偏移量,从而拒绝解指针操作;而如果一个指针缺少地址,即 nullptr...,大幅提高效率使得对某个变量的修改能力不局限于变量自身的作用域使得 swap、移动构造函数、移动赋值运算等操作可以仅针对数据结构内部的指针进行操作,从而避免了对临时对象、移后源等对象的整体内存操作由此可见...2 C++中的引用在 C++ 中,引用具有与指针相似的性质,但更加隐形与严格。C++ 的引用分为以下两种:2.1 左值引用左值引用于其初始化阶段绑定到左值,且不存在重新绑定。...在这些场合中,移动构造函数和移动赋值操作通过右值引用接管被移动对象。右值引用与本文内容无关,故这里不再详述。...而由于对象从构造函数而来,至此我们可知:Python的构造函数将构造匿名对象,且返回此对象的一个指针。 这是 Python 与指针的第一个重要联系。

    1.3K20

    【笔记】《Effective C++》条款1-25

    处理自我赋值问题有几个方式: 证同测试: 在拷贝构造函数的最前面用if判断目标对象与当前对象地址是否相同, 相同则直接返回*this....这个方法顺便解决了证同问题 证同+备份: 如果对效率要求很高的话可以在备份指针的方法最前面再引入证同测试, 但是要衡量引入额外的if语句是否值得 复制构造并交换: 用赋值构造的方法构造一个当前类型的副本...如果拷贝构造是以值形式传入参数的话, 还可以直接将当前对象数据与传值进入的对象进行交换 12 复制对象时勿忘其每一个成分 当你选择实现自己的拷贝构造函数时, 一定要手动复制所有的局部变量, 同时调用所有基类合适的拷贝函数...如果有一些成员变量没有在初值列中进行拷贝, 那么此时对象将会进入局部拷贝状态 如果只拷贝了成员变量而没有调用基类的拷贝函数, 那么此时基类部分将会被默认初始化, 也属于一种局部拷贝 很多时候基类的拷贝函数与派生类的拷贝函数会有很多代码的重叠部分...相当于以前的auto_ptr, 只能移动而不可复制(复制操作默认是移动语义的), 没有其它成员变量, 可以用make_unique来初始化数组 shared_ptr: 有引用计数的指针, 因此可以复制

    1.1K30

    对比 C++ 和 Python,谈谈指针与引用

    如果一个指针缺少指针类型,即 void *,则显然,其虽然保存了内存地址,但这仅仅是一个起点地址,指针会因为无法获知从起点向后进行的偏移量,从而拒绝解指针操作;而如果一个指针缺少地址,即 nullptr...避免对实参无意义的值拷贝,大幅提高效率 使得对某个变量的修改能力不局限于变量自身的作用域 使得 swap、移动构造函数、移动赋值运算等操作可以仅针对数据结构内部的指针进行操作,从而避免了对临时对象、移后源等对象的整体内存操作...2 C++中的引用 在 C++ 中,引用具有与指针相似的性质,但更加隐形与严格。C++ 的引用分为以下两种: 2.1 左值引用 左值引用于其初始化阶段绑定到左值,且不存在重新绑定。...在这些场合中,移动构造函数和移动赋值操作通过右值引用接管被移动对象。 右值引用与本文内容无关,故这里不再详述。...而由于对象从构造函数而来,至此我们可知:Python的构造函数将构造匿名对象,且返回此对象的一个指针。 这是 Python 与指针的第一个重要联系。

    92450

    七、构造函数与析构函数

    调用机制 构造与析构函数的调用机制在C++中遵循一定的规则,这些规则确保了对象在创建和销毁时的正确初始化与清理。...深拷贝与浅拷贝 在C++中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种对象复制的方式,它们之间的主要区别在于如何处理对象的成员变量,特别是当成员变量是指针或引用类型时。...浅拷贝(Shallow Copy) 浅拷贝只是简单地将对象的成员变量值复制到另一个对象中。如果对象的成员变量是指针或引用,那么浅拷贝只是复制指针或引用的值,而不是指向的实际数据。...但是,深拷贝也可能导致更多的内存使用和更长的复制时间,因为需要创建新的内存区域并复制数据。 在C++中,如果需要执行深拷贝,通常需要显式地定义拷贝构造函数和拷贝赋值运算符。...,这里将出现悬挂指针问题,因为str1在销毁时会删除其数据 // 如果使用深拷贝,则每个对象都有自己的数据副本,可以安全地销毁 return 0; } 在上面的示例中,如果使用了浅拷贝构造函数

    13810

    《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

    对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数 调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象...这样就避免了新的空间的分配,大大降低了构造的成本。这就是移动构造函数设计的初衷; 2) 拷贝构造函数中,对于指针,我们一定要采用深层复制,而移动构造函数中,对于指针,我们采用浅层复制。...当退出函数的时候,临时变量可能被销毁,但是返回值却被放到寄存器中与临时变量的生命周期没有关系 如果我们需要返回值,一般使用赋值语句就可以了 《【C++】临时变量不能作为函数的返回值?》...-id-1826942.html 92、构造函数、拷贝构造函数和赋值操作符的区别 构造函数 对象不存在,没用别的对象初始化,在创建一个新的对象时调用构造函数 拷贝构造函数 对象不存在,但是使用别的已经存在的对象来进行初始化...0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

    2.4K40

    终极 C++避坑指南

    如果取消指针概念的话,就要强行区分哪些类型是“值类型”,会完全复制,哪些是“引用类型”,只会浅复制。 C#中的结构体和类的概念恰好如此,结构体是值类型,整体复制,而类是引用类型,要用库函数来复制。...在原始 C 中,auto表示“自动变量位置”,与之对应的是register。...平凡 “平凡(trivial)”指的是: 拥有默认无参构造函数 拥有默认析构函数 拥有默认拷贝构造函数 拥有默认移动构造函数 拥有默认拷贝赋值函数 拥有默认移动赋值函数 换句话说,六大特殊函数都是默认的...换句话说,符合“旧类型(C 语言中的类型)行为的类型”,它不存在虚函数指针、不存在虚表,可以视为普通二进制来操作的。...而析构函数中是delete操作,所以堆空间会被释放两次,导致报错。 这也就是说,对于非平凡析构类型,其发生移动语义后,应当放弃对原始空间的控制。

    2.3K20
    领券