zoukankan      html  css  js  c++  java
  • 【C++ primer】第七章 函数C++的编程模块

    1,函数的基本知识

           C++对于返回值的类型有一定的限制:不能是数组,但可以使其他任何类型,甚至可以使结构和对象。

           有趣的是,虽然数组不可以作为返回对象,但是数组可以作为结构或对象组成部分来返回。

    2,函数参数和按值传递

           cin.get();//读取所有输入的字符,包括空格和换行符。

           cin>> ;//跳过空格和换行符读取。

    3,函数和数组

           int  arr[32];

           int  sum_arr(int arr[],int n);//参数arr是一个指针,而不是一个数组。

           int  sum_arr(int *arr,int n);  //仅用于函数头,函数原型中 int  *arr 跟  int arr[]的含义相同

            恒等式:

                   arr[i] ==  *(arr+i);  //值

                   &arr[i] == arr+i;    //地址

    4,数组名和指针对应的好处?

              节省赋值整个数组所需的时间和内存

              使用原始数据增加了破坏数据的风险

    5,为什么需要传递数组长度?

             不能通过sizeof(arr) 计算数组的长度。原因是sizeof(arr)只是指针变量的值。

    6,重要的问题:在C语言中“&”的妙用

           在C++程序声明变量的时候的&,只是表明“它是一个引用,这个引用声明时不开辟新空间,它在内存分配表加入新的一行,该行内存地址等于和调用时传入的对应参数内存地址”

           例子:

    #include "stdio.h"
    
    void inc(int *data)
    {
    	(*data)++;
    } 
    int main()
    {
    	int a=0;
    	inc(&a); //调用是关键
    	printf("%d\n",a);
    	return 0 ;
    }
    
    #include"stdio.h"
    #include"malloc.h"
    #include"string.h"
    void TestFunction(char** ptr1, char*& ptr2)
    {
      *ptr1 = "abc";
       ptr2 = (char*)malloc(6);
       strcpy(ptr2, "abc");
    }
    
    int main()
    {
     char* ptr1 = NULL, *ptr2 = NULL;
     TestFunction(&ptr1, ptr2);
     printf("%s\n", ptr1);
     printf("%s\n", ptr2);
     free(ptr2);
    }

    7,指针和const

        1)指针指向一个常量对象:int age=39;

                 const   int  *pt=&age;

                 防止使用该指针来修改所指向的值。  不能用(*pt)++修改变量的值。但可以通过修改 age的值来更改 指针指向的值

                 pt可以指向另一个变量。

        2)指针本身声明为常量:int  *const  pt;

                 pt可以用来修改值,pt不能指向其他变量。

    【注意】C++禁止将const的地址赋给非const指针。

                   常量不能作为形参传递给非常量函数。

    8,函数和C-风格字符串

           1)字符串作为参数来传递,实际传递的是字符串的第一个字符的地址。

           2)字符串内置结束符“/0”而字符数组没有

           3)函数无法返回字符串,但可以返回字符串的地址。

    9,函数和结构、String对象

           1)函数可以返回结构,但是结构名只是名称,而不像数组名代表地址。要想获取地址只能使用地址操作符"&"

           2)String 对象采用 getline(cin,str[i]);实例:     

    #include <iostream>
    #include <string>
    using namespace std;
    
    void display(const string s[],int n)
    {
    	for(int i=0;i<n;i++)
    	   cout<<i+1<<":"<<s[i]<<endl;
    }
    int main()
    {
    	string list[3];
    	for(int i=0;i<3;i++)
    	  getline(cin,list[i]);
    	  
    	display(list,3);
    }
    10,函数指针

            1)原理:将函数的地址当做参数传递给相应函数

            2)测试源码:

    #include <iostream>
    using namespace std;
    double besy(int lns)
    {
    	return 0.05*lns;
    }
    double estimate(int lines,double (*pf)(int))//第二个形参含义为函数声明 double pm(int data)
                                               //只不过将函数名 pm替换成了 (*pf) 
                                                //pf 是一个指向函数的指针 
    {
    	cout<<lines<<"lines will take\n";	
    	cout<<(*pf)(lines)<<" hour (s)\n";
    		
    }
    int main()
    {
    	/*执行过程讲解:
    	  函数实参为 lines=16   besy(lines=16) 
        */
    	estimate(16,besy);
    	
    } 
    
    11,总结

         1)默认情况下,C++函数按值传递参数。意味着形参是新的变量,他们被初始化为函数调用所提供的值。因此C++通过使用拷贝,保护了原始数据的完整性。
         2)使用函数的三个步骤:定义函数、提供原型、调用函数

         3)*"tianshuai"表示的含义:t        //"tianshuai"被解析为字符数组第一个元素的地址。而加上*表示取的一个元素的值

                "tianshuai"[2] 表示 第三个元素 a    //理由同上




  • 相关阅读:
    .net中对象序列化技术
    new、virtual、override
    如何检测指定的Windows服务是否启动
    c#中的GetUpperBound,GetLowerBound方法
    C#.net中的rank方法
    实现MD5算法
    用C#实现DES加密解密封装
    [转]JSP或servlet中(以及上传下载文件)中文乱码或不显示的解决方案
    [转]runOnUiThread 、 Handler 对比(一)
    [转]使用popBackStack()清除Fragment
  • 原文地址:https://www.cnblogs.com/secbook/p/2655049.html
Copyright © 2011-2022 走看看