载入中。。。 'S bLog
 
载入中。。。
 
载入中。。。
载入中。。。
载入中。。。
载入中。。。
载入中。。。
 
填写您的邮件地址,订阅我们的精彩内容:


 
VC++学习笔记14-函数
[ 2010/7/28 12:40:00 | By: 梦翔儿 ]
 

//设置默认值参数
#i nclude <iostream>
#i nclude <string>
using namespace std;

void OutputInfo(const char* pchData="One world, one dream!") //默认值
{
 cout<<pchData<<endl;
}
void main()
{
 OutputInfo(); //按默认值执行
 OutputInfo("Beijing 2008 Olympic Games!"); //按新值执行

}
=========
//非法默认参数值
#i nclude <iostream>
#i nclude <string>
using namespace std;

int GetMax(int x,int y=10,int z) //后两个必须有值才行,不能中间有值而后无
{
 if(x<y)
  x=y;
 if(x<z)
  x=z;
 return x;
}
void main()
{
 int m=GetMax();
 cout<<m<<endl;
}
========
//非法默认参数值
#i nclude <iostream>
#i nclude <string>
using namespace std;

int GetMax(int x=3,int y=10,int z=5)
{
 if(x<y)
  x=y;
 if(x<z)
  x=z;
 return x;
}
void main()
{
 int m=GetMax(); //都有默认值才能这样空参调用,否则会提示缺参
 cout<<m<<endl;
}
==========
//数组冒泡

#i nclude <iostream>
#i nclude <string>
using namespace std;

void Sort(int array[10])     //定义一个排序函数
{
 int itemp = 0;      //定义一个临时变量
 for(int i=0; i<10; i++)     //利用冒泡法排序
 {
  for(int j=0; j<10-i;j++)
  {
   if (array[j]>array[j+1])   //交换数组元素
   {
    itemp = array[j];
    array[j] = array[j+1];
    array[j+1] = itemp;
   }
  }
 }
 cout<<"排序之后:";
 for(i=0; i<10; i++)     //输出排序后的结果
 {
  cout<<array[i]<<",";
 }
}
int main(int argc, char* argv[])
{
 int iarray[10] = {10,9,8,7,6,5,4,3,2,1};  //定义提个整型数组
 
 cout<<"原始数据:";     //输出原始数据
 for(int i=0; i<10; i++)
 {
  cout<<iarray[i]<<",";
 }
 cout<<endl;      //输出换行
 Sort(iarray);      //对数组元素进行排序
 cout<<endl; 
 return 0;
}
==========

//如果定义的是变长数组
// ArrayArgument.cpp : Defines the entry point for the console application.
//

#i nclude <iostream>
#i nclude <string>
using namespace std;

void Sort(int array[],int len)     //定义一个排序函数
{
 int itemp = 0;      //定义一个临时变量
 for(int i=0; i<len; i++)     //利用冒泡法排序 len是变长
 {
  for(int j=0; j<len-i;j++)
  {
   if (array[j]>array[j+1])   //交换数组元素
   {
    itemp = array[j];
    array[j] = array[j+1];
    array[j+1] = itemp;
   }
  }
 }
 cout<<"排序之后:";
 for(i=0; i<len; i++)     //输出排序后的结果
 {
  cout<<array[i]<<",";
 }
}
int main(int argc, char* argv[])
{
 int iarray[] = {10,9,8,7,6,5,4,3,2};  //定义提个整型数组
 int len=sizeof(iarray)/sizeof(int);           //获取数组长度,注意除整型长
 cout<<len;
 if (len<10)
{
 cout<<"原始数据:";     //输出原始数据
 for(int i=0; i<len; i++)
 {
  cout<<iarray[i]<<",";
 }
 cout<<endl;      //输出换行
 Sort(iarray,len);      //对数组元素进行排序
 cout<<endl; 
 return 0;
}
=========
//如果输入数组小于10,如何暂停并退出

#i nclude <iostream>
#i nclude <string>
using namespace std;


void Sort(int array[],int len)     //定义一个排序函数
{
 int itemp = 0;      //定义一个临时变量
 for(int i=0; i<len; i++)     //利用冒泡法排序
 {
  for(int j=0; j<len-i;j++)
  {
   if (array[j]>array[j+1])   //交换数组元素
   {
    itemp = array[j];
    array[j] = array[j+1];
    array[j+1] = itemp;
   }
  }
 }
 cout<<"排序之后:";
 for(i=0; i<len; i++)     //输出排序后的结果
 {
  cout<<array[i]<<",";
 }
}
int main(int argc, char* argv[])
{
 int iarray[] = {10,9,8,7,6,5,4,3,2,1};  //定义提个整型数组
 int len=sizeof(iarray)/sizeof(int);
 if (len<10)
 {
  cout<<"len的值为"<<len<<endl;
  cout<<"len的值小于10"<<endl;
     system("pause"); //暂停程序
  exit(1); //退出

 }
 
 cout<<"原始数据:";     //输出原始数据
 for(int i=0; i<len; i++)
 {
  cout<<iarray[i]<<",";
 }
 cout<<endl;      //输出换行
 Sort(iarray,len);      //对数组元素进行排序
 cout<<endl; 
 return 0;
}
==========
// 按值传参

#i nclude <iostream>
#i nclude <string>
using namespace std;


void ValuePass(int var) //定义指针类型参数
{
 var=10;
 cout<<var<<endl;
}

void main()
{
 int ivar=5;
 ValuePass(ivar);
 cout<<ivar<<endl;
}
=======
// 按引用传参

#i nclude <iostream>
#i nclude <string>
using namespace std;


void ValuePass(int *var) //定义指针类型参数
{
 *var=10;
 cout<<*var<<endl;
}

void main()
{
 int ivar=5;
 ValuePass(&ivar);
 cout<<ivar<<endl;
}
============
// 按引用类型作为函数参数 传引用和函数引用效果是相同的.
//对于引用类型,引用必须被初始化为一个对象,并助不能使它再指向其他对象.因为对引用赋值实际上是对目标对象赋值.优点是在函数中不用验证引用参数的合法性.使用指针对象作函数参数,用户可以随意修改参数指向的对象,这是引用类型做不到的.

#i nclude <iostream>
#i nclude <string>
using namespace std;


void ValuePass(int &var) //定义指针类型参数
{
 var=10;
 cout<<var<<endl;
}

void main()
{
 int ivar=5;
 ValuePass(ivar);
 cout<<ivar<<endl;
}
=========
// 按引用类型作为函数参数

#i nclude <iostream>
#i nclude <string>
using namespace std;


void ValuePass(int &var) //定义指针类型参数
{
 var=10;
 cout<<var<<endl;
}

void main()
{
 ValuePass(0); //错误,这里0被认为是空指针,他的取地址会出错
 cout<<ivar<<endl;
}
=======
// 省略号参数,代表函数的参数多少是不固定的.

#i nclude <iostream>
#i nclude <string>
#i nclude <stdarg.h> //要引用这个
using namespace std;

void OutputInfo(int num,...)
{
 va_list arguments; //定义var_list类型变量
 va_start(arguments,num) ;
 while(num--) //读取所有参数的数据 有2个
 {
  char* pchData =  va_arg(arguments,char*); //获取字符串参数
  int iData =  va_arg(arguments,int); //获取整型参数
  cout<<pchData<<endl; //输出
  cout<<iData<<endl;
 }
 va_end(arguments);
}
int main()
{
 OutputInfo(2,"Beijing",2008,"Olympic Games",2008);
 return 0;
}
======
可变参数列表:
在函数原型中,列出了函数期望接受的参数,但原型只能显示固定数目的参数,如何让一个函数在不同的时候接受不同数目的参数呢?


stdarg宏:

可变参数列表时通过宏来实现的,这些宏定义在stdarg.h头文件中,他是标准库的一部分。这个头文件声明了一个类型va_list和三个宏 ——va_start、va_arg和va_end。

  函数声明可以声明一个va_list类型的变量,变量名为 var_arg。通过调用va_start()来初始化,它的第1个参数是va_list变量名字,第2个参数是省略号前最后一个有名字的参数。
  为了访问参数,需要使用va_arg(),这个宏接受两个参数:va_list变量和参数列表中下一个参数的类型。
  最后,当访问完最后一个可变参数后,我们需要调用va_end()。

注:可变参数列表,仅支持可变参数的顺序访问。如果在顺序访问几个参数后中途终止是可以的,但是不能跳跃式的访问可变参数。

=========
//函数的重载
#i nclude <iostream>
#i nclude <string>
using namespace std;

int Add(int x,int y)
{
 cout<<"整型"<<endl;
 return x+y;
}

double Add(double x,double y)
{
 cout<<"实数"<<endl;
 return x+y;
}

float Add(float x,float y)
{
 cout<<"浮点"<<endl;
 return x+y;
}


int main()
{
 int ivar = Add(5,2);
 float fvar1 = Add(10.5,11.4);
 float fvar2 = Add(10.5f,11.4f);
 return 0;
}
-=========
//使用函数指针,可以灵活定义通用函数,函数名指向函数的长指针,也可以自定义类型
#i nclude <iostream>
#i nclude <string>
using namespace std;
//使用函数指针指向不同的函数
//通用函数,实现两个数的加\减\乘\除等操作
typedef int (*ptfun)(int,int); //定义函数指针
int invoke(int x,int y,ptfun fun) //定义通用功能函数
{
 return fun(x,y);
}

int sum(int x,int y)
{
 return x+y;
}

int sub(int x,int y)
{
 return x-y;
}

int mul(int x,int y)
{
 return x*y;
}

int divi(int x,int y)
{
 return x/y;
}

int main()
{
 ptfun pfun; //定义函数指针变量
 pfun=sum;
 int ret=invoke(20,10,pfun);
 cout<<ret<<endl;
 pfun=mul;
 ret=invoke(20,10,pfun);
 cout<<ret<<endl;
 return 0;
}

 
 
发表评论:
载入中。。。

 
 
 

梦翔儿网站 梦飞翔的地方 http://www.dreamflier.net
中华人民共和国信息产业部TCP/IP系统 备案序号:辽ICP备09000550号

Powered by Oblog.