zoukankan      html  css  js  c++  java
  • 【面试攻略】C++面试-C++11

    发现这个经常被问到,恰好我工作中C++11用得不多。。。

    1.Initiallizer list
    2.auto type 大爱
    3.foreach 写c++像是再写c# https://blog.csdn.net/wlk1229/article/details/54668442
    4.nullptr 代替了c++ 03的NULL
    5.enum class代替了c++03的enum,更安全
    6.override关键标识 for virtual function (更加安全,直观 )
    7.final关键标识 ,主要是class 及virtual function  https://blog.csdn.net/x356982611/article/details/50925105
    8.关键字default标识, compiler generated default constructor
    9.关键标识 delete ,放在函数后面,表示函数不能被调用
    10.lambda function, 让编程更优雅
    11.smart pointer 智能指针
    12.tuple元祖
    13.Rvalue Reference
    14.Perfect Forwarding

    Initiallizer list
        //c++03
        std::vector<int> v;
        v.push_back(2);
        v.push_back(3);
        //c++ 11
        std::vector<int> v{ 1,2,3 };
        
    2. auto type 大爱

    std::vector<int> vec = { 1,2,3,4 };
        //c++ 03
        for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
            std::cout << *it << std::endl;
        }

        //c++ 11
        for (auto it = vec.begin(); it != vec.end(); it++) {
            std::cout << *it << std::endl;
        }
        auto a = 3 + 2;
        auto s = "123";
        
    3. foreach 写c++像是再写c#

    std::vector<int> vec = { 1,2,3,4 };
        //c++ 03
        for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
            std::cout << *it << std::endl;
        }

        //c++ 11
        //read only(只读)
        for (auto i : vec) {
            std::cout << i << std::endl;
        }
            //只读
            for (const auto& i : vec) {
            std::cout << i << std::endl;
        }
        //changes the values in v(修改)
        for (auto& i : vec) {
            i = 3;
        }
        
    4. nullptr 代替了c++ 03的NULL

    5. enum class代替了c++03的enum,更安全

            //c++ 03
        enum ship {
            bulkship,
            tankership
        };

        //c++ 11
        enum class ship1 {
            bulkship,
            tankership
        };
        
    6. override关键标识 for virtual function (更加安全,直观 )

    class base {
    public:
        virtual void fun1(int);
        virtual void fun2() const;
        void fun3(int);
    };

    class son :public base {
        //c++ 03 存在隐患
        /*
        void fun1(float);  //不小心写错了参数,ok 编译通过,create a new func
        void fun2();       //不小心少写了const,ok 编译通过,create a new func
        void fun3();
        */

        // but in c++ 11 更安全清晰
        void fun1(float) override; //编译Error: no func to override
        void fun2() override;      //编译Error: no func to override
        void fun3() override;      //编译Error: no func to override            
    };

    7. final关键标识 ,主要是class 及virtual function

    //this is means no class can be derived from CPoint2D
    class CPoint2D final {
        //No class can override Draw
        virtual void Draw() final;
    };
    8. 关键字default标识, compiler generated default constructor

    强制编译器生成默认构造函数

    编译器不再生成默认构造函数
    class CPoint2D {
    public:
        CPoint2D(double x_,double y_) {
            x = x_;
            y = y_;
        }
        double x;
        double y;
    };

    int main(){    
        CPoint2D pt;//编译报错,不存在默认构造函数,因为编译器不再生成    
    }
    通过default force compiler to generate the default constructor
    class CPoint2D {
    public:
        CPoint2D(double x_,double y_) {
            x = x_;
            y = y_;
        }
        CPoint2D() = default;//告诉编译器强制生成
        double x;
        double y;
    };

    int main(){    
        CPoint2D pt;//ok    
    }

    9. 关键标识 delete ,放在函数后面,表示函数不能被调用

    看以前的情形,构造函数只接受int,但是输入double也是可以的,因为会自动转换
    class dog {
    public:
        dog(int age_) {
            age = age_;
        }
        int age;
    };

    int main(){    
        dog(2);   //ok
        dog(4.5); //also ok,converted form double to int
    }
    c++ 11 解决方案
    class dog {
    public:
        dog(int age_) {
            age = age_;
        }
        dog(double) = delete;
        int age;
    };

    int main(){    
        dog(2);   //ok
        dog(4.5); //not ok,已经删除的函数
    }

    10. lambda function, 让编程更优雅

    像c#一样优雅起来

    int main(){    
        std::cout << [](int x, int y) {return x + y; }(3, 5) << std::endl;
    }
    我经常使用std::sort对结构体配合Lammda匿名函数使用,比如点的数组按照x升序排列

    class CPoint2D {
    public:
        CPoint2D(double x1,double y1) {
            x = x1; y = y1;
        }
        double x;
        double y;
    };
    int main(){

        std::vector<CPoint2D> Pts{ {1,1},{3,3},{2,2} };
        std::sort(begin(Pts), end(Pts), [](const CPoint2D& pt1, const CPoint2D& pt2) {
            return  pt1.x < pt2.x;
            });
    }
    11.smart pointer 智能指针

    终于从内存的泥潭中解放出来了,参考我的另外一篇文章

    刘春雷:C++ 智能指针

    zhuanlan.zhihu.com
    图标
    12. tuple元祖

    std::pair<std::string,int>的扩展版,可以当做一个通用的结构体来使用
    tuple某些情况下会让代码的易读性变差
    什么情况下使用tuple
    std::pair<>的扩展版,可多个参数

        std::pair<int, std::string> p = std::make_pair(2, "hello");
        //std::pair的扩展版
        std::tuple<int, std::string, char> t(2,"foo",'a');
        auto t1 = std::make_tuple(0, "dog", 'b');
        std::cout << std::get<0>(t) << std::endl;
        std::cout << std::get<1>(t) << std::endl;
        std::cout << std::get<2>(t) << std::endl;
    易读性会变差(一个使用结构体,一个使用tuple)

    结构体比较清晰 p1.name p1.age

    tuple易读性差,通过 std::get<0>(t2) std::get<1>(t2)取值

    你会想what stored in position 0&what stored in position 1?

        struct person {
            std::string name;
            int age;
        };
        person p1;
        std::tuple<std::string, int> t2;

        //把上面的代码遮挡起来 tuple会导致代码的易读性降低
        std::cout << p1.name << p1.age<<std::endl;
        std::cout << std::get<0>(t2) << std::get<1>(t2) << std::endl;
        //what stored in position 0?  what stored in position 1?
    when to use tuple

    (1) As a one-time only structure to transfer g group of data 比如作为函数的返回值使用,这样就不用声明结构体了

    std::tuple<std::string,int> GetNameAge(){
        return std::make_tuple("lcl", 20);
    }
    (2)comparison of tuples

    //hours, minutes, seconds

        //comparison of tuples
        std::tuple<int, int, int> time1, time2;  
        if (time1 > time2) {
            //...
        }
    (3)Muti index map

    std::map<std::tuple<int, char, double>, float> m;


    原文地址:https://zhuanlan.zhihu.com/p/102419965?utm_source=qq


     

  • 相关阅读:
    【leetcode】1562. Find Latest Group of Size M
    【leetcode】1561. Maximum Number of Coins You Can Get
    【leetcode】1560. Most Visited Sector in a Circular Track
    Python中用format函数格式化字符串的用法
    机器学习最常用优化之一——梯度下降优化算法综述
    python学习之argparse模块
    Ubuntu14.04安装NVIDIA显卡驱动
    Anaconda使用教程
    TensorFlow0.8代码目录结构讲解
    cmake编译opencv程序
  • 原文地址:https://www.cnblogs.com/byfei/p/14104081.html
Copyright © 2011-2022 走看看