zoukankan      html  css  js  c++  java
  • 《C++ Primer Plus》读书笔记之五—函数-C++的编程模块

    函数-C++的编程模块

       1、C++对于返回值的类型有一定的限制:不能是数组,但可以是其他任何类型——整数、浮点数、指针,甚至可以是结构和对象(有趣的是,虽然C++函数不能直接返回数组,但可以将数组作为结构或者对象的组成部分来返回)。

      2、函数时如何返回值的?通常,函数通过将返回值复制到指定的CPU寄存器或内存单元中来将其返回。随后,调用程序间查看该内存单元。函数原型将返回值类型告知调用程序。

      3、为什么需要函数原型?原型描述了函数到编译器的接口,也就是说,它将函数返回值的类型(如果有的话)以及参数的类型和数量告诉编译器。原型可以帮助编译器完成许多工作,它们可以极大地降低程序的出错几率。具体来说,原型可以确保以下几点:

      ①编译器正确处理函数返回值。

      ②编译器检查使用的参数数目是否正确。

      ③编译器检查使用的参数类型是否正确。如果不正确,则转换成正确的类型。

      ④通常,原型自动将传递的参数强制转换成为期望的类型。

      4、在编译阶段进行的原型化被称为静态检查。可以看出,静态类型检查可以捕获许多在运行阶段难以捕获的错误。

      5、通常,在函数原型参数列表中,可以包括变量名,也可以不包括。

      6、避免使用函数原型的唯一方法是,在首次使用函数之前定义它,但这并不总是可行的。

      7、C++将数组名解释为其第一个元素的地址。这一规则有两种例外的情况:第一种是数组声明使用数组名来标记存储位置;第二种是对数组名使用sizeof()将得到整个数组的长度(以字节为单位)。

      8、在C++中,当且仅当用于函数头或函数原型中,int *arr和int arr[]的含义才是相同的。它们都意味着arr是一个指针。不过数组表示法提醒我们,arr不仅指向int,还指向int数组的第一个int。

      9、两个恒等式:arr[i]==*(arr+i) 和 &arr[i]==arr+i。对于遍历数组而言,使用指针加法和数组下标是等效的。

      10、接受数组名的函数将使用原始数据,为防止函数无意中修改数组的内容,可在声明形参时使用关键字const。

      11、当用cin读取缓存中的输入时,非法输入将设置一个错误条件,禁止进一步读取输入。如果程序在输入循环后还需要进行输入,则必须使用cin.clear()重置输入,然后还可能需要通过读取不合法的输入来丢弃它们。具体过程如下:

      if(!cin)  // bad input

      {

        cin.clear(); // 清空缓冲区

        while(cin.get()!=' ') // 丢弃不合法的输入

          continue;

      }

      12、将const用于指针有两种方式:第一种方法是让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值。第二种方法是将指针本身声明为常量,这样可以防止改变指针指向的位置顺口溜:左定值,右定向

      ①指向常量的指针:int age=30;const int *pt=&age;pt的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对pt而言,这个值是常量。可以直接通过age这个变量来修改age的值,但不能使用pt指针来修改它。可以修改pt的值,使pt指向另一个位置。

      ②将指针声明为常量:int sloth=3;int * const finger=&sloth;这种声明格式使得figer只能指向sloth,但允许使用figer来修改sloth的值。

      13、将const变量的地址赋给指向const的指针:const float a=9.80;const float * pe=&a;   // VALID 

        将const变量的地址赋给常规指针: const float b=9.80; float * pm=&b;   // INVALID   如果非要这么做,可以使用强制类型转换(const_cast).

      14、如果数据类型本身并不是指针,则可以将const数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针!

      15、在函数中,将指针参数声明为指向常量数据的指针有两条理由

        ①可以避免由于无意间修改数据而导致的编程错误。

        ②使用const使得函数能够处理const和非const实参,否则只能接受非const数据。

      16、将二维数组名作为实参传递时,函数头或者函数原型的形参有两种格式,例如:int (*ar2)[4] 和 int ar2[][4]。 这两种方式都指出,ar2时指针而不是数组。而且指针类型指定了列数,所以函数只能接受4列组成的数组,而对数组的行数没有限制。

      17、假设要将字符串作为参数传递给函数,则表示字符串的方式有3种:①char数组: char a[3]={'a','b',''};如果没有'',则不是字符串,只是一个数组 ② 用双引号括起的字符串常量:char a[3]="ab"; ③ 被设置为字符串的地址的char指针: char a*="abc"。它们的类型都是char*。

      18、将字符串作为参数传递,实际传递的是字符串的第一个字符的地址。这意味着字符串函数原型应将其表示字符串的形参声明为char*类型

      19、函数中可以按值传递结构,就像普通变量那样,也可以传递结构指针,如果结构非常大,则传递结构指针的效率将更高,同时函数能够使用原始数据。函数也可以返回结构。

      20、函数名即为函数的地址。

      21、函数指针的声明:double pam(int);// 函数原型 则函数指针声明为:double (*pf) (int);即将pam替换为(*pf)。由于pam是函数,因此(*pf)也是函数。正确的声明pf后,便可以将相应函数的地址赋给它:

      double pam(int);

      double (*pf) (int);

      pf=pam;

      22、使用指针调用函数:

       double pam(int);

      double (*pf) (int);

      pf=pam;

      double x=pam(4);

      double y=(*pf)(5);或者double y=pf(5);

  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/smile233/p/8693224.html
Copyright © 2011-2022 走看看