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

C++复制构造函数赋值运算符

前言: C++面向对象编程过程中,凡是在中运用到动态内存分配时候总是会写一个显示复制构造函数赋值重载运算符,本文将结合C++ Primer Plus一书内容分析下原因: 一、在C++编程中如果没有编写下列成员函数...但是(4)(5)造成较大影响 二、赋值构造函数 1、函数原型  Class_name(const Class_name &) 2、什么时候会用调用复制构造函数?    ...而且有些情况编译器会生成临时变量,然后将临时变量在赋值给被传递对象。 3、默认复制构造函数做了哪些事情?     默认赋值构造函数逐个复制非静态成员值。注意是值,是一种浅复制。...由于默认复制构造函数中没有num++,而不管用那个构造函数构造对象调用都是同一个析构函数,而析构函数中含有num--,所以临时对象导致num多减了一次,所以最后一句话会出现,“析构后对象个数是-...当将已有的对象赋给另一个对象时,将使用赋值运算符。 3、默认复制运算符做了什么事情?    其实它默认赋值构造函数差不多,都是进行浅复制

1.2K70

原型模式C++复制构造函数赋值运算符

一、简介 1、原型模式,用原型实例指定创建对象种类,并且通过拷贝这些原型创建新对象。 2、为什么会用到原型模式? (1)既然可以直接new,为什么会用到原型模式?...这个可以从两个角度来说,第一,时间消耗角度:如果创建实例构造函数非常复杂,在执行这个构造函数时会消耗较长时间,这时如果需要一个跟刚刚实例化对象参数差不多实例(可以完全相同,也可以大部分相同)那么直接使用...(2)既然可以直接赋值,为什么会用到原型模式?...因为之间直接赋值的话,默认拷贝函数是进行引用赋值 对于指针复制造糟糕结果,这点可以参见C++ primer plus "动态内存分配"章节,也可以参见我另一篇技术博客 C++复制构造函数赋值运算符...2 // 3 4 #include "stdafx.h" 5 #include 6 using namespace std; 7 8 //声明一个虚拟基,所有的原型都从这个基继承

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

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

C++对象复制-拷贝构造函数   在学习这一章内容前我们已经学习过了构造函数析构函数相关知识,对于普通类型对象来说,他们之间复制是很简单,例如: int a =...,他们之间特性有相似之处也有不同之处,对象内部存在成员变量,而普通对象是没有的,当同样复制方法发生在不同对象时候,那么系统对他们进行操作也是不一样,就对象而言,相同类型对象是通过拷贝构造函数来完成整个复制过程...因为当一个没有自定义拷贝构造函数时候系统自动提供一个默认拷贝构造函数,来完成复制工作。   ...就上面的代码情况而言,很多人问到,既然系统自动提供一个默认拷贝构造函数来处理复制,那么我们没有意义要去自定义拷贝构造函数呀,对,就普通情况而言这的确是没有必要,但在某写状况下,体内成员是需要开辟动态开辟堆内存...,如果我们不自定义拷贝构造函数而让系统自己处理,那么就会导致堆内存所属权产生混乱,试想一下,已经开辟一端堆地址原来是属于对象a,由于复制过程发生,b对象取得是a已经开辟堆地址,一旦程序产生析构,

67620

【Example】C++ 标准库常用容器全面概述

序列由哈希函数弱排序,哈希函数将此序列分区到称为存储桶有序序列集中。 在每个存储桶中,比较函数确定任何一对元素是否具有等效排序。 每个元素同时用作排序键值。...基于红黑树 map 根据键大小自动升序排序,基于哈希表则无序。 map 可以根据键映射直接修改元素值。但是,键却是常量无法修改,只能删除已有的键值对再添加新。...哈希函数将此序列分区到称为存储桶有序序列集中。 在每个存储桶中,比较函数将确定任一元素对是否具有等效顺序。 每个元素存储两个对象,包括一个排序键一个值。...first Value1 second Value2 成员函数: 名称 说明 operator= 赋值 swap 交换 辅助: 名称 说明 std::tuple_size...priority_queue对其元素进行排序,以便最大元素始终位于顶部位置。 它支持元素插入以及顶部元素检查删除

3.2K30

读完某C++神作,我只记下了100句话

初始化时是否调用复制构造函数取决于是否有=【拷贝构造函数复制也叫拷贝构造函数是用同一个一个对象初始化另一个对象,普通构造函数是用各种参数初始化一个对象】。...即使定义了其他构造函数,也会合成复制构造函数【能够复制数组】。成员有指针一般需要显示定义复制构造函数。 声明而不定义成员函数是合法,但是使用将导致链接失败。...将复制构造函数声明为private可防止复制。定义了复制构造函数,也必须定义默认构造函数。 重载赋值操作符=,隐含第一个参数this。复制构造函数赋值操作符、显示析构函数【虚空不算】一般同时出现。...合成析构函数并不删除指针成员指向对象。即使编写了自己析构函数,合成析构函数仍然运行。 默认构造函数不全,会调成员默认构造函数复制构造函数不全就不行了。 使用计数是管理智能指针通用技术。...赋值操作符必须防止自身复制赋值之前先释放自身内容,万一是自己, 那不就丢失了】。派生析构函数不负责清除基成员,每个析构函数只负责清除自己成员。

1.4K20

C++(STL):01---pair容器

(p2)Copy构造函数,建立p成为p2拷贝pairp(n)Move构造函数,将rv内容移至p(允许隐式类型转 换) p=p2将p2赋值给p(始自C++11;允许隐式类型转换)P=rv...val2类型和数值 三、构造函数赋值、移动语义 规则: ①定义pair时,不给出值时,使用默认构造函数初始化 ②使用圆括号/花括号初始化器进行初始化 默认构造函数 规则:默认构造函数生成一个pair...这种特殊初始化发生在当我们需要安放(emplace())一个新元素到(unordered)map或multimap中时 拷贝构造函数 拷贝构造函数有3个版本: 版本1:接收相同类型pair 版本2:...如果pair对象复制,调用是这个版本 演示案例: void f(std::pair); void g(std::pair<const int, std::string...必须返回两个value”函数都是用pair对象

93920

【Modern C++】深入理解移动语义

C++中基于值语义拷贝构造赋值拷贝,招致对资源密集型对象不必要拷贝,大量拷贝很可能成为程序性能瓶颈。...,如下代码: data = std::move(data); 在上述代码中,源目标是同一个对象,这可能导致一个严重问题:它最终可能释放它试图移动资源。...与其他四个特殊成员函数不同,编译器生成默认移动构造函数移动赋值运算符需要,满足以下条件: 如果一个定义了自己拷贝构造函数,拷贝赋值运算符或者析构函数(这三者之一,表示程序员要自己处理对象复制或释放问题...,那么我们在代码中通过std::move()调用移动构造或者移动赋值行为将被转换为调用拷贝构造或者赋值运算符 只有一个没有显示定义拷贝构造函数赋值运算符以及析构函数,且每个非静态成员都可以移动时...,编译器才会生成默认移动构造函数或者移动赋值运算符 如果显式声明了移动构造函数或移动赋值运算符,则拷贝构造函数拷贝赋值运算符将被 隐式删除(因此程开发人员必须在需要时实现拷贝构造函数拷贝赋值运算符

78510

STL之关联式容器(pair,tuplemultimap)

her_pair = std::make_pair("test", "that"); pair 对象也可以复制或移动构造成员变量 std::pair...这个类型可以隐式转换为 string,即 pr2 成员变量类型,因此可以成功赋值。如果这些类型不能隐式转换,这条赋值语句就无法通过编译。 1.2比较大小 pair 对象有全套运算符 ==、!...也可以用 tie() 函数来实现对数据成员字典比较。... map 相似,multimap 也不能使用 at() 函数。 multimap 成员函数 fmd() 可以返回一个键参数匹配元素迭代器。...所以,当存在一个或多个相等键时,这些函数返回一个开始迭代器一个结束迭代器,它们指定了参数匹配元素范围,这 equal_range() 返回迭代器是相同

48640

map 学习(下)——C++ 中 hash_map, unordered_map

它可以使实现函数调用符,或是指向函数指针(具体请详细参阅示例构造函数)。...它可以使实现了函数调用运算符,或者指向函数指针(具体请详细参阅示例构造函数)。它默认值是 equal_to ,它返回与等号运算符 operator(a==b) 相同值。...(3) 其他 其他操作函数基本 map 相同: clear 清除 map 中所有元素; erase 删除 map 中指定位置元素; insert 在 map 指定位置添加 pair 类型元素...; // 将 a, b 融合为一个 unordered_map stringmap merge(stringmap a, stringmap b) { // unordered_map 复制构造函数...,故红黑树效率决定了map效率,map只需要提供比较函数(一般为小于函数)即可完成比较; hash_map: hash_map 需要提供 hash 函数以及等于函数; unordered_map

13.2K91

C ++ 中不容忽视 25 个 API 错误设计!

三法则是,如果一个定义了析构函数复制构造函数复制赋值运算符,那么它应该明确定义三个函数所有,而不是依赖它们默认实现。 为什么忽略三法则是一个错误?...从而: 如果你编写/禁用复制构造函数复制赋值运算符,您可能需要对另一个执行相同操作:如果执行“special”工作,则另一个可能也应如此,因为这两个函数应该具有相同效果。...我们可以这样一些事情: 为创建底层资源深层副本提供复制构造函数,例如(int *)就是这种情况。 通过删除复制构造函数复制赋值运算符使不可复制。 最后,在API头文件中提供该信息。...(vals, size)); } return *this; } 解决此问题第二种方法是通过删除复制构造函数复制分配运算符使不可复制。...因此,在我们例子中,如果要使不可复制不可移动,我们将标记移动构造函数movbe赋值操作符为已删除

1.5K20

C++系列笔记(十一)

【导读】《21天学通C++》这本书通过大量精小短悍程序详细而全面的阐述了C++基本概念技术,包括管理输入/输出、循环和数组、面向对象编程、模板、使用标准模板库以及创建C++应用程序等...删除元素 mapmultimap提供了成员函数erase(),该函数删除容器中元素。...键-值对容器std::unordered_map 要使用这个模板,需要包含头文件#include unordered_map平均插入删除时间是固定,查找元素时间也是固定...它是一个泛型,允许在顶部插入删除元素,而不允许访问中间元素。从这种角度看,std::stack行为很像一叠盘子。...C++11 摒弃了std::auto_ptr,您应使用std::unque_ptr,这种指针不能按值传递,而只能按引用传递,因为其复制构造函数复制赋值运算符都是私有的。

1.3K20

STL之关联式容器map(二)

本文续:STL之关联式容器map(一) 3构造元素 emplace() 可以在适当位置直接构造新元素,从而避免复制移动操作。 当容器中现有元素键与这个元素键不同时,才会构造这个元素。...emplace_hint() 返回值不是一个 pair 对象,如果新元素被插入,它返回是指向新元素迭代器;如果没有插入,返回这个键匹配现有元素迭代器。...\n"; 4.获取元素 获取 map 容器开始结束迭代器以及反向迭代器,它们都可以访问容器中所有元素。 map 成员函数 at() 返回是参数键对应对象。...当 catch 代码块中代码执行后,try 代码块中所有变量会被销毁,因此不再可以访问。 元素默认构造函数会用键键所关联对象生成一个新元素,如果键关联对象是基本数据类型,它值为 0。...6删除元素 map 成员函数 erase() 可以移除键参数匹配元素,然后返回所移除元素个数。

54220

C++11:基于std::unordered_map共享锁构建线程安全map

但对于map,除了insert/erase这样写操作之外还有find这样读取操作,如果每个线程都是独占访问,无疑是影响效率。...所以在实现线程安全map时,我没有选择使用std::mutex控制所有的操作为独占访问,而是用RWLock来控制map对象访问,RWLock是我以前自己写一个,将线程对资源访问分为读取操作和写入操作两...{ inline namespace mt{ /* * 基于std::unordered_map实现线程安全map * 禁止复制构造函数 * 禁止复制赋值操作符 * 允许移动构造函数 * 禁止移动赋值操作符..._ */ 说明: 因为RWLock禁止复制构造函数赋值操作符,所以threadsafe_unordered_map也禁止复制构造函数赋值操作符。...另外在中增加几个用于多线程环境函数(见源码中中文注释), 当你需要对map加锁时需要用到raii write_guard()noexceptraii read_guard()const noexcept

8.6K10

《C++Primer》第十三章 拷贝控制

参数返回值 在函数调用过程中,具有非引用类型参数要进行拷贝初始化 当一个函数具有非引用返回类型时,返回值会被用来初始化调用方结果 拷贝构造函数被用来初始化非引用类型参数,这一特性解释了为什么拷贝构造函数自己参数必须是引用类型...这些函数简单拷贝指针成员,这意味着多个HasPtr对象可能指向相同内存。那么析构函数导致多个HasPtr对象被销毁时delete相同指针多次,这是未定义行为。...(比如private),那么合成析构函数被定义为删除 如果类某个成员拷贝构造函数删除或者不可访问;或者某个成员析构函数删除或者不可访问,则合成拷贝构造函数也被定义为删除 如果类某个成员拷贝赋值运算符是删除或者不可访问...,则该类默认构造函数被定义为删除 如果一个由数据成员不能默认构造、拷贝、复制或者销毁,则对应成员函数将被定义为删除。...{ if (size() == capacity()) reallocate(); } // 工具函数,被拷贝构造函数赋值运算符析构函数所使用 std::pair<std::string

1.6K40

C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

std::initializer_list是C++标准库提供一个模板 当我们使用初始化列表初始化对象时,编译器自动从用大括号{}括起来值列表构造一个std::initializer_list对象...这个初始化列表对象隐式地进行类型转换,构造出一个std::vector对象,然后通过拷贝构造函数将这个std::vector对象赋值给变量v。...部分传返回值问题(非局部对象):在函数返回一个临时对象时,如果返回类型是一个对象而不是引用或指针,导致拷贝构造函数被调用,产生额外开销。...成员函数声明尾部加上delete,表示该成员函数被禁掉,编译器删除这样成员函数 class Person { public: Person(const char* name = "", int...::function是一个通用函数包装器,它可以用来存储、复制调用任何可调用对象,包括函数指针、函数对象、Lambda表达式等。

6300

C++基础 智能指针

对于普通 局部变量(非静态局部变量),当离开它作用域时,操作系统自动将其释放。对象在释放时候是自动调用该类析构函数。...于是我们就想:如果是Test *t不是一个普通指针变量,而是一个对象的话,并且在析构函数中实现了释放动态内存步骤,那么只要该指针变量一退出作用域时就会调用析构函数,达到了释放动态内存目的。...*引用计数**实现管理 一旦最后一个这样指针被销毁(计数变为0),该对象会被自动删除 weak_ptr 一般与shared_ptr配合使用,它可以从shared_ptr构造,其构造析构不改变引用计数...对于特定对象,同一时刻只能有一个智能指针可拥有, 最终只有拥有对象智能指针构造函数删除对象,auto_ptrunique_ptr就是采用这种策略 创建智能更高指针,跟踪引用特定对象智能指针个数...选择使用参考 如果程序中要使用多个指向同一个对象指针,那么应该使用shared_ptr 比如说现在有一个包含指针STL容器,现在用某个支持复制赋值操作STL算法去操作该容器指针元素,那么就应该用

60020
领券