c++ 学习笔记:面向过程


面向过程编程风格

每个函数必须定义一下四个部分

1、函数返回类型

2、函数名

3、参数列表

4、函数主体

 

知道某个类型的最大、最小值

#include <limits>
int max_int = numeric_limits<int>::max();
double min_dbl = numeric_limits<double>::min();


函数调用

 当我们调用函数时会在内存区建立一块特殊区域,称为“程序栈”,这块特殊区域为每个函数参数提供存储空间,为对象提供内存空间,即局部对象,一旦函数完成,这块内存将被释放。

将参数声明为引用的理由:

1、希望对直接对传入的对象进行修改,重要

2、减轻复制大型对象的负担,不重要

指针参数和引用参数的差异:

指针可能(也可能不)指向某个实际对象,使用时首先判断指针不为0;引用必定会代表某对象,不用作此检测。

除非在函数内需修改参数值,否则建议传递内建类型时不使用传址方式,传址方式主要作为传class object用。

生存空间和生存范围

 除了一个例外(static),函数内定义的对象只存活与函数执行之际,如果将局部对象以地址返回,就会出错,以传值方式返回不会出任何错误。

对象在程序内的存活区域成为对象的生存空间。分为局部变量和全局变量。

内建类型的对象如果定义为全局变量,则被初始化为0,否则需程序员为其赋初值。

管理动态内存

 new Type;

new Type(initial_value); Type可以为任意内建类型或已知class。

例 int *pi;

     pi = new int;

     pi = new int(1);

提供默认参数值

 参数提供默认值规则:

  1、默认值的操作从最右边开始,如果我们为某个值提供了默认值,其右边的参数必须都提供默认值。

  2、默认值只能指定一次,声明处或定义时。

// error: no default value for vec
void display(ostream &os = cout, const vector<int> &vec);


函数声明通常至于头文件中,为提高透明度,默认值在声明处提供。

 

// header file declaration specifies default value
// let's call the header file: NumericSeq.h
void display(const vector<int>&, ostream&=cout);
// program text file definition includes header file
// the definition itself does not specify the default value
#include "NumericSeq.h"
void display(const vector<int> &vec, ostream &os)
{
for (int ix = 0; ix < vec.size(); ++ix)
os << vec[ix] << ' ';
os << endl;
}


使用局部静态对象

 

const vector<int>*
fibon_seq(int size)
{
const int max_size = 1024;
static vector<int> elems;
if (size <= 0 || size > max_size){
cerr << "fibon_seq(): oops: invalid size: "
<< size << " -- can't fulfill request.\n";
return 0;
}
// if size is equal to or greater than elems.size(),
// no calculations are necessary ...


 局部静态对象所处的内存空间,即使在不同的函数调用中依然存在,可以安全将地址返回。


声明inline函数

编译器在函数调用点上将函数内容展开,将函数调用操作改为以一份函数代码副本取代。

函数最好是体积小,常被使用,计算不复杂。

inline函数定义常置于头文件里。


重载函数

编译器将调用者提供的实际参数与每个重载函数比较选出最恰当的。

返回值类型不足以区分重载函数。


模板函数

 将参数表中指定的所有或部分参数的类型信息抽离出来,

template <typename elemType>
void display_message(const string &msg,
                  const vector<elemType> &vec)
{
        cout << msg;
        for (int ix = 0; ix < vec.size(); ++ix)
       {
           elemType t = vec[ix];
           cout << t << ' ';
       }
}

关键词typename表示elemType在display_message函数中,只是个临时放置类型的代称。

一般而言,如果函数具备多种实现形式我们可以将它重载,每份实体提供的是相同的通用服务,如果想要函数的主体不变只是改变其中用到的数据类型,可以通过模板函数达到目的。


函数指针

函数指针必须指明所指向函数的返回值类型和参数列表。

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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值