面试必备 | C++ 中的各种特性

Posted 一去丶二三里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试必备 | C++ 中的各种特性相关的知识,希望对你有一定的参考价值。

星标/置顶 公众号👇,硬核文章第一时间送达!

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++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)  /* ... */ );

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> iv1, 2, 3;
map<int, string>1, "a", 2, "b";
string str"Hello World";

链接 | https://blog.csdn.net/a15920804211/article/details/90691525

往期推荐

☞ 专辑 | 趣味设计模式

☞ 专辑 | 音视频开发

☞ 专辑 | C++ 进阶

☞ 专辑 | 超硬核 Qt

☞ 专辑 | 玩转 Linux

☞ 专辑 | GitHub 开源推荐

☞ 专辑 | 程序人生

关注公众「高效程序员」👇,一起优秀!

回复 “入群” 进技术交流群,回复 “1024” 获取海量学习资源。

以上是关于面试必备 | C++ 中的各种特性的主要内容,如果未能解决你的问题,请参考以下文章

面试必备 | 常见C++笔试面试题整理

前端面试常考知识点--通关必备

HTML5的新特性(面试必备)

C++开发者都应该使用的10个C++11特性

C++面试必备

Dart语言特性必备了解!