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

c++11面试宝典(final,delete,deault,explicit,lambda表达式)

这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情 c++11 1. final 作用: final在修饰类时,表示该类无法被继承 ​ 修饰父类的虚函数时,表示该虚函数无法被重写...3. delete 和 default C++11扩展了delete和default的用法,可以用来控制默认成员函数的生成与不生成 delete C++11扩展了delete的用法,可以让用户控制让编译器不生成默认的成员函数...->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分 可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。 {statement}:函数体。...[var]:表示值传递方式捕捉变量var [=]:表示值传递方式捕获所有父作用域中的变量(包括this) [&var]:表示引用传递捕捉变量var [&]:表示引用传递捕捉所有父作用域中的变量(包括this...在块作用域以外的lambda函数捕捉列表必须为空。 e. 在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或者非局部变量都 会导致编译报错。

58620

初识C++ · C++11(2)

,lambda表达式的类型你不知我不知,只有编译器才知道,怎么个知道法呢?...前面提及,捕获列表是不能省略的,那么顾名思义,捕获嘛,捕捉当前作用域的同名的变量: int main() { int a = 2, b = 1; auto Fs = [a, b]() { int...b << endl; return 0; } 打印出来的结果依然是2 和 1 ,这是因为捕获列表里面实际上是 a b 的拷贝,所以在里面交换了值是不会对外面的 a b起到作用的。...+; }; auto Fs4 = [&, a]() { b++,c++,d++ ; }; return 0; } 这里我们可以总结为: 1 [=]以传值的方式捕获局部域中的所有变量 2 [&]以引用的方式捕获局部域中的所有变量...delete的作用是不希望能强制调用该函数,在C++98里面常见的做法是将函数设为私有等,比如不希望能直接实例化一个对象,就可以将构造函数私有,但是还有问题是,我们可以通过static修饰的方法直接进行通过类域来访问公有函数从而达到实例化对象

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

    C++入门必备知识(你真的入门C++了吗?)

    命名空间 1.命名空间产生的原因 在C/C++中,变量、函数和后面要学习的类都是大量存在的,这些变量、函数和类的名称都存在于全局作用域中,可能会导致很多冲突。...C语言不支持(编译器不支持) 函数重载 1、函数重载概念 函数重载:是函数的一种特殊情况,C++ 允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或顺序)必须不同,...而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。 7.另外我们也理解了,为什么函数重载要求参数不同!而跟返回值没关系。...,然后用推导出来的类型定义其他变量。...不能作为函数的参数 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导 void TestAuto(auto a) {} auto不能直接用来声明数组 void TestAuto

    49820

    【C++】——入门基础知识

    命名空间 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。...5.1 函数重载概念 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型...C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。...在同一行定义多个变量 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量 void TestAuto(...不能作为函数的参数 // 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导 void TestAuto(auto a) {} 2. auto不能直接用来声明数组 void

    11910

    C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

    ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。 {statement}:函数体。...[&]:表示引用传递捕捉所有父作用域中的变量(包括this) int main() { int a = 1, b = 2, c = 3, d = 4, e = 5; auto func2 = [&]...在块作用域以外的lambda函数捕捉列表必须为空。 在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或者非局部变量都会导致编译报错。...实现一个类只能在堆上创建对象: class HeapOnly { public: // 静态方法,用于在堆上创建 HeapOnly 对象 static HeapOnly* CreateObj...template class ...Args> void ShowList(Args... args) {} 递归函数方式展开参数包 编译时,参数推导递归: void _ShowList() { cout

    9310

    C++入门

    ++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。...而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。...,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量 // 错误示例:void TestAuto(){auto a = 1, b = 2;auto c = 3,...d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同}==注意:==auto关键字不能在函数参数中使用:auto 关键字也有一些限制,其中就是不能在函数的参数中使用。...如果使用 auto 关键字,编译器就无法确定参数的类型,只有在调用函数的时候,才能根据实参来推导出形参的类型,否则就会导致编译错误。

    19320

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

    ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。...[=]:表示值传递方式捕获所有父作用域中的变量(包括成员函数中的this)。 [&var]:表示引用传递捕捉变量var。 [&]:表示引用传递捕捉所有父作用域中的变量(包括成员函数中的this)。...在块作用域以外的lambda函数捕捉列表必须为空。 在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或者非局部变量都会导致编译报错。...:统一可调用对象的类型,指明了参数和返回值类型 不包装前可能存在很多问题: 函数指针太复杂,不方便理解。...仿函数类型是一个类名,没有指明参数和返回值,需要去operator()才能看出来。 lambda表达式在语法层看不到类型。

    9610

    C++入门基础,看这篇就足够了!

    在C/C++中,变量、函数和后面要学到的类都大量存在各式各样的名字,这些变量、函数和类的名称都存在于全局作用域中,可能会和你的变量、函数、类的名字冲突。...5.1 函数重载概念 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些函数的形参列表(参数个数或者类型或者类型顺序)不同,常用来处理功能类似数据类型不同的问题。...而C++是通过函数修饰规则来区分地,只要参数不同,修饰出来地名字就不一样,那么就可以支持重载了。 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。 6....,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。...} 8.3 auto不能推导的场景 auto不能作为函数的参数 void testauto(auto x) { //... } //此处代码编译失败,auto不能作为形参类型,因为编译器无法对x的实际类型进行推导

    44410

    C++入门

    变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。...函数重载 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。...也就是说,这就像我给了你一个建议,你也可以不采纳我的建议,就这么简单!...,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。...不能推导的场景 auto不能作为函数的参数 // 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导 void TestAuto(auto a) {} auto不能直接用来声明数组

    10410

    C++入门

    命名空间 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。...5.1 函数重载概念 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型...而C++是通过函数修 饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。 7. 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办 法区分。...在同一行定义多个变量 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。...8.3.2 auto不能推导的场景 1. auto不能作为函数的参数 // 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导 void TestAuto(auto

    9810

    C++入门的基础

    ,因为标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。...5、1、函数重载概念 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些类型的形参列表(参数个数 或 类型 或 类型顺序不同)。...&a); printf("%p\n", &ra); } 注意:引用类型必须是和实体是同种类型的 6、2、引用特性 1、引用并不能在定义的时候不初始化。...这就导致 1、类型难于拼写 2、含义不明导致出错 8、1、auto介绍 auto不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得...e; 无法通过编译,使用auto定义变量时必须对其进行初始化 return 0; } ==注意:==使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型

    16910

    深入解析C++的auto自动类型推导

    除了下面即将要讲到的第三种情况外,auto都不会推导出结果是引用的类型,如果要定义为引用类型,就要像上面那样明确地写出来,但是auto可以推导出来是指针类型,也就是说就算没有明确写出auto*,如果expr...; auto str = word; // str为const char* pi被推导出来的类型为int*,而str被推导出来的类型为const char*。...x2的定义将会引起编译错误,因为x2虽然推导为initializer_list类型,但是在推导T的类型时,里面的元素的类型不统一,导致无法推导出T的类型,引起编译错误。...) { std::cout " << v << std::endl; } 使用auto声明函数的形参(C++20) 之前提到无法在普通函数中使用auto来声明形参,这个功能在...class Object { static inline auto a = 1; // 需要写上inline修饰词 }; 函数无法返回initializer_list类型 虽然在C++14中支持了自动推导函数的返回值类型

    37820

    C++11知识点总结(全面解析C++11经常考到的知识点)

    变量类型推导 3.1 为什么需要类型推导 在定义变量时,必须先给出变量的实际类型,编译器才允许定义,但有些情况下可能不知道需要实际类型怎么给,或者类型写起来特别复杂,比如: #include ...C++11中,可以使用auto来根据变量初始化表达式类型推导变量的实际类型,可以给程序的书写提供许多方便。将程序中c与it的类型换成auto,程序可以通过编译,而且更加简洁。...3.2 decltype类型推导 3.2.1 为什么需要decltype auto使用的前提是:必须要对auto声明的类型进行初始化,否则编译器无法推导出auto的实际类型。...5.2final 作用:指定某个虚函数不能在子类中被覆盖,或者某个类不能被子类继承。...在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或者非局部变量都会导致编译报错。

    2.1K10

    C++:C++入门基础

    实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识 6.2 注意事项 1、早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可...函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。...3.没有类型安全的检查 。 C++有哪些技术替代宏? 1. 常量定义 换用const enum 2. 短小函数定义 换用内联函数 十一、auto关键字 为什么会有auto函数呢?...在同一行定义多个变量 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。...3、为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法 11.5 auto不能推导的场景 1. auto不能作为函数的参数 // 此处代码编译失败,auto不能作为形参类型

    36410

    【C++】C++11的新特性 --- lambda表达式 ,新的类功能,模块的可变参数 , emplace系列接口

    ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,一般都省略,由编译器对返回类型进行推导。 {statement}:函数体。...注意这里使用auto可以帮助我们解决不知道函数类型的问题。...来总结一下捕捉的种类: [var]:表示值传递方式捕捉变量var [=]:表示值传递方式捕获所有父作用域中的变量(包括this) [&var]:表示引用传递捕捉变量var [&]:表示引用传递捕捉所有父作用域中的变量...默认成员函数就是我们不写编译器会生成一个默认的!...在编译时,编译器会自动推导出来这个打印函数的参数:(以三个参数的为例) 直接对...args是没有办法进行取出参数的,要进行递归逐个进行取用!

    10610

    Effective Modern C++翻译(4)-条款3:了解decltype

    []运算符作用在一个以T为元素的容器上时,通常返回T&,std::deque就是这样的,std::vector也几乎一样,唯一的例外是对于std::vecotr,[]运算符不返回一个bool...&,相反的,它返回一个全新的对象,条款6将解释这是为什么,但是重要的是记住作用在容器上的[]运算符的返回类型取决于这个容器本身。...type)语义正被使用,例如:函数的返回类型将在参数列表的后面声明(在->之后),追踪返回类型 的优势是函数的参数能在返回类型的声明中使用,例如,在authAndAccess中,我们用c和i来指定函数的返回类型...也许答案会有些让人惊讶,带有auto返回类型的函数使用模板类型推导规则,尽管看起来auto的类型推导规则会更符合这个语义,但是模板类型推导规则和auto类型推导规则几乎是一模一样的,唯一的不同是模板类型推导规则在面对大括号的初始化式...像我们之前讨论过的,大多数[]运算符作用在以T为元素的容器上时返回一个T&,但是条款1解释了在模板类型推导期间,初始化表达式的引用部分将被忽略掉,考虑下面的客户代码,使用了带有auto返回类型(使用模板类型推导来推导它的返回类型

    80590

    Modern c++快速浅析

    const int&的对象,那么T推导出来的类型是const int,param的类型是const int&。...,那么T和param推导出来的类型都是int如果传递进的是一个const char* const的指针,那么T和param推导出来的类型都是const char*,顶层const被忽略。...因为这是一个拷贝指针的操作,因此保留原指针的不可更改指向性并没有太大的意义 auto 大多数情况下auto推断出来的结果和模板类型推导的结果是一样的,不同点在于对大括号初始物的处理 值与指针等推导 const...1 }; // 与C++14相同,皆为std::initializer_list 返回值推导 将函数的返回值标记为auto,意味着返回值类型的推导遵循模板类型推导的原则,而非auto的推导原则 C...enum class 普通的枚举类型是不限定作用域的,即在同一个namespace中,是不能出现重名的,且能够被隐式转换为int等类型的值 ;强枚举类型(enum class)的枚举类型是唯一的,但仍可以显示强转为

    20410

    【C++进阶】C++11的认识与学习

    例如vector 二.auto,decltype和nullptr声明 auto auto之前都用过,它可以自己推导变量的类型,但是它必须要初始化,否则无法推导。...auto仅仅只是占位符,编译阶段编译器根据初始化表达式推演出实际类型之后会替换auto。 decltype decltype也可以用来声明,和auto不同的是,它可以不初始化。...str 是一个左值,并不是右值,为什么会调用移动赋值呢?...[val],表示值传递方式捕获某个变量 [=],表示值传递方式捕获所有父作用域中的变量(包括this) [&var],表示引用传递捕捉变量var [&],表示引用传递捕捉所有父作用域中的变量(包括this...在块作用域以外的lambda函数捕捉列表必须为空 lambda表达式之间不能相互赋值 其实,lambda表达式的底层是仿函数,即使两个lambda表达式看起来是一样的,但它们在底层仍然不同,不属于同一个类型

    16510

    C++11:可变参数模板lambda表达式

    ②showList(1,'A'): 匹配到第二个showList函数后,先将1打印出来。...->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。...int main() { // 最简单的lambda表达式, 该lambda表达式没有任何意义 [] {}; // 省略参数列表和返回值类型,返回值类型由编译器推导为int int a = 3,...[var]:表示值传递方式捕捉变量var [=]:表示值传递方式捕获所有父作用域中的变量(包括this) [&var]:表示引用传递捕捉变量var [&]:表示引用传递捕捉所有父作用域中的变量...在块作用域以外的lambda函数捕捉列表必须为空。 e. 在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或者非局部变量都会导致编译报错。

    1.2K40
    领券