zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    oracle空表导出的问题
    虚拟机连不上网
    mongodb查询返回内嵌符合条件的文档
    gson转换带有objectId的问题
    java部署项目,ip访问不到,localhost能访问到,浏览器启用了代理的问题
    mongodb replica set(副本集)设置步骤
    a different object with the same identifier value was already associat
    头文件.h的应用以及fortran和c的混合编程
    Matlab符号运算总结
    fortran自由格式每行最多编写132个字符
  • 原文地址:https://www.cnblogs.com/MaAce/p/8918251.html
Copyright © 2011-2022 走看看