首页 > 编程语言 >面试高频问题之C++11新特性

面试高频问题之C++11新特性

时间:2023-03-20 16:32:19浏览次数:42  
标签:11 std int C++ 高频 data ptr

背景

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

自动类型推导

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

auto i = 42; // 推导为int类型
auto d = 3.14; // 推导为double类型
auto s = "hello"; // 推导为const char*类型

lambda表达式

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

auto f = [](int x, int y) { return x + y; };
int z = f(1, 2); // z的值为3

右值引用

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

class MyString {
public:
    MyString() : data_(nullptr), size_(0) {}
    MyString(const char* str) : data_(new char[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_t size_;
};

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

智能指针

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

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

std::unique_ptr<int> p(new int(42));
std::cout << *p << std::endl; // 输出42

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

std::shared_ptr<int> p1(new int(42));
std::shared_ptr<int> p2 = p1;
std::cout << *p1 << " " << *p2 << std::endl; // 输出42 42

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

range-based for循环

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

std::vector<int> v = {1, 2, 3, 4, 5};
for (auto x : v) {
    std::cout << x << std::endl;
}

nullptr

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

void f(int* p) {}
f(nullptr); // 可以编译通过

constexpr

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

constexpr int factorial(int n) {
    return n == 0 ? 1 : n * factorial(n - 1);
}
int x = factorial(5); // x的值为120

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

static_assert

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

static_assert(sizeof(int) == 4, "int must be 4 bytes"); // 如果sizeof(int)不等于4,编译会失败

变长参数模板

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

template<typename... Args>
void f(Args... args) {
    std::cout << sizeof...(args) << std::endl; // 打印参数的数量
}
f(1, 2, 3); // 打印3
f("hello", 3.14); // 打印2

线程支持库

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

#include <iostream>
#include <thread>
void f() {
    std::cout << "hello, world" << std::endl;
}
int main() {
    std::thread t(f); // 创建一个新线程
    t.join(); // 等待线程结束
    return 0;
}

结尾

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

标签:11,std,int,C++,高频,data,ptr
From: https://blog.51cto.com/u_15950321/6133189

相关文章

  • 面试高频问题之C++11新特性
    背景C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C++更加现代化、高效、易用。也是面试容很......
  • Lightroom Classic 2022 for Mac(Lrc2022) 11.5中文激活版
    Lightroom Classic2022是一款桌面照片编辑和管理软件,照片后期处理软件,数码摄影师必备工具,主要面向数码摄影师、图形设计等专业人士和高端用户,以及所有喜好拍照、需要拍照......
  • [第十届蓝桥杯省赛C++B组]等差数列
    来源:第十届蓝桥杯省赛C++B组算法标签:数论最大公约数题目描述数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N个整数。现在给......
  • [pat乙]1011 A+B 和 C
    1011A+B和C(15分)给定区间[−2​31,2​31​​]内的3个整数A、B和C,请判断A+B是否大于C。输入格式:输入第1行给出正整数T(≤10),是测试用例的个数......
  • 以下是一个使用C++实现HTTP文件下载的简单示例,其中使用了C++ 11的标准库和Boost库:
    #include<iostream>#include<fstream>#include<boost/asio.hpp>usingboost::asio::ip::tcp;intmain(){try{boost::asio::io_serviceio_service;......
  • win11 如何设置 通知区域始终显示所有图标
    点击“搜索”,输入cmd,选择“以管理员身份运行  在弹窗里面输入以下代码,打开传统的通知区域图标管理器explorershell:::{05d7b0f4-2121-4eff-bf6b-ed3f69b894d9}......
  • c++环境
    目录环境准备下装安装vscode及插件安装mingw编译器工作环境准备vscode工作目录调试环境CSDN参考文档环境准备下装安装vscode及插件vscode是微软账号登录的插件配置信息......
  • [C++引用] 保定丽丽带你学C++
    引用是C++内一个比较有用的方法,大家在丽丽的带领下好好学习。一.引用的基本使用C++引用的作用:给变量起别名语法:​​数据类型&名字=原名​​示例:#include<iostream>usi......
  • C++重载
    返回值不能作为重载的依据intfun()const;intfun();常成员函数可以用于重载无法重载的情况voidfun(inta);voidfun(constinta);普通值传递和const传递无法......
  • C++ 读写ini文件
    #include<Windows.h>#include<string>classIniFile{public:IniFile(conststd::wstring&path):m_path(path){}std::wstringGetValue(conststd::wstring&......