《深入理解C++11》阅读笔记

C++11是C++的重要更新,引入了大量增强,如线程支持、统一初始化、auto、decltype、右值引用等,提高了类型安全和性能。新特性包括静态断言、noexcept、继承构造函数、委派构造函数、模板别名、内联命名空间等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、新标准的诞生

C++11 是 C++ 的第二个主要版本(前一个是 C++98 而后一个是 C++17 ),并且是从 C++98 起的最重要更新。它引入了大量更改,标准化了既有实践,并改进了对 C++ 程序员可用的抽象。

在它最终由 ISO 在 2011 年 8 月 12 日承认前,人们曾使用名称 ‘C++0x’ ,因为它曾被期待在 2010 年之前发布。 C++03 与 C++11 期间花了 8 年时间,故而这是迄今为止最长的版本间隔。从那时起, C++ 规则地每 3 年更新一次。

C++11相对于C++98/03有哪些显著的增强呢?事实上,这包括一下几点:

  • 通过内存模型、线程、原子操作等来支持本地并行编程(Native Concurrency);
  • 通过统一初始化表达式、auto、decltype、移动语义等来统一对泛型编程的支持;
  • 通过constexpr、POD(概念)等更好地支持系统编程;
  • 通过内联命名空间、继承构造函数和右值引用等,以更好地支持库的构建。

C++11主要的新语言特性:

2、保持稳定性和兼容性

2.1 保持与C99兼容

2.1.1 预定义宏

2.1.2 __func__预定义标识符

在C++11中,允许其使用在类或结构体中。

2.1.3 _Pragma操作符
#pragma once
_Pragma("once") // 等价
2.1.4 变长参数的宏定义以及__VA_ARGS__
2.1.5 宽窄字符串的连接

2.2 long long整型

/**
 * @file     2.2.cpp
 * @brief
 * @author   YongDu
 * @date     2021-07-17
 */

#include <climits>
#include <iostream>

int main() {
   
   
  long long ll_min = LLONG_MIN;
  long long ll_max = LLONG_MAX;
  unsigned long long ull_max = ULLONG_MAX;

  std::cout << "min of long long: " << ll_min << std::endl;
  std::cout << "max of long long: " << ll_max << std::endl;
  std::cout << "max of unsigned long long: " << ull_max << std::endl;

  return 0;
}

// min of long long: -9223372036854775808
// max of long long: 9223372036854775807
// max of unsigned long long: 18446744073709551615

2.3 扩展的整型

C/C++是一种弱类型语言,当运算、传参等类型不匹配的时候,整型间会发生隐式转换,即整型提升。

2.4 宏__cplusplus

std::cout << __cplusplus << std::endl;

2.5 静态断言

断言assert宏只有在程序运行时才能起作用,而#error只在编译器预处理时才能起作用。

static_assert是编译时期的断言,其使用范围不像assert受限制,在通常情况下,static_assert可以用于任何名字空间。必须注意的是,static_assert的断言表达式必须是编译时期可以计算的表达式,即必须是常量表达式。如果使用变量,则会导致错误。

2.6 noexcept修饰符和noexcept操作符

断言适用于排除逻辑上不可能存在的状态,异常通常用于逻辑上可能发生的错误。

C++11标准中让类的析构函数默认是noexcept(true)的。

2.7 快速初始化成员变量

2.8 非静态成员的sizeof

在C++11中,对非静态成员变量使用sizeof操作是合法的,而在C++98中,只有静态成员,或者对象的实例才能对其成员进行sizeof操作。

2.9 扩展的friend语法

在C++11中,声明一个类为另外一个类的友元时,不再需要使用class关键字。因此可以为类模板声明友元类了。

class Poly;
typedef Poly P;

class LiLei {
   
   
  friend class Poly; // C++98通过,C++11通过
};
class Jim {
   
   
  friend Poly; // C++98失败,C++11通过
};
class HanMeiMei {
   
   
  friend P; // C++98失败,C++11通过
};

class P;
template <typename T>
class People {
   
   
  friend T;
};

People<P> PP;   // P为People的友元
People<int> Pi; // 对于int类型模板参数,有元声明被忽略

2.10 final/override控制

final关键字:使派生类不可覆盖它所修饰的虚函数

struct Object {
   
   
  virtual void fun() = 0;
};

struct Base : public Object {
   
   
  void fun() final;
};

struct Derive : public Base {
   
   
  void fun(); // 无法通过编译
};

image-20210718005505333

虚函数描述符override:如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码无法通过编译。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值