C++学习笔记——C++11


第一部分 语言


P1 演进、环境与资源

  • C++11
    • 语言
    • 标准库:头文件不带 .h
/**
 * 检测C++版本
 * 
 * g++ p1.cpp -o output/app && output/app
 */

#include <iostream>
using namespace std;

int main()
{
   
    cout << __cplusplus << endl; // C++版本
    return 0;
}

P2 Variadic Templates

/**
 * Variadic Templates,数量不定的模板参数
 * 
 * g++ p2.cpp -o output/app && output/app
 */

#include <iostream>
using namespace std;

void print() {
   } //最终调用

template <typename T, typename... Types>         // ...
void print(const T &arg1, const Types &... args) // ...
{
   
    cout << "Size of args: " << sizeof...(args) << " | " << arg1 << endl;
    print(args...); // ...
}

template <typename... Types>
void print(const Types &... args) //共存,更泛化的版本
{
   
    cout << "void print(const Types &... args)" << endl;
}

int main()
{
   
    print(1, 2.3, '4', "567");
    return 0;
}

Variadic Templates

P3 Spaces in Template Expressions,nullptr and std::nullptr_t,automatic type deduction

/**
 * g++ p3.cpp -o output/app && output/app
 */

#include <iostream>
#include <vector>
using namespace std;

void f(int)
{
   
    cout << "void f(int);" << endl;
}
void f(void *)
{
   
    cout << "void f(void*);" << endl;
}

int g()
{
   
    return 10;
}

int main()
{
   
    // Spaces in Template Expressions
    vector<vector<int> > a;//旧版
    vector<vector<int>> b; //新版

    // nullptr and std::nullptr_t
    f(0); //void f(int);

    // f(NULL); //NULL的定义是0,同时符合f(int)和f(void*),编译不通过:error: call of overloaded ‘f(NULL)’ is ambiguous

    f(nullptr); //void f(void*); nullptr的类型是std::nullptr_t

    // auto,自动推导类型,类型特别长才会用
    auto i = 10;
    auto j = g();
    auto k = [](int x) -> int {
    //lambda
        x *= 10;
        return x + 1;
    };
    cout << k(10) << endl;
    return 0;
}

P4 Uniform Initialization

/**
 * Uniform Initialization:一致性初始化
 * 
 * g++ p4.cpp -o output/app && output/app
 */

#include <iostream>
#include <vector>
#include <complex>
#include <string>
using namespace std;

int main()
{
   
    // 一致性初始化
    // 编译器将{t1,t2,...,tn}做出一个initializer_list<T>,关联至一个array<T,n>
    int values[]{
   1, 2, 3};
    int a = 4, b = 5, d{
   6};
    //STL容器都有一个参数为initializer_list<T>的构造函数
    vector<int> v{
   2, 3, a, b, d};
    vector<string> ss{
   "123", "456", "789"};
    complex<double> c{
   4.0, 3.0};//array<double,2>中的元素会被分解之后传给comlex的构造函数
    return 0;
}

P5、P6 initializer_list

/**
 * Initializer list
 * 
 * g++ p5_p6.cpp -o output/app && output/app
 */

#include <iostream>
#include <vector>
#include <array>
#include <complex>
#include <string>
using namespace std;

template <typename T>
void print(initializer_list<T> vals)
{
   
    cout << vals.size() << " : ";
    for (auto p = vals.begin(); p != vals.end(); p++)
    {
   
        cout << *p << " ";
    }
    cout << endl;
}

void print(initializer_list<int> vals)
{
   
    cout << vals.size() << " : ";
    for (auto p = vals.begin(); p != vals.end(); p++)
    {
   
        cout << *p << " ";
    }
    cout << endl;
}

void print(initializer_list<int> vals, initializer_list<double> ds)
{
   
    cout << vals.size() + ds.size() << " : ";
    for (auto p = vals.begin(); p != vals.end(); p++)
    {
   
        cout << *p << " ";
    }
    for (auto p = ds.begin(); p != ds.end(); p++)
    {
   
        cout << *p << " ";
    
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值