分享

UC头条:面试高频问题之C 11新特性

 cnzrp 2023-06-02 发布于山西

C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C++更加现代化、高效、易用。也是面试容很容易被问到一个问题,下面我将简要介绍一些C++11的新特性:

自动类型推导

C++11引入了auto关键字,可以让编译器自动推导变量的类型。这样可以减少代码中的重复代码,提高代码的可读性和可维护性。例如:

autoi=42;//推导为int类型

autod=3.14;//推导为double类型

autos='hello';//推导为constchar*类型

lambda表达式

C++11引入了lambda表达式,可以方便地定义匿名函数。这样可以减少代码中的重复代码,提高代码的可读性和可维护性。例如:

autof=[](intx,inty){returnx+y;};

intz=f(1,2);//z的值为3

右值引用

C++11引入了右值引用,可以方便地实现移动语义和完美转发。这样可以提高代码的性能和效率。例如:

classMyString{

public:

MyString:data_(nullptr),size_(0){}

MyString(constchar*str):data_(newchar[strlen(str)+1]),size_(strlen(str)){

strcpy(data_,str);

}

MyString(MyString&&other):data_(other.data_),size_(other.size_){

other.data_=nullptr;

other.size_=0;

}

~MyString{

delete[]data_;

}

private:

char*data_;

size_tsize_;

};

更多关于右值引用的内容,感兴趣的小伙伴可以翻看我之前的帖子,有专门的介绍。

智能指针

C++11引入了智能指针,可以方便地管理动态分配的内存,避免内存泄漏和悬空指针的问题。C++11中有两种智能指针:std::unique_ptr和std::shared_ptr。

std::unique_ptr是一种独占式智能指针,它拥有对动态分配的对象的唯一所有权。当std::unique_ptr被销毁时,它所拥有的对象也会被销毁。例如:

std::unique_ptrp(newint(42));

std::cout<<*p<

std::shared_ptr是一种共享式智能指针,它可以被多个指针共享拥有权。当最后一个std::shared_ptr被销毁时,它所拥有的对象也会被销毁。例如:

std::shared_ptrp1(newint(42));

std::shared_ptrp2=p1;

std::cout<<*p1<<''<<*p2<

C++11的智能指针使得动态内存管理更加方便和安全。

range-basedfor循环

C++11引入了range-basedfor循环,可以方便地遍历容器中的元素。这样可以减少代码中的重复代码,提高代码的可读性和可维护性。例如:

std::vectorv={1,2,3,4,5};

for(autox:v){

std::cout<

}

nullptr

C++11引入了nullptr关键字,可以代替NULL宏定义。这样可以避免一些潜在的错误。例如:

voidf(int*p){}

f(nullptr);//可以编译通过

constexpr

C++11引入了constexpr关键字,可以在编译期间计算表达式的值。这样可以提高代码的性能和效率。例如:

constexprintfactorial(intn){

returnn==0?1:n*factorial(n-1);

}

intx=factorial(5);//x的值为120

更多关于constexpr的内容,感兴趣的小伙伴可以翻看我之前的帖子,有专门的介绍。

static_assert

C++11引入了static_assert关键字,可以在编译期间检查表达式的值是否为真。这样可以避免一些潜在的错误。例如:

static_assert(sizeof(int)==4,'intmustbe4bytes');//如果sizeof(int)不等于4,编译会失败

变长参数模板

C++11引入了变长参数模板,可以方便地处理可变数量的参数。这样可以提高代码的灵活性和可维护性。例如:

template

voidf(Args...args){

std::cout<

}

f(1,2,3);//打印3

f('hello',3.14);//打印2

线程支持库

C++11引入了线程支持库,可以方便地创建和管理线程。这样可以提高代码的并发性和可维护性。例如:

#include

#include

voidf{

std::cout<<'hello,world'<

}

intmain{

std::threadt(f);//创建一个新线程

t.join;//等待线程结束

return0;

}

结尾

以上是C++11的一些新特性,它们使得C++更加现代化、高效、易用。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多