【C++面试知识】C++11新特性

1.新的keyword

(1)auto

自动类型推导:

auto a; // 错误,auto是通过初始化表达式进行类型推导,假设没有初始化表达式,就无法确定a的类型
auto i = 1;
auto d = 1.0;
auto str = "Hello World";
auto ch = 'A';
auto func = less<int>();
vector<int> iv;
auto ite = iv.begin();
auto p = new foo() // 对自己定义类型进行类型推导

应用在模板中

template <typename Product, typename Creator>
void processProduct(const Creator& creator) {
    Product* val = creator.makeObject();
    // do somthing with val
}    

VS

template <typename Creator>
void processProduct(const Creator& creator) {
    auto val = creator.makeObject();
    // do somthing with val
}

(2)decltype

从变量或者表达式中获得类型

    double tempA = 3.0;
    const double ctempA = 5.0;
    const double ctempB = 6.0;
    const double *const cptrTempA = &ctempA; 
    //const xx *const代表xx类型常量指针,指向的内容也是xx类型常量,指针与内容皆为常量不可更改
    
    /*1.dclTempA推断为const double(保留顶层const,此处与auto不同)*/
    decltype(ctempA) dclTempA = 4.1;
    /*2.dclTempA为const double,不能对其赋值,编译不过*/
    dclTempA = 5;
    /*3.dclTempB推断为const double * const*/
    decltype(cptrTempA) dclTempB = &ctempA;
    /*4.输出为4(32位计算机)和5*/
    cout<<sizeof(dclTempB)<<"    "<<*dclTempB<<endl;
    /*5.保留顶层const,不能修改指针指向的对象,编译不过*/
    dclTempB = &ctempB;
    /*6.保留底层const,不能修改指针指向的对象的值,编译不过*/
    *dclTempB = 7.0;

(3)nullptr

引入背景首先了解null关键字在C和C++中的定义:

在C中

#define NULL (void*)0

在C++中

#ifndef NULL  
#ifdef __cplusplus  
#define NULL    0  
#else  
#define NULL    ((void *)0)  
#endif  
#endif

下面看一个程序

void foo(int a)
{
    cout<<"This is int"<<endl;
}
void foo(char * ptra)
{
    cout<<"This is pointer"<<endl;
}
int main(void)
{
    foo(NULL);
    return 0;

如果程序沿用C中NULL的定义,foo(NULL)将不通过,因为(void*)0不能隐式转化为(char*)0,也不能转化为0;如果沿用C++中NULL定义,foo(NULL)将调用foo(int a),这不是我们的本意。

所以C++11中才会引入nullptr(任何时候都是一个空指针)。

    int tempA = 0;
    char *ptrTempA = NULL;
    char *ptrTempB = nullptr;
    
    /*1.调用foo(int)*/
    foo(NULL);
    /*2.调用foo(char*)*/
    foo(ptrTempA);
    foo(nullptr);
    foo(ptrTempB);
    /*3.此处的0是一个指针,可以进行比较,编译通过*/
    if(0 == nullptr){}
    /*4.不能将整型和一个指针进行比较,编译不过*/
    if(tempA == nullptr){}
    /*5.可以进行比较,但是会有告警,NULL可以理解成双重指针,既可以是空指针,又可以是整型0*/
    if(tempA == NULL){}

2.序列FOR循环

与java类似

map<string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
for (auto p : m){
    cout<<p.first<<" : "<<p.second<<endl;
}

for_each

vector<int> vec;
    for(int i=0;i<10;++i)
    {
        vec.push_back(i);
    }
    for_each(vec.begin(),vec.end() ,[](int i)->void{ cout << i <<" "; }); 

//第三个参数为lambda表达式,下面介绍

 

3.Lambda表达式

用于定义并创建匿名的函数对象

语法

[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}

Lambda 函数是一个依赖于实现的函数对象类型,这个类型的名字只有编译器知道. 如果用户想把 lambda 函数做为一个参数来
传递, 那么形参的类型必须是模板类型或者必须能创建一个 std::function 类似的对象去捕获 lambda 函数.使用 auto 关键字
可以帮助存储 lambda 函数,

auto my_lambda_func = [&](int x) { /* ... */ }; auto my_onheap_lambda_func = new auto([=](int x) { /* ... */ });

https://www.cnblogs.com/findumars/p/8062299.html

https://www.cnblogs.com/jimodetiantang/p/9016826.html

4.变长参数的模板

C++11中引入了变长參数模板,发明了新的数据类型:tuple,tuple是一个N元组。能够传入1个, 2个甚至多个不同类型的数据

auto t1 = make_tuple(1, 2.0, "C++ 11");
auto t2 = make_tuple(1, 2.0, "C++ 11", {1, 0, 2});

5.更加优雅的初始化方法

在C++11之前,只有数组能使用初始化列表,各种容器只能这样使用

int arr[3] = {1, 2, 3}
vector<int> v(arr, arr + 3);

C++11支持如下使用

int arr[3]{1, 2, 3};
vector<int> iv{1, 2, 3};
map<int, string>{{1, "a"}, {2, "b"}};
string str{"Hello World"};
  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值