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

【笔记】《C++Primer》—— 第19章:特殊工具与技术

typeid可以返回表达式类型,dynamic_cast将基指针或引用强制转为派生指针或引用 dynamic_cast有模板参数,是目标要转换类型,通常情况下应该有虚函数,是指针,引用或右引用...当要转到指针时,目标必须是指针;要转到引用则必须是,要转到右引用则必须不是 目标是指针类型转换失败是会返回0,当目标是引用失败时抛出bad_cast异常,这个异常在typeinfo头文件里...枚举类型很常见了,国内C++或者C教材一般比较前面就会讲到这个东西,这本书将其安排到了后面。...,但是使用枚举成员赋值给其他元素时,成员会自动转换为整型 限定作用域枚举成员默认类型是int,不限定作用域枚举成员则没有默认类型,我们只能知道类型足够容纳初始。...C11让我们可以给枚举类型附加类型声明 enum TypeName: memberType {mem1, mem2, mem3}; 指定枚举类型类型 一旦某个枚举成员大于类型,则会引发错误 C11

81340

《Effective Modren C++》 进阶学习(上)

类型推导如下进行: 如果expr是,T和ParamType都会被推导为引用。 第一,这是模板类型推导中唯一一种T和ParamType都被推导为引用情况。...第二,虽然ParamType被声明为右引用类型,但是最后推导结果它是引用。 如果expr是右,就使用场景一推导规则。...); //以传方式处理param 此时param会拷贝形参,因此param修改不会影响到原参数。...对于通用引用推导,实参会被特殊对待 对于传类型推导,实参如果具有常量性和易变性会被忽略 模板类型推导时,数组或者函数实参会退化为指针,除非它们被用于初始化引用 2....② 限域枚举枚举名是强类型,未限域枚举枚举名会隐式转换为整型(现在,也可以转换为浮点类型) 11.

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

【笔记】《深入理解C++11》(上)

引用 "右"没有严谨定义, 通常来说, 出现在等号右边内容就是右, 可以取地址, 有名字就是 不跟对象关联字面值等称为纯右, 其他右称为将亡引用是为了优化临时对象进行深拷贝效率...但注意右引用不能被绑定到引用能够延长右声明周期, 常量引用属于万能引用, 也能够延迟生命周期, 但是常量引用不能修改所以一般用来减少临时对象开销而已 当没有定义移动构造时..., 如果定义了常量引用构造也能正确执行, 只不过会变为拷贝形式 常量右引用存在但是没有实际用途 std::move()能强制使一个变为右, 但是不会改变其生命周期 右引用本身是个,..., 因此应该用noexcept修饰移动构造函数 move也有std::move_if_noexcept版本, 在当前函数没有noexcept时主动转换为应用从而调用拷贝构造版本....如果目标是被重载函数则编译错误 否则, 对于带括号表达式, 如果目标是将亡, 那么返回右引用 对于带括号表达式, 如果目标是, 返回引用 否则返回目标本身类型 推导四规则中最麻烦是规则

1.8K20

左右引用和移动语义

将亡产生与右引用产生而引起,对于将亡我们常用到有: 返回类型是右引用函数调用或重载运算符表达式(如std::move(x)) 转换为引用转换函数调用表达式(如static(a)) 1.4 左右引用 引用就是引用。...引用,不可以修改它引用就是引用,通过T&&来表示。...右引用只能绑定到右上。 2. 移动语义 未出现右引用之前,我们函数调用传参时候,某些时候可以使用按引用传递参数,减少参数多拷贝资源消耗,提高程序运行效率。...当我们处理包含大量数据对象时,移动语义显尤为重要。 2.1 std::move 如何将一个换为一个右呢?

84640

C++11新特性学习笔记

C++ 11引入了一种新枚举类型,即“枚举”,又称“强类型枚举”。...++枚举类型有一些缺点:它会在一个代码区间中抛出枚举类型成员(如果在相同代码域中两个枚举类型具有相同名字枚举成员,这会导致命名冲突),它们会被隐式转换为整型,并且不可以指定枚举底层数据类型。...7.1.2 引用、右引用 引用一个进行引用类型,右引用则是一个右进行引用类型引用和右引用都是属于引用类型。...,编程通过, ok “const 类型 &”为 “万能”引用类型,它可以接受非常量、常量、右进行初始化; 右引用,使用&&表示: int && r1 = 22; int x = 5;...标准库提供了函数 std::move,这个函数以非常简单方式将引用换为引用

2.2K20

C++11新特性学习笔记

C++ 11引入了一种新枚举类型,即“枚举”,又称“强类型枚举”。...++枚举类型有一些缺点:它会在一个代码区间中抛出枚举类型成员(如果在相同代码域中两个枚举类型具有相同名字枚举成员,这会导致命名冲突),它们会被隐式转换为整型,并且不可以指定枚举底层数据类型。...7.1.2 引用、右引用 引用一个进行引用类型,右引用则是一个右进行引用类型引用和右引用都是属于引用类型。...,编程通过, ok “const 类型 &”为 “万能”引用类型,它可以接受非常量、常量、右进行初始化; 右引用,使用&&表示: int && r1 = 22; int x = 5;...标准库提供了函数 std::move,这个函数以非常简单方式将引用换为引用

2K20

《逆袭进大厂》第三弹之C++提高篇79问79答

3、 基本数据类型 基本数据类型转换以取值范围作为转换基础(保证精度不丢失)。隐式转换发生在从小->大转换中。比如从char转换为int。从int->long。...3) 引用就是一个进行引用类型。右引用就是一个右进行引用类型,事实上,由于右通常不具有名字,我们也只能通过引用方式找到它存在。 右引用引用都是属于引用类型。...引用是具名变量值别名,而右引用则是不具名(匿名)变量别名。 引用通常也不能绑定到右,但常量引用是个“万能”引用类型。它可以接受非常量、常量、右进行初始化。...不过常量引用“余生”中只能是只读。相对地,非常量只能接受非常量进行初始化。...4) 右引用通常不能绑定到任何,要想绑定一个到右引用,通常需要std::move()将强制转换为

2.2K30

C++缺陷与思考(上)

完全保留了C中指针用法,而额外扩展类型则不允许出现在栈中,也就是说,所有对象都强制放在堆中,栈上只保留指针对引用。...(七)赋值语句返回 C/C++赋值语句自带返回,这一定算得上一大缺陷,C中赋值语句返回C++中赋值语句返回引用。...: int { Spring, Summer, Autumn, Winter}; 但如果你是调别人写时候,人家枚举没有指定基础类型的话,那你也没辙了,就是不能前置声明。...,我们希望是保持左右性 但如果不这样做,当我向f2传递右时,右性无法传递下去,也就是t2是int &&类型,但是传递给f1时候,t1变成了int &类型,这时t1是t2引用(就是引用绑定右引用场景...思路就是,根据传入参数来判断,如果是引用就直接传出,如果是右引用就std::move变成右再传出,保证左右性。

1.4K50

【笔记】《C++Primer》—— 第四部分:高级主题(完)

,以免被范围更大catch捕获异常忽略掉 catch只允许最基础转换,包括常量改变,派生向基,数组指针,函数指针四种,其他类型转换都不支持 空throw可以将异常重新抛出,这个throw只能出现在...有模板参数,是目标要转换类型,通常情况下应该有虚函数,是指针,引用或右引用,运算符参数是需要被转换目标 C原本只有一种枚举类型:不限定作用域枚举。...,避免了名称冲突问题 限定作用域枚举成员默认类型是int,不限定作用域枚举成员则没有默认类型,我们只能知道类型足够容纳初始。...直观理解就是当我们用解引用符*对成员指针解引用时,我们得到是对应成员类型,我们还需要对应某个具体对象用点或箭头获取对象中这个成员类型真正 我们调用成员函数方法和使用成员差不多,区别是标志着函数名括号仍然不可少...public union只允许一个成员有特性让存储空间仅仅是可以容纳最大成员大小,union常常用来表示一组互斥 union一个进行赋值会让其他成员变为未定义状态,因此一般来说我们通过在外层再包装一个管理

85110

C++知识总结

*p++和(*p)++区别      *p++是先取值,然后将指针地址执行++操作      (*p)++是先取值,然后(*p)这个进行++操作 2.枚举变量enum如何计算 enum{a...,b=5,c,d=4,e}; cout<<a<<b<<c<<d<<e  结果为0 5 6 4 5 因为枚举变量默认为前一个变量加1,而第一个枚举没有被赋值,所以默认为0 3.static应用...这时,被调函数形参就成为原来主调函数中实参变量或对象一个别名来使用,所以在被调函数中形参变量操作就是相应目标对象(主调函数中)操作。...C++规定,当一个成员函数被声明为虚函数后,派生同名函数都自动成为虚函数。...如果在派生中没有虚函数重新定义,则派生简单地继承直接基虚函数。 定义一个指向基对象指针变量,并使它指向同一族中需要调用该函数对象。

97440

后台开发:核心技术与应用实践 -- C++

对象一一象实际占用空间大小 函数一一函数返回类型所占空间大小,且函数返回类型不能是 void C++编译系统 32 位机器上为整型变量分配4Byte,为单精度浮点型变量分配 4Byte ,为字符型变量分配...二叉查找树,也称有序二叉树 (ordered binary tree),或已排序二叉树 (sorted binary tree),是指一棵空树或者具有下列性质二叉树: 若任意节点子树不空,则子树上所有结点均小于它根结点...若任意节点右子树不空,则右子树上所有结点均大于它根结点 任意节点、右子树也分别为二叉查找树 没有键值相等节点 红黑树虽然本质上是一棵二叉查找树,但它在二叉查找树基础上增加了着色和相关性质使得红黑树相对平衡...树旋转分为左旋和右旋,一下给出示例 左旋: (只影响旋转结点和右子树结构,把右子树结点往左子树挪了) ? 右旋:(只影响旋转结点和子树结构,把子树结点往右子树挪了) ?...红黑树参考文献 set 作为一个关联式容器,是用来存储同一数据类型数据类型 set 中每个元素都唯一,而且系统能根据元素自动进行排序。应该注意是 set 中元素不能直接被改变。

1.3K10

C++】从入门到精通第一弹——基础知识

但宏缺点就是宏不能按传递,所以如果当我们使用c宏执行了类似函数功能时,要考虑将其转换为c++内联函数。...指针,引用都可以实现函数实参交换,但是传递方式不可以交换 int &a = 10; //错误写法 int &a = 10+x; //错误写法 应尽可能使用const 理由: 使用const可以避免无意中修改数据编程错误...该参数f对应实参为无名枚举类型枚举常量(又称格式化常量),可以同时使用一个或多个常量,每两个常量之间要用按位或操作符连接。...语言特点 C++语言数据类型包括整型、实型、字符型、枚举类型等基本类型,数组、结构体、共用体等构造类型,指针类型,以及用户自定义数据类型。...能够实现复杂数据结构,还可以定实现面向对象编程,和指针结合可以实现高效程序。 C++语言中,运算符十分丰富,共有30多个,如算术、关系、逻辑、位、赋值、指针、条件、逗号、下标、类型转换等。

19350

细说枚举

这里虽然使用了继承语法但是并没有建立继承关系,所有的枚举都是 System.Enum ,这些都是密封,无法从现有的枚举类型派生出新成员。...对于枚举类型变量,不限于声明中命名,因此能转换成基础类型,那么就能转换为枚举类型。之所以这么设计是因在以后 API 中有很大可能在不破换老版本同时为枚举添加新。...Tip:开发中我们应该尽量使用 int 作为枚举基础类型,除非因性能问题或互操作方面的考虑时才会考虑使用较小类型。...字符串转换为枚举也很简单,同样用到了 Enum 基一个静态方法 Parse ,例如我们将 JP 转换为枚举 Country 枚举可以这么做 (Country)Enum.Parse(typeof(...这里有一点需要注意,TryParse 方法是 .net 4.0 才出现,因此如果要在 .net 4.0 以下版本中将字符串转换为枚举时,需要进行恰当错误处理防止字符串不存在与枚举类型枚举中。

1.9K10

C++四种强制转换

当我们试图根据某个成员变量偏移位计算该对象内存空间位置时,就会需要将指针转换为整型进行计算。当计算出该变量位置后(整型),就需要将其转换为指针类型。 整型和枚举类型相互转换。...引入C++四种转换之前,我们先看下最常见一种转换——C语言方式转换。...由上我们可以总结出:reinterpret_cast转换是C转换基础上,在编译期间 约束了整型、浮点型和枚举类型相互转换。        ...它可以将void*型向任意指针类型转换。还可以整型、浮点型和枚举型将相互转换。 */         看了这个说明,似乎static_cast可以实现C转换所有场景了。...static_cast弥补了reinterpret_case整型、浮点和枚举类型相互转换功能。除了这些转换外,它要求操作参数是指针。

2.2K30

总结c++ primer中notes

有些语言中将负数赋给 unsigned 类型是非法,但在 C++ 中这是合法C++ 中,把负值赋给 unsigned 对象是完全合法结果是该负数类型取值个数求模后。...也就是说,赋值时是取该类型取值数目求模后。然而我们不能保证编译器都会这样处理 signed 类型。 如果您要处理只是非负整数,那么应该优先使用unsigned 打头那些整数类型。...C++ 程序员经常随意地使用术语对象。一般而言,对象就是内存中具有类型区域。说得更具体一些,计算表达式就会产生对象。 严格地说,有些人只把术语对象用于描述变量或类型。...简化复杂类型定义,使其更易理解。 允许一种类型用于多个目的,同时使得每次使用该类型目的明确。 枚举成员是常量 可以为一个或多个枚举成员提供初始,用来初始化枚举成员必须是一个常量表达式。...枚举类型对象初始化或赋值,只能通过枚举成员或同一枚举类型其他对象来进行。

1.6K90

C++ 不同构造与三种引用

主要是变量、常变量(const变量),而右包括:常量、匿名对象、函数返回 引用、const引用、右引用 引用类型变量核心是可以修改自己对应内存空间到别的变量(修改this)而不是简单拷贝备份...引用类型定义右边加上&符合引用变量,如 int a = 1; int & b = a; b = 5;//a == 5 为true 引用变量会直接引用赋值变量,代表相同对象,但是不能引用...事实上与const引用引用区别就是,可以对临时变量进行修改,这里推荐qicosmos(江南)这篇博客,写非常nice——从4行代码看右引用 万能引用 虽然有了右引用可以引用并修改右...然后比较大区别的是,c++默认不写访问权限是private,java是default。还有就是,C++没有访问权限修饰符,把访问权限放到了子类继承方式上。...cpyY 拷贝构造函数定义如下,类似构造函数,而形参是一个同类对象const引用没有重写时,默认会有一个自动生成拷贝构造函数,所有对象成员进行浅拷贝。

2.2K10

C++补充知识&C++11及其特性

和右概念 按字面意思,通俗说,以赋值运算符=为界,左边就是,右边就是右(lvalue)——代表一个在内存中占有确定位置对象(就是有一个地址)。...右(rvalue)——通过排他性来定义,每个表达式不是就是右,rvalue是不在内存中占有确定位置表达式,而是存在寄存器中。 所有的(无论是数组,函数或不完全类型)都可以转化成右。...函数返回值当引用 C++使用引用难点 当函数返回引用时 若返回栈变量,不能称为其他引用初始,不能作为使用。...(变量和对应地址对不上了,该变量指向那个地址所存内容被覆盖了)-个人理解) 若返回静态变量或全局变量 可以成为其他引用初始。 即可作为右使用,也可以作为使用。...建议: C语言中 能隐式类型转换c++中可用 static_cast()进行类型转换。

37410

不知道这些,别说你会C++

可以被绑定到引用可以被绑定到引用(Lvalue Reference),从而允许进行修改。...临时性:右通常是临时、一次性,它们语句执行完毕后即被销毁。 可以被绑定到右引用:右可以被绑定到右引用(Rvalue Reference),从而允许进行引用和操作。...unsetunset引用unsetunset C++ 中,引用(Lvalue Reference)是一种引用类型,用于引用对象,并且只能绑定到(Lvalue)。...引用绑定到,而右引用绑定到右引用C++ 中广泛用于传递参数和返回引用类型函数,是 C++ 中重要语言特性之一。...通用引用能够接受任意类型参数,并根据参数类别来推导类型,从而实现完美转发。

10310

现代C++之万能引用、完美转发、引用折叠(万字长文)

移动语义和完美转发都建立基础之上。(如果你不熟悉右引用基础, 移动语义, 或是完美转发, 再继续阅读本文之前你可能需要先看看 Thomas Becker’s overview )。...C++ 里,所有的原生类型枚举、结构、联合、都代表类型,只有引用(&)和指针(*)才是引用类型 Java 里,数字等原生类型类型则属于引用类型。...Python 里,一切类型都是引用类型。 一个表达式lvalueness (性)或者 rvalueness (右性)和它类型无关。 来看下 int。...std::move功能是: 传递,推导为引用,仍旧static_cast转换为引用。 传递是右,推导为右引用,仍旧static_cast转换为引用。...: 如果一个本身是 万能引用如果绑定在了一个 右边 上面,就把它重新转换为

6K21

【译】理解C和C++和右

比如,解引用运算符“*”将使用一个右作为操作数,但结果是一个。...因为这个引用是const修饰,不能通过引用被修改,所以修改右是可以。这样性质,使得C++中将一个常量引用作为参数传入函数十分常见,这也避免了临时对象不必要复制和构造。...CV限定 如果我们仔细阅读,C++ standard discussing lvalue-to-rvalue conversions【2】中写道: 一个非函数、非数组类型T可以被转换为,...C++中,可以有cv限定符,但内置类型(int、double等)不可以。...但C++11这个区别来了个大反转,它允许一些特殊场合下引用,故可以修改它们。

1.1K10
领券