C++秃头之旅:函数

C++函数分两种有返回值的和没有返回值的。在标准C++函数库中找到这两类函数的例子,也可以自己创建这、两种类型的函数

   

使用返回值的函数:

  • 有返回的值的函数将生成一个值,而这个值可赋给变量或或在其他表达式中使用
  • 在使用函数之前,C ++编译器必须知道函数的参数类型和返回值类型
    • 注意:C++程序应当为程序中使用的每个函数提供原型
  • 函数原型之余函数就像变量声明之于变量——指出涉及的类型
    • 例子:
      • double sqrt(double);
      • 第一个 double 意味着 sqrt() 将返回一个 double 值,括号中的 double 意味着 sqrt() 需要一个 double 参数。因此该原型对 sqrt() 的描述和下面代码中使用的函数相同
        double x;
        
        x = sqrt(6.25);

        注意:原型结尾的分号表明它是一条语句,这使得它是一个函数,而不是函数头。如果省略分号,编译器将吧这行代码解释为一个函数头,并要求接着提供定义函数的函数体

    • 在程序中使用 sqrt()时,也必须提供原型,可以由以下两种方面实现:
      • 在源代码文件中输入函数原型
      • 包含头文件 cmath,其中定义了函数原型
        • 第二种方法更好,因为头文件更有可能使原型正确'
      • 不要混淆函数原型与函数定义,可以看出原型只描述函数接口,而定义中包含了函数的代码;库文件中包含了函数班的编译代码,而头文件中则包含了原型
    • 应在首次使用函数之前提供其原型
      • 下面的程序演示了库函数 sqrt()的用法,它通过包含cmth文件来提供函数的原型
        //使用C++库函数中的sqrt()函数
        
        #include <iostream>
        #include <cmath>
        using namespace std;
        int main() { double area; cout << "请输入一个数,我将为您算出这个数的开平方" << endl; cin >> area; cin.get(); double side; side = sqrt(area); cout << "这个数的开平方为:" << side << endl << "这是一个多么神奇的事情" << endl; cout << "谢谢使用,再见!" << endl;
        cin.
        get(); return 0; }

        程序输出:

        请输入一个数,我将为您算出这个数的开平方

        36

        这个数的开平方为:6

        这是一个多么神奇的事情

        谢谢使用,再见!

函数变体:

  • 有些函数需要多项信息,这些函数使用多个参数,参数间用逗号分开
    • 例如:
      • double pow(double,double)
        answer = pow(5.0,8.0)
  • 另外一些函数不接受任何参数:
    • 例如:
      • int rand(void)
      • 关键字void明确表示,该函数不接受任何参数,如果省略void,在C++中将其解释为一个不接受任何参数的隐式说明,可以这样使用该函数:
      • int rand()
  • 还有一些函数没有返回值
    • 例如:
      • void bucks(double);
      • 由于他不返回值,因此不能将该函数调用放在赋值语句表达式,或没有返回值的
  • 有些语言中没有返回值的函数被称为函数,没有返回值的函数称为过程或子程序;但C++与C一样,这两种变体都被称为函数

   

用户定义的函数

  • 标准C库提供了140多个预定义的函数。如果其中的函数能满足要求,则应使用它们;但当标准库不满足用户需求时,就需要编写自己的函数
  • 对于库函数,在使用之前必须提供其原型,通常把原型放到main()之前。但现在必须提供新函数的源代码,最简单的方法将代码放到mian()的后面
  • 程序示例:
    //定义自己的函数
    
    #include <iostream>
    using namespace std; 
    void simon(int);
    
    int main()
    
    {
            simon(3);
            cout << "pick an integer: ";
            int count;
            cin >> count;
            cin.get();
            simon(count);
            cout << "Done!" << endl;
    cin.
    get(); return 0; } void simon(int n) { //此函数打印一个用户输入的数字 cout << "Simon says touch your toes " << n << " times.<< endl; }

    程序输出:

    Simon says touch your toes 3 times.

    pick an integer: 32

    Simon says touch your toes 32 times.

    Done!

    • main()函数两次调用simon()函数,一次的参数为3,另一次的参数为变量count,存储着用户输入的数字。
    • 函数格式:
      • simon()函数的定义与main()的定义采用的格式相同,首先是函数头,然后是花括号的函数体
      • 注意:C++不允许将函数定义嵌套在另一个函数定义中,每个函数定义都是独立的,所有函数的创建都是平能等的
    • 函数头
      • void simon(int);
      • 开头的void表示simon()函数没有返回值,由于simon()没有返回值,所以不能这样使用它:simple = simon(3);
      • 括号中的int n表示,使用simon()函数,应提供一个Int参数;n是新的变量,函数调用时传递的值将被赋给它。
      • main()的返回值并不是返回给程序的其他部分,而是返回给操作系统
    • 关键字:
      • 关键字是计算机语言的词汇。
      • 本章使用了4个关键字:intvoidreturn、和double,由于这些关键字都是C++专用的,因此不能用作他用

用户定义的有返回值的函数:

  • 程序示例:
    //把石头换成磅
    
    #include <iostream>
    int stonetolb(int);
    int main() { using namespace std; int stone; cout << "Enter the weight in stone :"; cin >> stone; cin.get(); int pounds = stonetolb(stone); cout << stone << " stone = "; cout << pounds << " pounds." << endl; cin.get(); return 0; } int stonetolb(int sts) { //返回一个数值 return 14 * sts; }

    程序输出

    Enter the weight in stone :3

    3 stone = 42 pounds.

  • 程序含义:
    • main()中,程序使用cin来给整型变量stone提供一个值,这个值被作为参数传递给stonetolb()函数。
    • stonetolb()用关键字return14*sts返回给main();这里使用较为复杂的表大式,避免了创建一个新的变量,然后将它返回。
    • 这两个返回的结果相同,但第二个版本更容易理解和修改,因为他将计算和返回给分开了
      int aunt = stonetolb(20);
      
      int ants = aunt + stonetolb(10);
      
      cout << "Ferdie weighs" << stonetolb(16) << " pounds." << endl;
      • 在任何情况下程序都计算返回结果,然后在语句中使用这个值
      • 这些例子表明,函数原型藐视了函数接口,即函数如何与程序的其他部分交互
      • 函数stoletolb() 短小,简单,但包含了函数的全部特性:
        • 有函数头和函数体
        • 接受一个参数
        • 返回一个值
        • 需要一个原型

在多函数程序中使用using编译指令

  • 在之前的程序中,每个函数都包含下面一条using 编译指令:
    using namespace std;

    这是因为每个函数都使用了cout,因此需要能够访问位于名称空间std中的cout定义;但在下面程序中可以采用另一种方法让两个函数访问名称空间std,即将编译指令放在函数外面,且位于两个函数的前面

    //重新定义using指令
    
    #include <iostream>
    using namespace std;
    
    void simon(int);
    
    int main()
    
    {
            simon(3);
    
            cout << "请输入你每天学习的时间: ";
            int count;
            cin >> count;
            cin.get();
            simon(count);
            cout << "再见啦!" << endl;
     
    
            cin.get();
            return 0;
    }
    
       
    
    void simon(int n)
    
    {
            cout << "我每天学习的时间为:" << n << "个小时。" << endl;
    
    }

    程序输出:

    我每天学习的时间为:3个小时。

    请输入你每天学习的时间: 9

    我每天学习的时间为:9个小时。

    再见啦!

  • 总之,让程序能够访问空间 std的方法有多种,下面是其中的4种:
    • using namespace std;放在函数定义之前,让文件中所有的函数都能够使用名称空间std中所有的元素
    • using namespace std;放在特定的函数定义中,让函数能够使用名称空间std中的所有元素
    • 在特定的函数中使用类似using namespace::cout;这样的编译指令,而不是using namespace std;,让该函数能够使用指定的元素,如cout
    • 完全不使用编译指令using,而是在需要使用名称空间std中的元素,使用前缀std::,如下所示:
      • std::cout << "I'm using cout and endl from teh std namespace" << std::endl;

猜你喜欢

转载自www.cnblogs.com/1Q84zj/p/10070212.html