Essential c++2.2调用函数

来源:互联网 发布:ipad不能用淘宝怎么办 编辑:程序博客网 时间:2024/04/30 20:53

本节讲了一个冒泡排序,主要讨论的是传值,传址。这一点我基本已经懂了,所以就写一个冒泡排序的正确程序。

#include<iostream>#include<vector>using namespace std;void display(vector<int> vec){    for(int ix=0;ix<vec.size();++ix)        cout<<vec[ix]<<' ';    cout<<endl;}void swap(int &val1,int &val2){    int temp=val1;        val1=val2;        val2=temp;}void bubble_sort(vector<int> &vec){    for(int ix=0;ix<vec.size();ix++)        for(int jx=ix+1;jx<vec.size();jx++)            if(vec[ix]>vec[jx])                swap(vec[ix],vec[jx]);}int main(){    int ia[8]={8,34,3,13,1,21,5,2};    vector<int> vec(ia,ia+8);    cout<<"vector before sort:";    display(vec);    bubble_sort(vec);    cout<<"vector after sort:";    display(vec);}

当我们调用一个函数时,会在内存中建立一块特殊区域,称为“程序堆栈”这块特殊区域提供了每个函数参数的储存空间。提供函数所定义的每个对象的内存空间。。。我们称为局部对象,一旦函数完成,这块内存就会被释放掉。
将参数设置为reference的理由:首先,能够对传入的对象进行修改,其次,降低复制大型对象的额外负担。
也可以将vector以pointer形式传递。这和一reference传递的效果相同:传递对象的地址,而不是副本。但是用法不同,重新写display()

void display(const vector<int> *vec){ if(!vec) {  cout<<"display():the vector pointer is 0\n";  return;  }  for(int ix=0;ix<vec->size();ix++)   cout<<(*vec)[ix]<<' ';   cout<<endl; }

作用域及范围:
函数内定义的对象,只存在于函数执行期间。如果将这些所谓的局部对象的地址返回,会导致运行错误。
动态内存管理:
不论是局部还是全局,都是由系统自动管理。第三种储存期形式称为dynamic extent(动态范围).其内存由程序的空闲空间分配而来,有时也称为堆内存heap memory。这种内存由程序员自行管理,其分配通过new来完成。释放通过delete表达式完成。

int *pi;pi= new int;pi=new int(1024);//指定初值int *pia=new int[24];//pia会被初始化为数组第一个元素的地址,c++没有提供任何语法让我们得以从heap分配数组的同时为其元素设定初值。delete pi;'delete [] pia;//无需检查pia是否为0,编译器会帮我们检查//不用delete的话heap分配的对象永远不会被释放称为memory leak。
0 0
原创粉丝点击