C++ 不是 C 的一个超集:C++ 11 特性

这是很久之前的笔记,整理发出来并加了一点更新。

虽然C程序能用C++编译器编译,但是严格来说,C++ 不是 C 的一个超集。《为什么说C++不是C的超集? - 知乎》 这里有网友的解答,不再赘述。

C 和 C++ 混合使用的例子

// foo.h
#ifdef __cplusplus
extern "C" {
#endif

int add(int x, int y);

#ifdef __cplusplus
}
#endif

// foo.c
int add(int x, int y) {
    return x+y;
}

// main.cpp
#include "foo.h"
int main() {
    add(1, 2);
    return 0;
}

编译的命令是

gcc -c foo.c
g++ main.cpp foo.o -o main

C++ 中的 C++ 11 特性

一份个人的笔记,不是完整版,仅供参考

  • C++11 引入了 nullptr 关键字,专门用来区分空指针、0。nullptr 的类型为 nullptr_t

  • constexpr是限定了修饰的为编译期间可确定的常量,但是constexpr也是可以用于函数的,

constexpr int fibonacci(const int n) {
    return n == 1 || n == 2 ? 1 : fibonacci(n-1)+fibonacci(n-2);
}

Clang在处理constexpr时,在编译期间用一个C++的计算器计算constexpr的值,并且记录计算的次数。当次数超过一定值时,这个constexpr退化为非constexpr。

  • 使用 auto 进行类型推导的一个最为常见而且显著的例子就是迭代器。
    for(vector<int>::const_iterator itr = vec.cbegin(); itr != vec.cend(); ++itr)
    for(auto itr = vec.cbegin(); itr != vec.cend(); ++itr)
    auto不能用于函数传参,因此下面的做法是无法通过编译的(考虑重载的问题,我们应该使用模板),auto 还不能用于推导数组类型:int arr[10] = {0},auto a[10] = arr
int array[] = {1,2,3,4,5};
for(auto &x : array) {
    std::cout << x << std::endl;
}
//& 启用了引用, 如果没有则对 arr 中的元素只能读取不能修改,不加却又修改不会报错。
  • decltype 声明某种类型
auto x = 1;
auto y = 2;
decltype(x+y) z;

尾置返回允许我们我们在参数列表后声明返回类型

template<T>
auto f(T a,T b) -> decltype(*a)
{
  return *a;
}
  • int a[3] = {1,2,3} 列表初始化
struct A {
    int a;
    float b;
};
struct B {

    B(int _a, float _b): a(_a), b(_b) {}
private:
    int a;
    float b;
};
A a {1, 1.1};    // 统一的初始化语法
B b {2, 2.2};
  • std::initializer_list,允许构造函数或其他函数像参数一样使用初始化列表,
#include <iostream>
#include <initializer_list>

using namespace std;

int f(initializer_list<int> list)
{
    int ans = 0;
    for(auto i : list)
        ans += i;
    return ans;
}
cout<<f({1,2,3});
  • C++11 开始,连续的右尖括号将变得合法,并且能够顺利通过编译。
typedef int (*process)(void *);  //
定义了一个返回类型为 int,参数为 void* 的函数指针类型,名字叫做 process
using process = int(*)(void *);
// 同上, 更加直观
template <typename T>
using NewType = SuckType<int, T, 1>; // 合法
  • 默认模板参数
template<typename T=int, typename U=int>
auto add(T x, U y) {
    return x+y;
}
  • 委托构造
class Base {
public:
    int v1,v2;
    Base() {
        v1 = 1;
    }
    Base(int value) : Base()  {  //成员初始化列表 委托 Base() 构造函数
        v2 = 2;
    }
    Base(int value) {  // 委托 Base() 构造函数
        Base();
        v2 = 2;
    }
};
  • 继承构造
class Test : public Base{
    public:
    test() {
        using Base::Base; // 继承构造
    }
}
  • 引入 override 关键字将显式的告知编译器进行重载,编译器将检查基函数是否存在这样的虚函数,否则将无法通过编译:
struct Base {
    virtual void foo(int);
};
struct SubClass: Base {
    virtual void foo(int) override; // 合法
    virtual void foo(float) override; // 非法, 父类没有此虚函数
};

final 则是为了防止类被继续继承以及终止虚函数继续重载引入的。

struct Base {
        virtual void foo() final;
};
struct SubClass1 final: Base {
};                  // 合法

struct SubClass2 : SubClass1 {
};                  // 非法, SubClass 已 final

struct SubClass3: Base {
        void foo(); // 非法, foo 已 final
};
  • 枚举类 此处默认 unsigned int , 未指定时将默认使用 int
enum class new_enum : unsigned int {
    value1,
    value2,
    value3 = 100,
    value4 = 100
};
  • 捕获错误
try{
  //
}catch(runtime_error e) {
  cout<<e.what()<<endl;
}

来自个人 C++ 文集

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容