c++11 记录

#include <iostream>
#include <type_traits>
#include <map>
#include <string>
#include <functional>
#include <memory>
struct A{
    int a;
    std::string name;
};
void fun(int)
{
    std::cout << "fuck1" << std::endl;
}
void fun(void *)
{
    std::cout << "fuck2" << std::endl;
}

void func(void)
{
    std::cout << __FUNCTION__ << std::endl;
}

class Foo
{
public:
    Foo(int _age, char *_p) :age(_age), point(_p)
    {

    }
    static int foo_func(int a)
    {
        std::cout << __FUNCTION__ << "(" << a << ") ->: " << std::endl;
        return a;
    }

    int foo_test(int i)
    {
        std::cout << __FUNCTION__ << "(" << i << ") ->: " << std::endl;
        return i;
    }
private:
    int age;
    char *point;
};

class Bar
{
public:
    int operator() (int a)
    {
        std::cout << __FUNCTION__ << "(" << a << ") ->: ";
        return a;
    }
    virtual ~Bar(){}
public:
    int a;
    int b;
};

class C : public Bar
{
private:
    //char ca;
    //sizeof 也包含Bar 的内容 
public:
    int a;
};

void testfunc(std::function<int(int)>& tf, int a)
{
    tf(a);
}
int main() {
    int type = 1000;
    int  var = 1234234;
    std::string strvar = "hello";
    char * buffer = new char[128];
    Foo ge(232323, buffer);
    Foo gee = ge;

    // [lambda 表达式不能直接用外部变量 要将外部变量加入](参数形式){函数体}
    // 外部变量传入方式
    // [=] 传入所有外部变量 但是不能修改
    // [&] 传入所有外部变量的引用 可以对其进行修改
    // [=, &var] var 可以修改 其他都不能修改
    // [var, &] var 不可以修改 其他都可以修改
    [type](int a){std::cout << a << type << std::endl; }(12334);
    auto lam = [&](int a, std::string b){
        type = 123;
        std::cout << a + type << std::endl;
        std::cout << b << std::endl;
    };
    lam(456, "helloworld");
    // 可以使用 -> std::string 指定返回值得类型
    auto lam2 = [=, &strvar](std::string app) -> std::string {
        std::cout << type << " " << var << std::endl;
        strvar.append(app);
        std::cout << strvar << std::endl;
        return strvar;
    };
    auto tt = lam2("magegegegeghehehehe");
    std::cout << "tt:------->" << tt << std::endl;
    // 类似于函数指针 但是书写方便
    std::function<void(void)> functemp = func;
    void(*funpoint)() = func;
    functemp();
    funpoint();
    std::function<int(int)> foofunc = Foo::foo_func;
    foofunc(12);
    Foo f(12, 0);
    //延迟使用对象中的方法
    std::function<int(int)> footest = std::bind(&Foo::foo_test, &f, std::placeholders::_1);
    //footest();
    testfunc(footest, 288888883);
    //int(*footempfunc)(int) = &Foo::foo_func;
    //footempfunc(123);
    //NULL 和 nullptr 不同在于 NULL 其实就是宏变量0   nullptr 是指空指针
    fun(nullptr);
    std::map<int, int> imap;
    imap[0] = 12;
    imap[2] = 234;
    struct A b = { 23, "testhello" };
    // 让编译器自动推导参数类型
    auto hh = b;
    auto temp = imap;
    auto x = 1;
    auto y = 2;
    
    decltype(x + y) z = 3;
    //获取参数类型decltype
    if (std::is_same<decltype(temp), std::map<int, int> >::value)
    {
        std::cout << "temp = std::map<int, int>" << std::endl;
    }
    if (std::is_same<decltype(hh), struct A>::value)
        std::cout << "hh is struct A" << std::endl;
    if (std::is_same<decltype(x), int>::value)
        std::cout << "type x == int" << std::endl;
    if (std::is_same<decltype(x), float>::value)
        std::cout << "type z == float" << std::endl;
    if (std::is_same<decltype(x), decltype(z)>::value)
        std::cout << "type z == type x" << std::endl;
    Bar bt2;
    C aa;
    Bar * btemp = new Bar();
    int a = 1000;
    // 可以是内置类型的转换 编译期间类型检查
    char c = static_cast<char>(a);
    C * ctemp = static_cast<C*>(btemp);
    // 运行时期类型检查 为了提供RTTI﹐C++ 就将在VFT 中附加个指针﹐指向typeinfo对象﹐这对象内含RTTI资料. 
    //由于该类所实例化之各对象﹐皆含有个指针指向VFT 表﹐因之各对象皆可取出typeinfo对象而得到RTTI
    C * ct2 = dynamic_cast<C*>(btemp);
    std::cout << c << std::endl;
    //dynamic_cast 不可以是内置类型转换  只能是类或者void * 类型的指针或者引用
    std::cout <<"Bar size :"<<sizeof(Bar) << std::endl;
    std::cout << "C size :" << sizeof(C) << std::endl;
    return 0;
}

 

posted on 2018-04-23 13:14  沐浴凌风  阅读(187)  评论(0编辑  收藏  举报

导航