zoukankan      html  css  js  c++  java
  • C++primer函数汇总

    #include<iostream>
    #include <vector>
    #include <initializer_list>
    #include <string>
    #include<cstdarg>
    using namespace std;
    typedef int arrT[10];//类型别名
    using arrT = int[10];//等价声明
    arrT* funlc(int i);//数组指针
    
    
    
    int fact(int val)//阶乘
    {
        int ret = 1;
        while (val>1)
            ret *= val--;
        return ret;
    }
    
    
    size_t count_calls()//返回自身被调用的次数
    {
        static size_t ctr = 0;
        return ++ctr;
    }
    
    
    
    void print(vector<int >::const_iterator beg,
        vector<int>::const_iterator end);//在头文件中进行函数声明
    
    
    
    void reset(int &i)
    {
        i = 0;//对于引用类似于指针,不同于副本机制;使用引用避免拷贝;节约空间操作
    }
    
    
    
    bool isShorter(const string&s1, const string &s2)//对于这里,如果函数无需改变引用形参的值,最好将其声明为常量引用;
    {
        return s1.size() > s2.size();//比较两串字符串是否相等
    }
    
    
    
    string::size_type find_char(const string &s, char c, string::size_type &occurs)
    {//对于一次性想返回好几个数据的人,要么重新定义数据结构,要么添加一个隐式参数
        auto ret = s.size();
        occurs = 0;
        for (decltype(ret) i = 0; i != s.size(); ++i)
        {
            if (s[i] == c)
            {
                if (ret == s.size())
                    ret = i;
                ++occurs;
            }
        }
        return ret;
    }
    
    
    
    void func(const int i)//func 能读取i,但是不能向i写值,const定义
    {
    }
    
    
    void funcc(int i )//i)//error C2084: 函数“void func(const int)”已有主体;参见“func”的前一个定义
    {//这句话是错误的,在这里就是为了体现这些区别
    
    }
    
    
    
    //对于指针和引用形参用const 修饰
    
    int i = 42;
    const int *cp = &i;
    const int &r = i;
    const int &r2 = 42;
    //int *p = cp;类型不同,int &r3=r;int &r4=42;//非常量引用
    bool is_sentence(const string&s)
    {
        string::size_type ctr = 0;//检测s字符串是否为一个句子
        return find_char(s, '.', ctr) == s.size() - 1 && ctr == 1;
    }
    bool is_enpty(string&s)
    {
        return s.empty();
    }
    
    
    
    //管理指针常用的三种技术
    //1.使用标记指定数组长度
    void print(const char *cp)
    {               while (*cp)//每一个字符串中结束符为/0作为判断判断结束符为空;
                cout << *cp++;
    }//适用于有结束符标识字符串,对于整形之类数组,基本无效;
    
    
    //2.使用标准库规范即利用容器
    void print(const int *beg, const int *end)
    {
        while (beg!= end)
            cout << *beg++ << endl;
    }//标准库函数begin()和end();
    
    
    //3.显式传递一个数组大小的形参
    void print(const int ia[], size_t size)
    {
        for (size_t i = 0; i != size;i++)
        {
            cout << ia[i] << endl;
    
        }
    }
    
    
    void print(int (&arr)[10])//&arr左右的括号必不可少;不加括号是指将arr声明为引用的数组;
    //加后为具有10个整型数组的引用
    {
        for (auto elem:arr)
        {
            cout << elem << endl;
        }
    }
    
    void print(int (*matrix)[10],int Rowsize);
    //int (*matrix)[10], int Rowsize);具有是个整形的数组指针
    //int *matrix[10]不同,10个指针组成的数组;
    
    
    initializer_list<int>lii;
    initializer_list<string>ls;
    void error_msg(initializer_list<string> li)
    {
        for (auto beg = li.begin(); beg != li.end();++beg)
        {
            cout<<*beg<<endl;//少了string头文件
        }
    }//若向initializer_list形参中传递一个值的序列必须放在一对花括号中;
    
    //void error_msg(ErrCode e, initializer_list<string>li);ErrCode 可能有个这个异常类;
    //{
    //  cout << e.msg() << ":";
    //  for (const auto &elem : li)
    //      cout << elem << " ";
    //  cout << endl;
    //}
    void foo(...);
    void foo(int ,int, ...);//parm_list 参数列表
    void swap(int &v1, int&v2)
    {
        if (v1 == v2)
            return;
        int tmp = v2;
        v2 = v1;
        v1 = tmp;
        //return 0;错误,产生
    }//交换函数;
    
    
    
    
    bool str_subrange(const string &s1, const string &s2)
    {
        if (s1.size() == s2.size())
            return s1 == s2;
        auto size = (s1.size() < s2.size() ? s1.size() : s2.size());
        for (decltype(size) i = 0; i != size; ++i)
        {
            if (s1[i] != s2[i])
                return true;//return 直接错误
            //warning C4715: “str_subrange”: 不是所有的控件路径都返回值此处应该有return
            //在含有return的for循环语句外面也应该有一条return;如果没有则该程序错误,很多编译器无法识别这个错误;
        }
        return true;//Vs2013的编译器可以识别这个错误
    }
        string make_plural(size_t ctr,const string &word,const string&ending)
        {
            return (ctr > 1) ? word + ending : word;//返回值 返回一个临时对象
        }
        vector<string>process(string expected,string actual)
        {
            if (expected.empty())//花括号返回值是c++11中新添加的属性测试
            {
                return{};
            }
            else if (expected == actual)
                return{ "functionX", "OKEY" };
            else
                return{ "Function", expected, actual };
        }
    
    
        int  factorial(int val)//阶乘的递归算法
        {
            if (val > 1)
                return factorial(val - 1)*val;
            return 1;
        }
    
        int print(vector<int >&li,int i=0)//递归输出vector中的值
        {
    
            if (i==li.size())
                return 0;
            cout << li[i++] <<" ";
            print(li, i);
    
        }
    
        auto  function(int i)->int(*)[10];//尾随的返回类型需要auto
        //使用decltype
        int odd[] = { 1, 3, 5, 7, 9 };
        int even[] = { 2, 5, 346, 7, 3};
        decltype(odd)*arrptr(int i)//指向一个指向数组的指针而且两个数组维度必须相同
        {
            return (i % 2) ? &odd : &even;
        }
        //////////////////////////////////////////////////////////////////////////
    
    
        //函数重载
        //////////////////////////////////////////////////////////////////////////
        //main函数不能重载
    
    
        //Record  lookup(const phone&);事实证明,Record是别名,让读者轻易知道什么意思,属于自然描述语言,伪代码
        //Screen&moveHome();同上
    
    
    
    
        /////////////////////////////////////////////////////////////////////////
        //const_cast在重载中最有用
        const string &shorterString(const string &s1, const string &s2)
        {
            cout << "调用 const string &" << endl;
            return s1.size() <= s2.size() ? s1 : s2;//返回类型都是引用
        }
        string &shorterString(string &s1, string &s2)
        {
            cout << "调用 string &2" << endl;
            auto &r = shorterString((const_cast<const string&>(s1)), (const_cast<const string &>(s2)));
            return const_cast<string &>(r);//为了安全
        }
        //////////////////////////////////////////////////////////////////////////
        //特殊用途语言特性
    
        typedef string::size_type sz;
        string screen(sz ht = 24, sz wid = 80, char background = ' ');
        //string screen(sz ht,sz wid, char background = ' ');//不能修改默认实参,在实参已经声明过的函数中
        string screen(sz ht,sz wid, char background );
    //  constexpr int new_sz(){ return 43; };vs2013默认不支持constexpr关键字
        //////////////////////////////////////////////////////////////////////////
        //调试帮助
        //////////////////////////////////////////////////////////////////////////
        //两项预处理宏  assert和NDEBUG;
        void printl(const int ia[], size_t size)
        {
            #ifndef  NDEBUG
            //vs2013做了优化 __FUNCTION__存放函数的名字而不是__FUNC__
            cerr << __FUNCTION__ << "array size is" << size << endl;
            #endif
        }
        //////////////////////////////////////////////////////////////////////////
        ///调用重载函数时,应该尽量避免强制类型转换。如果在实际应用中确实需要强制类型转换,这说明我们设计的形参集合不合理。
        //////////////////////////////////////////////////////////////////////////
    
        //函数指针
        bool lengthCompare(const string &, const string &);
        bool(*pf)(const string &, const string &);//pf是函数指针,指向这个函数的指针。
        bool *plf(const string &, const string &);//返回一个为bool指针的的函数。
        void ff(int *);
        void ff(unsigned int);
        void(*pf1)(unsigned int) = ff;//需要形参类型返回类型精确匹配才可以使用
        void useBigger(const string &s1, const string &s2, bool pf(const string&, const string &));//隐式的将pf转换为函数指针(*pf)
        typedef decltype(lengthCompare) Func2;//decltype 的返回类型为函数类型并不是指针类型。所以函数func这 为函数类型但是在其他函数调用时,编译器会自动将其转换为指针类型;
        typedef bool func1(const string&, const string &);
    
        //////////////////////////////////////////////////////////////////////////
        typedef decltype(lengthCompare) *Funcp2;//编译器会自动将函数名转换为指针名 funcp 是函数指针类型
        typedef bool *funcp1(const string&, const string &);
    
    
    
        int main(int argc,char **argv)
        {
            string window;
            //  window = screen();//赋值语句不能放在主函数外面
            //  window = screen(66);//必须要有函数实现体
            //  window = screen(66, 77);//后续默认实参填补空余位置,默认只能省略尾部实参,头部不可以直接省略填写尾部形参
            //  window = screen(88, 99, 'f');
            const string s1 = "hello";
            const string s2 = "world";
            string s3, s4;
    
            //cin >> s3 >> s4;
            shorterString(s1, s2);
            shorterString(s3, s4);
            vector<int>ceshi = { 1, 2, 3, 4, 5, 6, 6, 7, 5};
            print(ceshi);
            string s = "afadgsd";
            string ls1 = "asfdfgxbfghe";
            process(s,ls1);
    
            int j[] = { 2, 1, 3 };
            printl(j, 3);
            print(begin(j), end(j));//2
            print(j, end(j) - begin(j));//3
    
            //is_enpty(j);
            //return 0;
            system("pause");
    }
  • 相关阅读:
    CMD指令
    六种Socket I/O模型幽默讲解
    性格与职业的选择
    为什么主引导记录的内存地址是0x7C00?
    pandas数据分析第二天
    pandas数据结构和介绍第一天
    tornado options
    tornado.web.StaticFileHandler
    mysql多条更新
    pandas
  • 原文地址:https://www.cnblogs.com/VCctor/p/5100701.html
Copyright © 2011-2022 走看看