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

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

regex, 库尽量以头文件实现, 但也有并行库这种必须深入编译器的库 用通用而非特殊的手段来实现特性: 显式类型转换 让特性对专家和新手都适用: 统一初始化表达式 增强类型安全: enum class...初始化列表的效果总是慢于就地初始化, 但也快过在构造函数中进行赋值 注意: 非常量的静态变量依然要在头文件外定义从而保证在程序中只存在一个 sizeof()可以对类成员表达式使用了 类模板也可以声明友元了...有了extern后编译器会自动删除重复的实例化模板, 不但节省内存还节省了多余的实例化时间 注意被其他文件调用的外部模板一定要在要用到的类实例化之前实例化 局部和匿名成员可以作为模板实参了, 但仍要注意匿名类型的声明不能在参数位置..., 所以当发生冲突的时候应该显式声明构造函数来因此冲突的函数 当派生类是虚继承了基类时, 不能使用继承构造函数 一旦使用了继承构造函数(用using Base::Base;)暴露出来, 自身的默认构造函数就和之前的隐藏规则一样...如果使用委派构造, 就必须在构造函数体中进行其余成员的初始化 一种解决方案是修改构造的顺序, 让参数最多的构造函数作为委派构造的最终目标, 然后在这个构造函数的初始化列表中完成成员初始化.

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

    C++复习笔记——C++ 关键字

    explicit explicit(显式的)的作用是"禁止单参数构造函数"被用于自动型别转换,其中比较典型的例子就是容器类型。在这种类型的构造函数中你可以将初始长度作为参数传递给构造函数。...在下列情况下必须对一个name 使用typename 关键字: 一个唯一的name(可以作为类型理解),它嵌套在另一个类型中的。 依赖于一个模板参数,就是说:模板参数在某种程度上包含这个name。...当模板参数使编译器在指认一个类型时产生了误解。 class class(类)是 C++ 面向对象设计的基础。使用class关键字声明一个类。 for for是 C++ 中的循环结构之一。...类的静态成员变量必须在声明它的文件范围内进行初始化才能使用,private类型的也不例外。...void void(空的),可以作为函数返回值,表明不返回任何数据;可以作为参数,表明没有参数传入(C++中不是必须的);可以作为指针使用。

    1.3K30

    C++模板大总结!

    模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。...五、模板的实例化: 总结一下,C++只有模板显式实例化(explicit instantiation),隐式实例化(implicit instantiation),特化(specialization,...2、显式实例化: 前面已经提到隐式实例化可能影响效率,所以需要提高效率的显式实例化,显式实例化在编译期间就会生成实例,方法如下: [cpp] view plaincopyprint?...: 在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化: 1、声明一个类模板的指针和引用,不会引起类模板的实例化,因为没有必要知道该类的定义...2、定义一个类类型的对象时需要该类的定义,因此类模板会被实例化 3、在使用sizeof()时,它是计算对象的大小,编译器必须根据类型将其实例化出来,所以类模板被实例化. 4、 new表达式要求类模板被实例化

    74020

    C++模板总结

    模板是 C++ 支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。...五、模板的实例化: 总结一下,C++ 只有模板显式实例化 (explicit instantiation), 隐式实例化 (implicit instantiation) ,特化 (specialization...2、显式实例化: 前面已经提到隐式实例化可能影响效率,所以需要提高效率的显式实例化,显式实例化在编译期间就会生成实例,方法如下: [cpp] view plaincopyprint?...: 在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化: 1、声明一个类模板的指针和引用,不会引起类模板的实例化,因为没有必要知道该类的定义...2、定义一个类类型的对象时需要该类的定义,因此类模板会被实例化 3、在使用 sizeof() 时,它是计算对象的大小,编译器必须根据类型将其实例化出来,所以类模板被实例化. 4、 new 表达式要求类模板被实例化

    1.3K20

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

    错误#9:使用隐式模板实例化时,使用模板实现细节来混淆公共头文件 在隐式实例化中,模板代码的内部必须放在头文件中。没有其他办法。...它的好处是保持主要公共头文件不受实现细节的影响,同时将内部细节的必要暴露,隔离到明确指定为包含私有细节的单独头文件。 错误#10:当用例已知时,不使用显式模板实例化 为什么这是一个错误?...如果你知道你的模板将只与int、double和string一起使用,你可以使用显式实例化为这三种类型生成模板特化。... DoubleStack; typedef Stack StringStack; 警告:如果进行显式特殊化,客户端将无法创建更多特殊化(并且编译器也无法为客户端创建隐式实例化...有些情况下,只有头文件是唯一的选项,例如在处理模板时(除非你选择通过显式实例化为特定类型专门化模板) 这是许多开源项目使用的非常流行的模型,包括Boost和RapidJson。

    1.6K20

    C++初阶

    函数模板的实例化 用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。 1....隐式实例化:让编译器根据实参推演模板参数的实际类型(用int强转) template T Add(const T& left, const T& right) { return...使用显式实例化 Add(a1, (int)d1); return 0; } 显式实例化:在函数名后的中指定模板参数的实际类型 int main(void) { int a =...= 0; } 类模板的实例化 类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。...将声明和定义放到一个文件 "xxx.hpp" 里面或者xxx.h其实也是可以的。推荐使用这种。 2. 模板定义的位置显式实例化。这种方法不实用,不推荐使用。 模板总结 优点 1.

    10210

    C++初阶大全

    函数模板的实例化 用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。 1....隐式实例化:让编译器根据实参推演模板参数的实际类型(用int强转) template T Add(const T& left, const T& right) { return...使用显式实例化 Add(a1, (int)d1); return 0; } 显式实例化:在函数名后的中指定模板参数的实际类型 int main(void) { int a =...= 0; } 类模板的实例化 类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。...将声明和定义放到一个文件 "xxx.hpp" 里面或者xxx.h其实也是可以的。推荐使用这种。 2. 模板定义的位置显式实例化。这种方法不实用,不推荐使用。 模板总结 优点 1.

    5810

    【C++】泛型编程:吃透模板

    四、函数模板的实例化 ​ 用不同类型的参数使用模板参数时,称为函数模板的实例化。其中模板参数实例化分为:隐式实例化 和 显式实例化 ,下面我们来分别讲解一下这两种实例化。...使用 “显式实例化” 来解决: Add(a1, d2); // 指定实例化成int Add(a1, d2) // 指定实例化成double ② 显式实例化 ​ 定义...使用显式实例化,这种方法不实用,不推荐使用。在单独的编译单元中,通过显式实例化的方式生成模板的实例化代码,并将其链接到主程序中。...这种方法需要在使用模板的文件中显式实例化模板,以告诉编译器需要实例化哪些模板。 这种方法适用于模板实现代码比较复杂的情况,可以避免模板实现暴露在头文件中带来的问题。...需要注意的是,显式实例化需要在所有使用模板的文件中都进行,并且需要注意实例化的类型必须与声明时的类型一致,否则会导致链接错误。

    10910

    【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧

    1.2 非类型模板参数的注意事项 允许的类型:非类型模板参数可以是整型、枚举、指针或者引用类型,但浮点数、类对象和字符串不允许作为非类型模板参数。 编译期确认:非类型模板参数必须在编译期确认。...在模板编程中,分离编译有时会带来挑战,因为模板的实例化是在编译期进行的,编译器需要知道模板的定义和使用场景。...这是因为模板的实例化是由编译器根据实际使用的类型生成的代码,如果在模板的定义和使用之间缺乏可见性,编译器无法正确地实例化模板。...// a.h template T Add(const T& left, const T& right) { return left + right; } 显式实例化模板 通过显式实例化...为了解决这个问题,可以考虑以下几种策略: 减少模板的实例化次数:通过显式实例化来控制模板的使用,避免重复生成相同功能的模板代码。

    14010

    C++ 实现 STL 标准库和算法(二)template 编程和迭代器粗解 实验楼笔记

    ,在程序中给出模板并不能使用它,还必须实例化,比如: Myclass A; //用 int 实例化一个类A Myclass B; //用 double 实例化一个类B 当程序编译到这里时就会按照我们给出的类型...注意,在这里我们一定要显式给出类型 T 。类模板不像是函数模板 ,函数模板会根据参数推断类型。 当然类模板也支持默认参数,但是类模板必须严格从右往左默认化。...成员模板 模板的使用范围是广泛的,不仅可以用作函数模板,类模板,还可以用作 class ,struct ,template class 的成员。而要实现 STL 这是我们必须掌握和使用的特性。...五、模板类中的静态成员 我们知道,在类中定义的静态成员是存储在静态区中,被所有类对象共享,并不属于某一个类所有,同样的在模板类中的静态成员也不会被复制多份,而是被同类实例化的类对象共享,比如所有 int...这样编译器在编译的时候就会产生二义性,它根本不知道这是一个类型还是别名,所以我们加上 typename 显式说明出来。

    60910

    【C++】模板进阶

    非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。...常量前面加上自己的类型 例如定义一个静态数组的类,其大小是固定的就可以传递非类型模板参数: namespace tutu { // 定义一个模板类型的静态数组 template的模板参数必须在编译期就能确认结果。 非类型模板参数必须是整数类型、枚举类型或指向对象的指针或引用类型。...3.3解决方法 将声明和定义放到一个文件 “xxx.hpp” 里面或者xxx.h其实也是可以的,这样声明定义就放在一个文件中了,推荐使用这种。 模板定义的位置显式实例化。...显式实例化代码如下: //a.cpp #include"a.h" template T Add(const T& left, const T& right) { return left

    7710

    【C++】模板进阶

    在C语言阶段如果想要让数组的大小可以自己控制,一般都会用定义宏的方式来解决,在C++中我们可以使用非类型模板参数来进行解决,下面代码给出类模板的声明,在使用时我们可以显示实例化类模板,给非类型模板参数传一个常量...在显式实例化模板时,给非类型模板参数传参时,只能给常量,不能给变量,否则会报错:局部变量不能作为非类型模板参数。所以在传参时,也只能传常量。...类模板的全特化就是将模板参数列表中所有的参数都确定化,在显示实例化函数模板时,若显示所传参数均为double,则不会走推演实例化的步骤,而是直接走实例化好的类,所以类模板的全特化实际就是在参数确定之后,...无论是类模板的全特化还是偏特化的部分特化或对参数的进一步限制,其本质还是编译器对于模板参数的优先匹配原则。 只要有现成实例化好的模板,编译器肯定不会去费力推导实例化模板。 2....第二种就是在模板定义的位置也就是.cpp文件里面进行对应模板参数类型的显式实例化,但这种方式不推荐,如果我要实例化出10个类呢?那你就在类模板定义的地方连续显示实例化出10个类吗?

    1.1K20

    【深入浅出C#】章节 2:数据类型和变量:类型转换和类型推断

    以下是在显式类型转换中常见的引用类型之间的转换方式: 向上转换(Upcasting): 向上转换是将派生类的实例转换为基类的实例。 这种转换是安全的,因为派生类的实例具有基类的所有成员。...这种转换需要在编译时或运行时检查基类实例是否实际上是派生类的实例,以避免类型不匹配的异常。 转换操作需要使用强制类型转换运算符()或as运算符。...引用类型之间的隐式转换: 从派生类向基类进行转换是隐式的。派生类的实例可以隐式转换为基类类型。...临时数据传递:当需要传递一组相关的属性作为参数或返回值时,可以使用匿名类型。它可以方便地封装一组属性值,而不必为其创建一个专门的类。...匿名委托和事件处理:在事件处理程序或匿名委托中,可以使用匿名类型来传递一组相关的参数。这样可以方便地将一组值作为整体传递给处理程序。

    46710

    【C++STL】模板进阶(非类型模板&&类模板打印&&特化&&分离编译)

    非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。...非类型的模板参数必须在编译期就能确认结果。 非类型模板参数必须是整数类型、枚举类型或指向对象的指针或引用类型。...(3) 非类型模板参数一般都是用整形,它是不可改变的常量。 2、非类型模板参数在STL中的应用–array类 array类:就是用一个类封装静态数组。使用时要包含头文件。...(2) 模板定义的位置显式实例化。这种方法不实用,不推荐使用。...显式实例化代码如下: //a.cpp #include"a.h" template T Add(const T& left, const T& right) { return left

    14310

    【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

    struct代替class) 三.函数模板的实例化 引入:用不同类型的参数使用函数模板时,称为函数模板的实例化。...模板参数实例化分为:隐式实例化和显式实例化。实例化实现的任务是交给编译器的。...1.隐式实例化 引入:隐式实例化的机制是让编译器根据实参推演模板参数的实际类型,而这往往会出现一些问题 适用情况:其交换的两者是同一类 不适用情况:其交换的两者不是同一类 template<...或者 double类型而报错 解决方式: 用户自己强制类型转换 显式实例化 2.显式实例化 显式实例化:在函数名后的中指定模板参数的实际类型 代码演示: int main(void) {...int a = 10; double b = 20.0; // 显式实例化 Add(a, b); return 0; } 3.模板参数的匹配原则 一个非模板函数可以和一个同名的函数模板同时存在

    25210

    C++【模板初阶】

    编译器在识别参数类型生成函数时,有两种途径: 自动识别 (隐式) 我们手动指定(显式) 隐式实例化 隐式实例化就是编译器自动识别参数后生成函数的过程 隐式实例化很方便,但可能存在问题 //Add 模板...临时变量具有常性,所以Add函数中的引用形参需要被 const 修饰 或者不用引用,这样也不需要 const ,但是此时效率会变低 显式实例化 显式实例化就是给编译器打招呼,让它在建房子时按照我们的意愿来...>,一键生成,非常方便,当然还有很多容器都会用到显式实例化 ️匹配规则 具体函数调用时,隐式生成的模板函数并不会最先被调用 假设我们已经在程序中写好了参数需要的函数,而同时模板也能生成参数需要的函数,此时编译...使用模板是在麻烦编译器帮我们办事,实际事也是办成功的 当隐式实例化后的函数已存在时,不会去生成模板函数,而是直接使用已存在的函数 显式实例化后,编译器则会优先选择显式生成的普通函数 隐式生成的模板函数不存在类型隐式类型转换...,其实它就是通过函数模板实现的 ---- 类模板 模板除了可以用在函数上面外,还可以用在类上,此时称为 类模板 STL 库中的容器,都是 类模板 的形式,我们使用时,需要什么类型的 类,直接显式实例化为对应

    13410

    【C++】格式与实例化操作——详解(7)

    ,在类(函数)模板中可将该参数当成常量来使用 1)模板参数&模板参数列表 2)非类型模板参数 非类型模板参数主要用于定义一个【静态栈】例如array 要注意非类型模板参数只能用于整型 【浮点数、类对象以及字符串是不允许作为非类型模板参数的...用不同类型的参数使用函数模板时,称为 函数模板的实例化 。...模板参数实例化分为: 隐式实例化 和 显式实例化 PS:实例化实现的任务是交给编译器的 1....【隐式实例化】 引入: 隐式实例化的机制是让编译器 根据实参推演模板参数的实际类型 ,而这往往会出现一些问题 适用情况:其交换的两者是同一类 不适用情况:其交换的两者 不是同一类 template...【显式实例化 】 显式实例化:在函数名后的中 指定 模板参数的实际类型 int main(void) { int a = 10; double b = 20.0;

    12410

    【泛型编程】模板全详解

    4.函数模板的实例化 用不同类型的参数使用模板参数时,成为函数模板的实例化。 模板参数实例化分为:隐式实例化 和 显式实例化 ,下面我们来分别讲解一下这两种实例化。...我们还可以使用 “显式实例化” 来解决: Add(a1, d2); // 指定实例化成int Add(a1, d2) // 指定实例化成double ② 显式实例化...简单来说,显式实例化就是在中间加一个尖括号 去指定你要实例化的类型。...总结: 函数模板你可以让它自己去推,但是推的时候不能自相矛盾。 你也可以选择去显式实例化,去指定具体的类型。...解决方法: 将声明和定义放到一个文件 “xxx.hpp” 里面或者 xxx.h 其实也是可以的。推荐使用这种。 模板定义的位置显式实例化。这种方法不实用,不推荐使用。

    67920
    领券