c++的一些杂项

/**
    cwl:
    内容:c++非面向对象的一些杂项总结
        1, c++转换函数

*/

#include <bits/stdc++.h>

using namespace std;

class Fraction
{
public:
    Fraction(int num, int den = 1)
        :m_numberator(num), m_denominator(den) {}
    operator double() const {
        return (double)((m_numberator * 1.0) / m_denominator);
    }

    Fraction operator + (const Fraction &f) {
        ///...
        return Fraction(0);
    }

private:
    int m_numberator;   ///分子
    int m_denominator;  ///分母
};

template<typename T>
void show(const T& firstArg)
{
    cout << firstArg << endl;
}

template<typename T, typename... Types>
void show(const T& firstArg, const Types&... args)
{
    cout << firstArg << endl;
    show(args...);
}

class A
{
public:
    void show() { cout << "A" << endl; }
};

class B: public A
{
public:
    void show() { cout << "B" << endl; }
};

int main()
{
    ///【1】转换函数
    Fraction a = 3;
    printf("%f\n", (double)a);
    /**
    operator double() const {
        return (double)((m_numberator * 1.0) / m_denominator);
    }
    */

    ///【2】
    /**
    explicit Fraction(int num, int den = 1)
        :m_numberator(num), m_denominator(den) {}
    explicit避免构造函数在这个部分隐式转换
    */

    ///【3】智能指针,一个像指针的类
    /**

    【第一类智能指针】
        template<class T>
        class Shared_ptr
        {
        public:
            T& operator*() const
            { return *px; }

            T& operator->() const
            { return px; }

            Shared_ptr(T* p):px(p) {}

        private:
            T* px;
            long *pn;
        };
        //注意这里为了清晰度没有写delete部分
        //    Shared_ptr<int>p = new int;
        //    *p = 1;

     【第二类迭代器】
        对指针重载++ --

    */

    /**
        【4】仿函数
        设计一个类,行为像函数,重载()即可
        class Test {

            void operator () () {
                ///...
            }
        }
    */

    /**
        【5】
        模板可变参数

        template<typename T>
        void show(const T& firstArg)
        {
            cout << firstArg << endl;
        }

        template<typename T, typename... Types>
        void show(const T& firstArg, const Types&... args)
        {
            cout << firstArg << endl;
            show(args...);
        }
    */
    ///show(1, 3, 4, 5);

    /**
        因为泛型的原因c++11重写定义了auto。动态绑定类型

        另一中拆包方式

        // 编译这个代码需要开启 -std=c++14
        // 因为版本原因,实验环境中的 g++ 尚不支持此特性,此处可以使用 clang++ 替代 g++
        template<typename T, typename... Args>
        auto print(T value, Args... args) {
            std::cout << value << std::endl;
            return std::initializer_list<T>{([&] {
                std::cout << args << std::endl;
            }(), value)...};
        }
        int main() {
            print(1, 2.1, "123");
            return 0;
        }

    */

    ///【5】子类调用父类函数
    B class_b;
    class_b.A::show();  ///子类中调用父类方法


    return 0;
}
posted @ 2019-02-15 23:44  Q1143316492  阅读(178)  评论(0编辑  收藏  举报