zoukankan      html  css  js  c++  java
  • 【c++ primer, 5e】返回类型和return语句

    【无返回值函数】

    1、在c++的void函数中,可以显式地使用return;语句来提前结束函数的调用。

    【有返回值函数】

    1、值是如何被返回的:返回一个值的方式和初始化一个变量或者形参的方式完全一样。

    2、不要返回局部对象的引用或指针。

    3、返回类类型的函数和调用运算符:调用运算符的优先级和点运算符、箭头运算符相同,且满足左结合律。

    4、引用返回左值!其他返回类型得到右值,具体而言:

    char &get_val(string &str, string::size_type ix)
    {
        return str[ix];
    }

    虽然看上去有点奇怪,但却是合法的:

    get_val(s, 0) = 'A';

    5、列表初始化返回值。例子:

    vector<string> f()
    {
        // codes
        return {s1, s2, s3, ...};
    }

    (可以和可变参数的函数配合使用。)

    6、主函数main的返回值。
    返回0表示执行成功,返回非0表示执行失败,在cstdlib中定义了两个预处理变量表示成功和失败。

    7、递归。没什么好说的,记住:一定有某一条路径是不包含递归调用的!

    6.30

    #include <string>
    using namespace std;
    bool str_subrange(const string &str1, const string &str2)
    {
        if (str1.size() == str2.size())
            return str1 == str2;
        auto size = (str1.size() < str2.size())
                    ? str1.size() : str2.size();
        for (decltype(size) i = 0; i != size; ++i) {
            if (str1[i] != str2[i])
                return;
        }
    }
    prog1.cpp: In function 'bool str_subrange(const string&, const string&)':
    prog1.cpp:11:4: error: return-statement with no value, in function returning 'bool' [-fpermissive]
        return;

    如果补上合适的返回值编译器不报错,证明编译器没有检查出“在循环后面漏了一个return”这个错误!同时也证明了源代码能通过编译器,并不等同于程序没有问题,就算程序能正确运行,也可能存在一些没有暴露出来的问题。

    6.31

    当引用局部对象、局部常量的时候,返回的引用、常量引用无效。

    6.32

     从运行结果来看是合法的,功能略。

    #include <iostream>
    using namespace std;
    int &get(int *arry, int index) 
    {
        return arry[index];
    }
    int main()
    {
        int ia[10];
        for (int i = 0; i != 10; ++i) {
            get(ia, i) = i;
        }
        for (auto x : ia) {
            cout << x << endl;
        }
        return 0;
    }

     

    6.3

    #include <iostream>
    #include <vector>
    using namespace std;
    void vectorPrinter(vector<int>::iterator beg, vector<int>::iterator end)
    {
        if (beg != end) {
            cout << *beg << endl;
            vectorPrinter(beg+1, end);
            return;
        } else
            return;
    }
    int main()
    {
        vector<int> ivec = {1, 2, 3, 4, 5};
        vectorPrinter(begin(ivec), end(ivec));
        return 0;
    }    

    6.34

    结果是不会错,但是会多做一次乘法运算。

    6.35

    逻辑上有错,--val倒是可以试一下,但是这样的话势必会影响乘号右侧运算对象的值,没有正确结果。

    【返回数组指针】


    这一小节看不懂。

    1、使用类型别名。

    using arrT = int[10];
    arrT* func()

    2、使用尾置返回类型。

    auto func(int i) -> int(*)[10]

    3、使用decltype。

  • 相关阅读:
    使用数据库时注意单引号、双引号和反引号的区别
    Mysql中的事件
    C#使用WindowsMediaPlayer实现视频播放
    Chart控件,鼠标选择区域,可以局部放大缩小
    C#自定义控件在添加引用后不显示在工具箱的解决方法(转)
    C# 中的#if、#elif、#else、#endif等条件编译符号
    若有派生类,则基类中的析构函数要用虚函数
    迭代器失效
    this指针
    VS调试快捷键
  • 原文地址:https://www.cnblogs.com/xkxf/p/6603443.html
Copyright © 2011-2022 走看看