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

Modern C++ 最核心变化是什么?

不严格来说,左值对应变量存储位置,而右值对应变量值本身。C++ 中右值可以被赋值给左值或者绑定到引用。类右值是一个临时对象,如果没有被绑定到引用,在表达式结束时就会被废弃。...// 接收左值时复制,接收右值时移动     People(string name)          : name_(move(name)) // 显式移动构造,将传入字符串移入成员变量     ...如果你要在构造函数中接收 std::shared_ptr 并且存入类成员(这是非常常见),那么按值传入更是不二选择。...6.std::unique_ptr放入容器 曾经,由于 vector 增长时会复制对象,像 std::unique_ptr 这样不可复制对象是无法放入容器。...但实际上 vector 并不复制对象,而只是“移动”对象。所以随着移动语义引入,std::unique_ptr 放入 std::vector 成为理所当然事情。

94921

C++:20---类模板(template)

operator()(int*) return 0;} 下面我们将这个类作为unique_ptr删除器来使用 int main(){//一个类型intunique_ptr对象,DebugDelete...作为其删除器unique_ptr p(new int, DebugDelete()); //一个类型stringunique_ptr对象,DebugDelete作为其删除器...在此情况下,类和成员各自有自己、独立模板参数 演示案例 例如下面Blob是一个类模板,模板类型T数据成员vector类型也T。...); //构造函数接受一个迭代器区间,用来初始化dataprivate:std::vector data;}; 现在我们在类外部定义构造函数,由于类模板与成员函数都是模板,因此在外部定义时需要分别同时给出这两个模板模板参数列表...见下面的演示案例,其中: a1:Blob类型int,构造函数类型int* a2:Blob类型int,构造函数类型vector::iterator a3:Blob类型string

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

智能指针在面试中得重要地位!

std::unique_ptr第二个实参型别,本例 delInvmt型别 //先创建一个空 std::unique_ptr,使它指向适当型别对象,然后返回,delInvmt作为构造函数第二个实参...//注意自定义析构器可能是函数对象,函数对象可以包含任意数量数据,这意味着它们尺寸可能是任意大小 //std::shared_ptr如何能够在不使用更多内存前提下,指涉到任意尺寸析构器?...时刻,两者就指涉到相同位置了 但是 std::weak_ptr并不影响所指涉对象引用计数 */ //spw构造完成后,指涉到 Widget引用计数置 1 class Widget{ };...= {10,20}; //利用 std::initializer_list型别得构造函数构造 std::vector auto spv1 = std::make_shared<std::vector<...} //C++98 //本 Widget对象析构数据成员 Widget1::~Widget1(){ delete pImpl; } //C++11 不需要析构函数了 //复制构造函数 Widget1

99220

如何将没有复制或移动构造函数对象放入vector容器

原因是因为std::vector容器插入一定会调用类对象构造函数或者移动构造函数。...不过值类型要用好还是很麻烦,比如这里将没有复制或移动构造函数对象插入到std::vector容器中问题。 经过查阅资料,总共有四种解决方案: 使用默认构造函数,并且初始化时确定容器大小。...例如: int num = 23; std::vector vec(num); 将std::vector容器中元素改成智能指针std::unique_ptr。...使用智能指针方案还是不错,只要你愿意使用智能指针语法。笔者这里使用时第三种,更换容器std::deque。...因此,在插入时std::deque不像std::vector那样需要移动或者拷贝构造,是直接初始化构造在分配空间中

13650

基础知识_Cpp

成员权限控制 2.6. struct和class区别 2.7. Cpp中如何禁止一个类创建对象 2.8. 如何限制类只能在堆或栈上创建对象 2.9. 带默认参数构造函数 2.10....修饰局部变量时,在堆区分配内存;只有首次定义时被初始化,直到程序运行结束才释放;作用域局部作用域。 修饰普通函数,不能修改任何非static对象;该函数作用域当前文件 。...mutable关键字 如果需要在const成员方法中修改一个成员变量值,那么需要将这个成员变量修饰mutable。即用mutable修饰成员变量不受const成员方法限制。...Cpp中如何禁止一个类创建对象 1.将构造函数设置protected或private。 2.在类内声明纯虚函数。...(对象是算作类外,它不是类本身) 构造函数设置私有,那岂不是没法创建对象了。但是对于强大Cpp来说,有方法可以绕过去。

1.9K30

C++ 智能指针(unique_ptr, shared_ptr)源码分析

在博文https://blog.csdn.net/qq_27717921/article/details/82940519已经介绍了unique_ptr和shared_ptr使用,但是这两类智能指针是如何做到管理指针呢...swap(p, rhs.p); swap(deleter, rhs.deleter); } 函数swap操作,主要是交换shared_ptr成员变量,比如p.use_c = 0xff11ff12,...,为什么还有调用swap操作, 为了递减赋值号左侧对象use_c, 这个时候rhs存放就是赋值号左侧信息,在=结束后临时变量会调用析构函数, 从而减少左侧quse_c。...void test() { shared_ptr> t (new vector); /// t相关操作 /// } *(t.use_c)=1, t是局部变量,保存在栈内存上...这里,p是vector* 类型,会调用deleter(p),而vector是栈变量,直接delete掉就可以。除了释放p,还要释放use_c, 并将use_c和p 等于nullptr。

2.5K32

Chapter 4: Smart Pointers

,比如,当从工厂函数返回 std::unique_ptr 被移动到一个容器中,而这个容器后来又被移动到一个对象数据成员中。...std::shared_ptr 来引用该控制块,但是这种做法依赖于当前对象已经有了一个控制块,也就是在调用 shared_from_this ()成员函数外部已经有了一个 std::shared_ptr...,实际上只执行了一次动态内存分配,一次性 Widget 对象和控制块分配单块内存,同时减少了控制块存储信息,也减少内存使用量 std::make_XX 函数缺点 无法智能指针传入自定义析构器 内部使用括号进行完美转发参数...expired 函数实际上是对共享引用计数进行检查是否 0 ,因此即便 0 ,如果弱引用计数不为 0 ,控制块内存不会被释放,进而对象内存也不会被释放,那么就会造成对象早已不使用,但是仍然被 std...Pimpl Idiom 是一种减少编译量规则,让每个数据成员转换成类型指针而不是具体对象,然后在实现文件中对数据成员指针指向对象进行动态内存分配和释放 # widget.h

1.6K20

C++11新特性学习笔记

,只能用构造函数来初始化,难以达到效果: std::vector ivec1(3, 5); std::vector ivec2 = {5, 5, 5}; std::vector...// … virtual void ExtraInterface(){} }; 注意: l 继承构造函数只能初始化基类中成员变量,不能初始化派生类成员变量 l 如果基类构造函数被声明为私有...这些类特殊成员函数负责创建、初始化、销毁,或者拷贝类对象。如果程序员没有显式地一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式这个类生成一个默认特殊成员函数。...而其原因可以理解是引用类型本身自己并不拥有所绑定对象内存,只是该对象一个别名。 左值引用是具名变量别名,而右值引用则是不具名(匿名)变量别名。...8.1 unique_ptr unique_ptr持有对对象独有权,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。

2.2K20

C++知识体系总结:语言核心与代码工程

,引入了三种类型智能指针,即 std::unique_ptrstd::shared_ptr和 std::weak_ptr1)std::unique_ptr std::unique_ptr sp =...std::make_unique(123); std::unique_ptr禁止复制语义,为了达到这个效果, std::unique_ptr拷贝构造函数和赋值运算符(operator=)被标记为delete...a = 1 ) default : 声明构造函数默认构造函数(有了=default,就不用显式定义函数体了) delete : 禁止对象拷贝与赋值 delele函数在c++11中很常用,std::unique_ptr...右值引用与移动构造函数 本节参考: 程序喵大人:左值引用、右值引用、移动语义、完美转发,你知道不知道都在这里 作用:右值引用与std::move结合,减少对象拷贝 附:move函数实现 1.7...面向对象 2.1. 对象创建与内存管理 new和malloc区别: delete与delete[]delete只会调用一次析构函数,而delete[]会调用每一个成员析构函数。

52140

C++11新特性学习笔记

// … virtual void ExtraInterface(){} }; 注意: l 继承构造函数只能初始化基类中成员变量,不能初始化派生类成员变量 l 如果基类构造函数被声明为私有...这些类特殊成员函数负责创建、初始化、销毁,或者拷贝类对象。如果程序员没有显式地一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式这个类生成一个默认特殊成员函数。...而其原因可以理解是引用类型本身自己并不拥有所绑定对象内存,只是该对象一个别名。 左值引用是具名变量别名,而右值引用则是不具名(匿名)变量别名。...8.1 unique_ptr unique_ptr持有对对象独有权,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。...函数对象参数是传递给编译器自动生成函数对象构造函数。函数对象参数只能使用那些到定义lambda为止时lambda所在作用范围内可见局部变量(包括lambda所在类this)。

2K20

lambda表达式高阶用法

using FilterContainer = std::vector>; //元素筛选函数容器 FilterContainer filters;...+14 * 它为对象移入闭包提供了直接支持,初始化捕获,得到: * 1,由 lambda生成得闭包类中得成员变量得名字 * 2,一个表达式,用以初始化该成员变量 */ //情况1:c++14 //使用初始化捕获将...* 含义是: * 在闭包中创建一个成员变量pw,然后使用针对局部变量 pw实施std::move得结果来初始化该成员变量 * * 如果auto pw 没被修改...: //创建一个局部变量 std::vector对象, 向其放入合适得一组值,然后移入闭包 //c++14 //创建一个局部变量 std::vector对象, 向其放入合适得一组值,然后移入闭包 //c..., 移动构造一个对象入 c++11 闭包是不可能实现得,但是移动构造一个对象入 绑定对象是可能实现得 2, 想在 C++11 中模拟移动捕获包括以下步骤:先移动构造一个对象入绑定对象,然后按引用把该移动对象构造所得得对象传递给

1.3K20

C++智能指针

每次创建智能指针时,初始化智能指针并将引用计数置1;当智能指针q赋值给另一个智能指针r时,即r=q,拷贝构造函数拷贝智能指针并增加q指向对象引用计数,递减r原来指向对象引用计数。...它具体做法如下: (1)当创建智能指针类对象时,初始化指针,并将引用计数设置1; (2)当能智能指针类对象作为另一个对象副本时,拷贝构造函数复制副本指向辅助类对象指针,并增加辅助类对象对基础类对象引用计数...//定义智能指针类友元,因为智能指针类需要直接操纵辅助类 //构造函数参数基础对象指针 RefPtr(T *ptr) :p(ptr), count(1) { } //... u_i2(new int(4));//创建时指定动态对象 unique_ptr u(d); //创建空unique_ptr,执行类型T对象,用类型D对象d来替代默认删除器...//方式一: vector> vs { new string{“Doug”}, new string{“Adams”} }; //方式二: vector<unique_ptr

3.4K30

重温C++设计思想

std智能指针(std::unique_ptrstd::shared_ptr),使用智能指针目的之一是减少对象拷贝:对超出作用域对象进行释放。...常见左值有:变量、函数、成员;返回左值表达式(++x,x=1,cout<<''),字符串常量 常见右值有:返回右值得表达式(x++,x+1,make_shared(42)),非字符串字面量...std::move(ptr)是个右值引用。等价于static_cast&&>(ptr)。 2.3 内存对象局部性 C++对象缺省值语义。...对象支持移动需要下列几步: 对象有拷贝构造和移动构造(除非你只需要像unique_ptr只打算支持移动,不支持拷贝) 对象有swap成员函数 对象命名空间里,有一个全局swap函数swap(T&lhs...三、容器 3.1 连续内存vector容器 vector保证强异常安全性,如果元素类型没有提供一个保证不抛异常移动构造函数,vector使用拷贝构造函数。

1.6K247

C++系列笔记(十一)

, [Divisor] (int dividen) {return (dividen % Divisor) == 0;}); 除数是一个状态变量,因此状态变量类似于C++11之前函数对象类中成员。...vector可动态添加标志 vector是对std::vector部分具体化,用于存储布尔数据。这个类可动态地调整长度,因此程序员无需在编译阶段知道要存储布尔标志数。...首次调用非const函数时,COW指针通常该非const函数操作对象创建一个副本,而其他指针实例仍共享源对象。实现const和非const版本运算符*'和->,是实现COW指针功能关键。...破坏性复制   std::auto_ptr是最流行(也可以说是最臭名昭著,取决于您如何看)破坏性复制指针。被传递给函数或复制给另一个指针后,这种智能指针就没有用了。即源指针也被销毁了。...要使用std:unique_ptr,必须包含头文件。

1.3K20

C++关键知识点梳理

,未初始化变量含有一个不确定值,所以在定义变量时最好初始化,类成员使用初始化列表在构造函数中初始化均是良好编程习惯;变量定义和声明:变量可以在多个文件中声明(external int i),但是只能在一个文件中被定义...print(const std::vector& data);非常量指针不能指向常量对象const double pi = 3.14double *ptr = π //❌,非常量指针不能指向常量对象顶层指针...,例如,get操作成员函数最好定义常量成员函数;常量对象、常量对象引用或指针都只能调用常量成员函数。...顺序容器vectordequelistforward_listarraystring容器拷贝——对象间数据分离vector v1;{ vector v2 =...unique_ptr:不支持拷贝和赋值,任何时刻只能有一个unique_ptr指向特定对象;weak_ptr:解决shared_ptr对象相互引用导致对象无法释放,衍生出weak_ptr,只使用内置指针

91530

《C++Primer》第十二章 动态内存

静态内存、栈内存和堆 我们前面只提到了静态内存或栈内存: 静态内存:用来保存局部static、类static数据成员和定义在任何函数之外变量 栈内存:保存定义在函数内非static对象 分配在静态内存或者栈内存对象由编译器自动创建和销毁...> p5 = make_shared(); 类似于顺序容器emplace成员,make_shared用其参数来构造给定类型对象。...check(size_type i, const std::string &msg) const; } // 构造函数:两个都使用初始化列表来初始化data成员, 令它指向一个动态分配vector...release成员返回unique_ptr当前保存指针并将其置空,因此p2被初始化为p1原来保存指针而p1被置空。...重载一个unique_ptr删除器会影响到unique_ptr类型一级如何构造(或reset)该类型对象

1.3K10

Efficient&Elegant:Java程序员入门Cpp

具体类型 具体类型成员变量就是表现形式概念 成员变量可以是一个或几个指向保存在别处数据指针(例如上面的Vector2 elem成员定义是double *elem),这种成员变量也会存在于具体类每一个对象中...通过使用类成员变量,它允许我们: 把具体类型对象至于栈、静态分配内存或者其他对象中。...直接引用对象(而非仅仅通过指针或引用) 创建对象后立即进行完整初始化 拷贝对象成员变量可以被限定为private,只能通过public成员函数访问。...拷贝和移动 当我们设计一个类时,必须仔细考虑对象是否会被拷贝以及如何拷贝问题。 逐成员复制,意思就是遍历类成员按顺序复制方法。这种方法在简单具体类型中会更符合拷贝操作本来语义。...抑制操作 对于层次类来讲,使用默认拷贝和移动构造函数都意味着风险:因为只给出一个基类指针,我们无法了解派生类有什么样成员,当然也不知道该如何操作他们。

1.9K71
领券