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

Google C++ 编程风格指南(五):其他 C++ 特性

右值引用能实现可移动但不可拷贝的类型, 这一特性对那些在拷贝方面没有实际需求, 但有时又需要将它们作为函数参数传递或塞入容器的类型很有用....你可能会使用 std::move 来表示将值从一个对象移动而不是复制到另一个对象. 5.3....值得庆幸的是, C++ 中, 宏不像在 C 中那么必不可少. 以往用宏展开性能关键的代码, 现在可以用内联函数替代. 用宏表示常量可被 const 变量代替. 用宏 “缩写” 长变量名可被引用代替....定义: C++11 中,若变量被声明成 auto, 那它的类型就会被自动匹配成初始化表达式的类型。您可以用 auto 来复制初始化或绑定引用。...别用在文件作用域变量,命名空间作用域变量和类数据成员里。永远别列表初始化 auto 变量。

1.2K30

c++11新特性,所有知识点都在这了!

这里的详细介绍请看:左值引用、右值引用、移动语义、完美转发,你知道的不知道的都在这里 列表初始化 在C++11中可以直接在变量名后面加上初始化列表来进行对象的初始化,详细介绍一定要看这篇文章:学会C++...char *const ptr; // 指针本身是常量 const char* ptr; // 指针指向的变量为常量 在函数参数中使用const,一般会传递类对象时会传递一个const的引用或者指针,这样可以避免对象的拷贝...class A{}; void func(const A& a); const修饰类的成员变量,表示是成员常量,不能被修改,可以在初始化列表中被赋值。...class A { const int value = 5; }; class B { const int value; B(int v) : value(v){} }; 修饰类成员函数,表示在该函数内不可以修改该类的成员变量...非受限联合体 c++11之前union中数据成员的类型不允许有非POD类型,而这个限制在c++11被取消,允许数据成员类型有非POD类型,看代码: struct A { int a; int

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

    【C++】C++11风云再起:语法新纪元,性能新巅峰!

    支持修改 2.可变模板参数 可变参数模板是C++11引入的一种强大的模板功能,允许模板**接受可变数量的模板参数,它为开发泛型代码提供了很大的灵活性,特别是在处理不同数量和类型的参数时。...是一个模板参数包,表示零个或者多个模板参数,其原理与模板类似,本质还是去实例化对应类型和不同参数个数的多个函数。 args... 是一个函数参数包,表示零个或者多个模板参数,可以用sizeof......2.解析生成的移动构造(移动赋值)函数 对于内置类型成员进行浅拷贝。...对于自定义类型的成员,需要看这个成员有没有实现移动构造函数(移动赋值函数), 如果有则调用该成员的移动构造函数(移动赋值函数)。 如果没有就调用拷贝构造函数(赋值重载重载)。...工作原理: 编译器生成类 每个 Lambda表达式 都对应一个编译器自动生成的类,其类名按照一定编译规则生成,保证不同的 lambda表达式 生成的类名不同 捕获的外部变量会成为这个类的成员变量

    5810

    Google C++ 编程风格指南(三):类

    结论: 简单的初始化用类成员初始化完成, 尤其是当一个成员变量要在多个构造函数里用相同的方式初始化的时候....可移动类型允许对象在初始化时得到来自相同类型的临时对象的值, 或在赋值时被赋予相同类型的临时对象的值 (因此所有可拷贝对象也是可移动的). std::unique_ptr 就是一个可移动但不可复制的对象的例子...如果类型不可拷贝, 但是移动操作的正确性对用户显然可见, 那么把这个类型设置为只可移动并定义移动的两个操作. 建议通过 = default 定义拷贝和移动操作. 定义非默认的移动操作目前需要异常....结论: 只在能够减少冗余代码, 提高可读性的前提下使用委派和继承构造函数. 如果派生类有新的成员变量, 那么使用继承构造函数时要小心....声明顺序 在类中使用特定的声明顺序: public: 在 private: 之前, 成员函数在数据成员 (变量) 前; 类的访问控制区段的声明顺序依次为: public:, protected:, private

    83040

    C++查缺补漏

    :增加灵活性,使程序员可以在封装和快速性方面做合理选择 访问对象中的成员必须通过对象名 友元类 若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员 声明语法:将友元类名在另一个类中使用friend...,但常对象不可调用非常成员函数 多文件结构 外部变量 如果一个变量除了在定义它的源文件中可以使用外,还能被其它文件使用,那么就称这个变量是外部变量 文件作用域中定义的变量,默认情况下都是外部变量,但在其它文件中如果需要使用这一变量...在某些情况下,我们没有必要复制对象——只需要移动它们 有可被利用的临时对象时,触发移动构造 //函数返回含有指针成员的对象 //将要返回的局部对象转移到主调函数,省去了构造和删除临时对象的过程 #include...基类的public和protected成员:访问属性在派生类中保持不变 基类的private成员:不可直接访问 访问权限 派生类中的成员函数:可以直接访问基类中的public和protected成员,...使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型) 类模板 template 模板参数表> class

    2.6K10

    C++20新特性个人总结

    requires,concept结合requires之后,对模板类型参数的约束可以细致到类型成员变量、类型成员函数甚至其返回值等等。 ...  比较拗口,放松了非类型模板参数的限制,可以用类类型作为模板的参数,但是条件是所需要的运算需要在编译期完成。 ...  在以下的复制操作中,将会隐式采用移动操作代替复制操作的情况:  ①如果return或co_return中的表达式是一个id-expression,其是在函数的最内层语句块或lambda表达式的主体或者参数声明子句中声明的隐式可移动实体...指向成员的指针类型,且引用相同的类成员,或者都是空成员指针值;  ⑦引用类型,且引用相同的对象或函数;  ⑧数组类型,对应元素满足模板参数等效;  ⑨共用体类型,或者都没有活动成员,或者都具有相同的活动成员...,且活动成员都是满足模板参数等效;  ⑩类类型,且对应的直接子对象和引用成员满足模板参数等效。

    1.9K50

    【笔记】《C++Primer》—— 第三部分:类设计者的工具

    ,派生类一般在构造函数开始的地方调用基类的构造函数,让基类来初始化自己的成员 静态类型是变量本身代码中的类型,在编译时决定,动态类型是变量在内存中的对象的类型,在运行时才能决定。...基类中此成员的访问说明符,这是最重要的一部分 派生类的派生列表的访问说明符,这一项决定的是派生类对继承来的成员对外表现出的最高权限 有时候我们需要改变外部对派生类继承的某个名字的访问级别,可以在自己的访问控制符处用...,对于实现的内容我们一样可以使用=default简化 如果基类中的基本操作函数不可访问或被删除,则派生类中的对应成员是被删除的因为我们无法使用基类来操作那些成员 C11中,我们可以用using重用基类定义的构造函数...类模板不会推断参数的类型 类模板的成员函数只有在使用时才会实例化 类模板与另一个模板直接最常见的友元是一对一的友元,首先模板需要声明所有需要用到的名字,然后在声明友元时标注出目标类的具体模板实参 类模板也可以一对多友元...,我们可以用尾置返回来完成这个目标: 标准库头文件type_traits中的类来进行特殊的类型转换能够动态地将这些语言特性消去从传入的参数中提取出我们想要的类型 编译器是从模板函数的调用中推断具体的实参类型的要求在

    1.7K10

    吃透这些内容,c++ 不再难学

    《C++ Primer》 里专门有一章,叫 Copy Control,介绍如何定义、使用:复制构造、复制赋值、移动构造、移动赋值等。...nullptr; } return *this; } c++ 里的继承存在继承权限的设置(派生描述符),比如 如果是 private 继承,则尽管在父类里是 public 成员,那么在外面也不能直接访问子类对象的此成员...,实例化的子类对象里包含了 子类成员部分+父类成员部分。...面向模板编程 c++ 的泛型与 java 的泛型有所不同,实现上: java 泛型原理是编译时类型擦除,比如把 T 编译为 Object,然后运行时动态转换类型 c++ 模板原理时编译时特例化,根据模板类...可以使用 extern 关键字声明:不要在这个文件生成特例化代码: extern template declaration; // 模板实例化声明 有时候,我们在使用模板的类型 T 时,想要返回特定的与

    1.4K30

    C语言与C++面试知识总结

    作用 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。...内联函数相比宏函数来说,在代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。...虚函数不占用存储空间 虚函数表存储的是虚函数地址 模板类、成员模板、虚函数 模板类中可以使用虚函数 一个类(无论是普通类还是类模板)的成员模板(本身是模板的成员函数)不能是虚函数 抽象类、接口类、聚合类...dynamic_cast) 通常用于转换数值数据类型(如 float -> int) 可以在整个类层次结构中移动指针,子类转化为父类安全(向上转换),父类转化为子类不安全(因为子类可能有不在父类的字段或方法...) dynamic_cast 用于多态类型的转换 执行行运行时类型检查 只适用于指针或引用 对不明确的指针的转换将失败(返回 nullptr),但不引发异常 可以在整个类层次结构中移动指针,包括向上转换

    5K41

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

    126、C++中类成员的访问权限和继承权限问题 1) 三种访问权限 ① public:用该关键字修饰的成员表示公有成员,该成员不仅可以在类内可以被 访问,在类外也是可以被访问的,是类对外提供的可访问接口...; ② private:用该关键字修饰的成员表示私有成员,该成员仅在类内可以被访问,在类体外是隐藏状态; ③ protected:用该关键字修饰的成员表示保护成员,保护成员在类体外同样是隐藏状态...catch(…)//捕获所有类型的异常 { }~ 139、模板和实现可不可以不写在一个文件里面?...通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy 143、程序在执行int main(int argc, char *argv[])时的内存结构,你了解吗?...这就是移动构造函数设计的初衷; 2) 拷贝构造函数中,对于指针,我们一定要采用深层复制,而移动构造函数中,对于指针,我们采用浅层复制; 3) C++引入了移动构造函数,专门处理这种,用a初始化b后,

    2.2K30

    什么?CC++面试过不了?因为你还没看过这个!

    作用 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。...内联函数相比宏函数来说,在代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。...虚函数不占用存储空间 虚函数表存储的是虚函数地址 模板类、成员模板、虚函数 模板类中可以使用虚函数 一个类(无论是普通类还是类模板)的成员模板(本身是模板的成员函数)不能是虚函数 抽象类、接口类、聚合类...dynamic_cast) 通常用于转换数值数据类型(如 float -> int) 可以在整个类层次结构中移动指针,子类转化为父类安全(向上转换),父类转化为子类不安全(因为子类可能有不在父类的字段或方法...) dynamic_cast 用于多态类型的转换 执行行运行时类型检查 只适用于指针或引用 对不明确的指针的转换将失败(返回 nullptr),但不引发异常 可以在整个类层次结构中移动指针,包括向上转换

    3.7K50

    每个C++开发者都应该学习和使用的C++11特性

    总的来说,nullptr 是 C++11 引入的一个有益的改进,它能够提高代码的可读性和安全性,并且在模板编程和重载函数等场景下尤为有用。因此,建议在新的代码中使用 nullptr 来表示空指针。...}; 在派生类中使用 override 关键字,如果没有正确地重写基类中的虚函数,编译器会产生错误。...,用于指定在lambda表达式中使用的外部变量的方式。...移动语义的背景: 在传统的C++中,对象的赋值和传递通常会进行复制操作,即调用拷贝构造函数或拷贝赋值运算符。...std::vector vec; vec.push_back("example"); // 移动临时对象 在函数返回值中使用: 当函数返回一个临时对象时,可以通过移动语义避免不必要的复制

    7810

    【C++高阶】:C++11的深度解析上

    initializer_list 是一个轻量级的模板类,它用于表示一个给定类型的值的数组,但大小是固定的,且生命周期与包含它的对象相同。...变量类型推导 2.1 auto关键字 在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。...新的类功能 4.1 新增默认成员函数 C++11在原来的基础上新增了两个默认成员函数:移动构造函数和移动赋值运算符重载 关于这两个函数需要注意: 如果你没有自己实现移动构造函数,且没有实现析构函数...默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造,如果实现了就调用移动构造,没有实现就调用拷贝构造。...默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。

    7110

    C++为什么有参数依赖查找(ADL)?

    什么是 struct hack 同一作用域内的名称冲突:在C++中,如果在同一作用域内,一个名称被用作不同类型的声明,比如一部分声明是类型(如类、结构体、联合体或枚举),而另一部分声明是非类型(如变量、...类定义:在类定义中的任何位置使用名称时,会搜索类定义本身、其基类、嵌套类的定义等 类体内查找:如果在类定义中使用了一个名称,首先会在该类的定义范围内查找,直到使用该名称的位置。...在查找时,还存在一些特殊的规则,以下仅举两例:比如在查找域运算符::左边的名字时,会忽略函数、变量、枚举等,只有类型名称会被查找在类内部声明的友元函数,其名称查找规则与成员函数相同。...这种名称可以指向: 类成员(包括静态和非静态函数、类型、模板等) 命名空间成员(包括另一个命名空间) 通常在命名空间的作用域查找。...查找合并:将普通未限定查找找到的声明集合与ADL找到的声明集合合并,并应用特殊规则,例如,通过ADL可见的关联类中的友元函数和函数模板,即使它们在普通查找中不可见。

    12110

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

    对于自定类型, 则应该在构造函数完善地初始化 对于类的成员, 尽可能不要在构造函数内再初始化自己的元素, 因为在进入构造函数之前自定类型就会被调用默认初始化了, 构造函数内进行的实际上是拷贝构造, 但又要注意内置类型并不会调用默认初始化...这个方法顺便解决了证同问题 证同+备份: 如果对效率要求很高的话可以在备份指针的方法最前面再引入证同测试, 但是要衡量引入额外的if语句是否值得 复制构造并交换: 用赋值构造的方法构造一个当前类型的副本...如果有一些成员变量没有在初值列中进行拷贝, 那么此时对象将会进入局部拷贝状态 如果只拷贝了成员变量而没有调用基类的拷贝函数, 那么此时基类部分将会被默认初始化, 也属于一种局部拷贝 很多时候基类的拷贝函数与派生类的拷贝函数会有很多代码的重叠部分...相当于以前的auto_ptr, 只能移动而不可复制(复制操作默认是移动语义的), 没有其它成员变量, 可以用make_unique来初始化数组 shared_ptr: 有引用计数的指针, 因此可以复制...不允许是模板类是因为std的设计协议就是不要为std添加任何额外的模板, 函数, 类等等, 我们只允许添加新的模板特化版本 最后在我们需要调用swap的时候, 先using std::swap;暴露出std

    1.1K30

    《Kotlin极简教程》第三章 Kotlin基本数据类型数字基本类型

    逻辑非 数组 数组在 Kotlin 中使用 Array类来表示,它定义了 : get和 set函数(按照运算符重载约定这会转变为 []) size属性 以及一些其他有用的成员函数: class...它们也都有相应的工厂方法: val x: IntArray = intArrayOf(1, 2, 3)x[0] = x[1] + x[2] 字符串 字符串用 String类型表示。字符串是不可变的。...基本类型 在Kotlin中,所有东西都是对象,所以我们可以调用成员函数和属性的任何变量对象。有些类型是内置的,他们的实现被优化过, 但是用户看起来他们就像普通的类....因此较小的类型不能隐式转换为较大的类型。 因此我们不能声明一个 Byte 类型给一个 Int 变量,在不进行显示转换的情况下。...内置对Booelan的操作 || – 短路或 && – 短路与 数组 数组在Kotlin中使用 Array类来表示, Array类定义了set和get函数(使用时可以用[],通过符号重载的约定转换)

    84210

    《逆袭进大厂》之C++篇49问49答

    中只能是一些变量的集合体,可以封装数据却不可以隐藏数据,而且成员不可以是函数 C++中,struct增加了访问权限,且可以和类一样有成员函数,成员默认访问说明符为public(为了与C兼容) struct...所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用 默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区 静态变量在函数内定义...(用该关键字声明的变量可以在const成员函数中被修改)数据的值 25、C++的顶层const和底层const 概念区分 顶层const:指的是const修饰的变量本身是一个常量,无法修改,指的是指针,...,完成对象的初始化工作 复制构造函数用于复制本类的对象 转换构造函数用于将其他类型的变量,隐式转换为本类对象 《浅谈C++中的几种构造函数》:https://blog.csdn.net/zxc024000...用户只能用const_cast来获得对类型接口的完全访问。此外,volatile向const一样会从类传递到它的成员。 多线程下的volatile 有些变量是用volatile关键字声明的。

    2K10

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

    我们可以这样一些事情: 为创建底层资源的深层副本的类提供复制构造函数,例如(int *)就是这种情况。 通过删除复制构造函数和复制赋值运算符使类不可复制。 最后,在API头文件中提供该信息。...因此,在我们的例子中,如果要使类不可复制和不可移动,我们将标记移动构造函数和movbe赋值操作符为已删除。...因此,如果你的类只包含简单的数据类型,并且你计划使用隐式生成的移动构造函数,那么如果你定义复制构造函数则不可能。在这种情况下时,你必须显式定义移动构造函数。...本文显示,与可移动的类相比,无法移动的类花费大约两倍的时间放置在向量中并遇到不可预测的内存峰值。 怎么解决?...你的错在于你让他们一开始就把自己的“脚”暴露给了友元类。 怎么解决? 避免在公共API类中使用friend。它们通常是设计不佳的表现,并且允许客户端访问API的所有受保护和私有成员。

    1.6K20
    领券