《Essential C++》笔记二、面向过程的编程风格

这篇笔记探讨了C++中的函数定义,包括参数列表、返回类型和传址。还提到了exit()函数的使用、numeric_limits类来获取类型最大最小值的方法。此外,讨论了如何通过引用和指针传递参数以避免复制,并介绍了默认参数值、inline函数、重载函数、模板函数和函数指针的概念。同时,文章还涉及了动态内存管理、枚举类别以及头文件的使用策略。
摘要由CSDN通过智能技术生成

²  函数定义:函数的返回类型、函数名称、函数的参数列表、函数主体

²  exit()终止整个程序,但必须传给exit()一个值,此值将成为程序结束时的状态值:

#include <cstdlib>

exit(-1);

²  想知道某个类型的最大最小值,可查询标准程序库中的numeric_limits calss:

#include <limits>

int max_int = numeric_limits<int>::max();

double min_db1 = numeric_limits<double>::min();

²  如何一行打印出n个元素:

cout << elem << ( !(ix%n ) ? “\n\t” : “ ” );

²  调用函数

如果想让参数和传入的实际对象产生关联,也就是所谓的传址(pass by reference),最简单的做法就是将参数声明为reference:

void swap ( int &val1, int &val2 );

void bubble_sort( vector<int> &vec );

将参数声明为reference的理由之一是,希望得以直接对所传入的对象进行修改;

第二个理由是,为了降低复制大型对象的负担:

void display ( const vector<int> &vec )

{

         for( intix=0; ix < vec.size(); ++ix )

         {

                   cout<< vec[ix] << ‘ ‘;

                   cout<< endl;

         }

}

我们声明了一个reference to const vector,因为函数并不会改变vector的内容,少了const也不会造成错误。但加上const更容易让人了解,我们以传址的方式来传递vector,为的是避免重复操作,而不是为了在函数中对它进行修改。

如果我们愿意,也可以将vector以pointer形式传递。这和以reference传递的效用相同:传递的对象是地质,而不是整个对象的复制品,唯一的差别在于用法不同:

void display ( const vector<int> *vec )

{

         if ( !vec){

                   cout<< “Error… \n”;

                   return;

         }

         …

}

int main()

{

         …

         display (&vec );

}

pointer可能指向某个不实对象,所以使用时一定要先确定其值并非为0。

²  动态内存管理(P49)

²  提供默认参数值

void bubble_sort ( vector<int> &vec, ofstream*ofil = 0 )

如何在cout和输入文件之间转换(P52)

void display ( const vector<int> &vec,ostream &os = cout )

{

         for ( intix = 0; ix < vec.size(); ++ix )

                   os << vec[ix] << ‘ ‘;

         os<< endl;

}

规则一:默认值的决议工作由最右边开始进行,如果我们为某个参数提供了默认值,那么这个参数右侧的所有参数都必须也具有默认数值才行

规格二:默认值只能定义一次,可以在函数声明处,也可以在函数定义处,但是不能在两个地方都指定。为了更高的可见度,我们决定将默认值置于函数声明处,而非定义处

//头文件声明,其中制定了参数默认值

//让我们称此头文件为my.h

void display( const vector<int>&,ostream&=cout );

 

//程序本文含上述头文件

//至于函数定义处,并没有指定参数的默认值

#include “my.h”

void display( const vector<int> &vec, ostream&os )

²  声明inline函数

将函数声明为inline,表示要求编译器在每个函数调用点上,将函数内容展开。面对一个inline函数,编译器可以将函数的调用操作改以一份函数码副本取而代之,这使我们在效率上得到改善,其结果等于是把三个函数写入fibon_elem体内,但依然维持3个独立的运算单元。

只要在函数前面加上关键字inline,便可以将函数声明成inline(inline函数的定义常常被放在头文件中):

inline bool fibon_elem( int pos, int &elem )

²  重载函数(P56)

²  模板函数(P58)

²  函数指针

函数指针必须指明其所指向的函数的返回值类型及参数表:

//希望指向的一组函数

const vector<int> *fibon_seq( int size );

const vector<int> *lucas_seq( int size );

const vector<int> *pell_seq( int size );

const vector<int> *triang_seq( int size );

const vector<int> *square_seq( int size );

const vector<int> *pent_seq( int size );

//定义的指针

const vector<int>* (*seq_ptr) ( int );

//我们可以给予函数指针初值,如果初值为0,表示并未指向任何函数

const vector<int>* (*seq_ptr) ( int ) = 0;

//如果想取得函数指针

seq_ptr = pell_seq;

²  枚举类别

enum ns_type { ns_a, ns_b, ns_c,ns_d, ns_e, ns_f };

默认情况下,第一个枚举成员的值为0,接下来的一个要比前一个多1

²  函数的定义只能有一份,但可以有很多份声明。我们不把函数的定义纳入头文件,因为同一个程序的多个代码可能会含入这个头文件。

自定义的头文件:#include “XXX.h”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值