函数调用:(用到变量的引用,用到数组名,作为参数)
是实参中的数据复制一份传到形参中,称为值传递,而值传递是单向的。
&引用:就是给起了个别名,共用同一个内存空间//注意:凡跟在类型后面的就不是运算符 引用不分配空间,总是跟初始化它的变量用同一块内存空间,如果初如化的不是变量,要加const
如const int& d=888;//但没有任何意义
引用必须使用之前必須要初始化,而且终生不变 int main() {
int a=13;
int& c=a;//引用:
cout<<\ a=14;
cout<<\ cout<<\ return 0; }
引用作为形参--------------(以下是使用方法), 形参中使用实参的引用:可以使形参与实参共用同一个内存空间 区别以下两个子函数
Person setdata(Person p,string s,bool b,int n,double d) {
p.name=s; p.gender=b; p.age=n; p.salary=d;
return p;//必加这一句,因为是传递是单向的,如无返回值P不会给p1 }
主函数中p1=setdata(p1,\陈宗权\
void setdata1(Person& p,string s,bool b,int n,double d)//引用,实现双向传递 {
//这里的形参引用是用实参来初始化Person& p=p1; p.name=s; p.gender=b; p.age=n; p.salary=d; }
主函数中setdata(p1,\陈宗权\
静态局部变量static int n=0;//, 初始化只在每一次调用它的时候初始化一次,它的空间直到程序结束才释放;
(写在函数中,所以是局部的,作用范围也只是在定义他的函数中)
引用作为返回值类型---------------(方法如下) int& count() {
static int n=0;//静态局部变量, 初始化只在每一次调用它的时候初始化一次,它的空间直到程序结束才释放; ++n;
return n; }
int main() {
for(int i=0;i<3;i++) {
cout< count()=0;//正确:因为返回的是引用:实质全局静态变量可以达到这个目的,但尽量少用全局变量 for(int i=0;i<3;i++) { cout< return 0; } 如果n不是static,在主函数中使用count()=0 错误 :因为n已经释放了,还要引用空间中的值所以错误 如果int& count(){}不用&,错误因为return()带回一个值时,是每次返回时,到值复制到一个临时空间作为结果; 但返回的是引用,即返回值是n的引用时,这句就可以,达到归0的目的 cout<<&count()< 函数调用时实参是数组----------总要传递两个参数一个是数组名,一个是数组的个数 注意swap(任何基本类型元素1,任何基本类型元素2);//可直接使用。这是系统已经定义好的函数 函数的声明, 1 放在函数定义最上面,也可以在一个函数里面声明另一个函数 2,函数声明时,形参的名子可写可不写 3,必加;号 *********************2010年09月10日 星期五 09时04分05秒 (第六天)*********************************** 递归:recursive 在调用一个函数过程中又出现直接或间接地调用该函数本身(函数在实现过程中调用自已) 重载----------------------------同一个函数名多次使用 函数的重载:overload(就是一个名字定义多个函数,这些函数的参数个数和参 数类型不同) 就是说重载:要有不同的参数表(即1、参数的个数,参数的类型,参数的顺序不同),函数参数表与返回类型无关。 编译器会根把参数的个数,和参数的类型 ,形参的顺序不同来区分调用哪一个函数 汇编中call函数名,所以发生冲突,而C++会在编译时对其名子进行更改 测试:可在 函数前加extern \定义函数部分。表明采用C的方法,不可以改名,编译就无法通过 void printtime(int hour,int minute=0,int second)=0 形参的默认值:在调用函数时有默认值的形参,可以不传值---------------减少工作量 定义规则:没有默认值的形参,定义时要靠右, 传参总是依次传递,不能中间跳过某个参数,即使中间有提示如14,,20 如声明与定义分开,只允许在声明中指名默认值,定义时不允许 /* 模板与函数重载的区别: 1 函数模板:比函数重载更方便 ,程序更简洁。它适用于函数体相同,函数的参数个数相同,参数类型不同的情况 如参数个数不同不能用函数模板。 2 函数重载:是定义多个函数,但函数名相同,参数个数可不同,返回类型 可不同,参数类型 可不同 但不能只有函数类型 不同,而参数的个数和类型 相同如 int f(int); long f(int); void f(int) */ 如运算符也可以重载:<< >>即是位移,又作为输出插入运算符,和输入提取运算符 堆:heap, 栈:stack,栈中临时变量和局部变量,形参 内联函数:(inline):-----------申请嵌入到主调函数中,为提高程序的执行效率 就是在编译时将所调用函数的代码直接嵌入主调函数中,而不是将会流程转 出去,这种嵌入到主调函数中的函数称为内置函 数。也称内联函数。 方法:如 inline int max(int a,int b)//在函数定义时请求内存做为内联函数 注意:原则上不要声明,直接定义,内联函数中不能所括复杂的控制语句,如循环,switch. 总之只有那那些规模较小,而又被频繁调用的简单函数才适合声明inline. 注意,string可以带回返回值,而 char[]不可以 ********************************************************************************************* 多个文件怎么合成一个文件,也可以起到保密作用 mkdir project 目录:src: 1,io.cpp 2,char.cpp main.cpp io.h char.h g++ -c main.cpp io.cpp char.cpp 得到 main.o,io.o,char.o main.o,io.o,char.o io.h char.h可以给别人---这样就不泄露原代码----别人可以g++ *.o就可以执行通过 char.h中可以放如下内容---头文件:放函数声明,全局变量的声明extern int g;,类型的定义。 void upper(char str[]); void IsLower(char c); void ToUpper(char& c); extern int g;//声明有一个外部全局变量, typedef int zhengshu; enum Color{RED,BLACK}; struct x{}; 用到自定义类型就加声明自定义类型的头文件------这样会造成同名的自定义类型重复定义,发生冲突 每个头文件都这要用这个框架--------编译时防止同名的自定义类型重复定义 #ifndef 头文件名_H //如果没有定义头文件名_H 这个名字就#define TANJIE #define 头文件名_H 用户自定义类型 #endif 作业:能用重载(几个函数)实现大数运算。(+-*/任选其一),如大数的十进制形式在 30位以内(而int只有十位),表示形式用字符数组来存储, 运算用op来表示 void operate(char d1[],char d2[],char result[]) void operate(char d1[],int d2[],char result[]) void operate(int d1[],char d2[],char result[]) 从键盘输入一些超大数据分别试试这些函数。注意int传值不要超过2的30次方-1 //注意:最好不要有在.h中有新类型名的定义,和全局变量声明的定义,可是只作声明。然后在某个.cpp文件中定义 extern int g;//声明有一个外部全局变量, static 用在函数定义和全局变量前面,表明只许在定义它的本文件中访问。static 用在函数声明处 表明只能在定义处访问) static int g; (前面用到的static 是静态局部变量。) typedef int zhengshu; 变量的存储类别 作用域:是变量的一种属性,从空间角度又分为全局变量与局部变量 存储期(生命期):指变量在内存中的存在期间。的时间角度来分析,存储期分为静态存储期和动态存储期。 ********************************************************************************************* *********************2010年09月13日 星期一 08时37分26秒 (第七天)********************************** 区别:变量的指针|:一个变量的地址称为该变量的指针 指针变量:一个变量用来存放另一个变量的地址(即指针)则称为指针变量。 输出字符址址:不是地址,是一个&c开始,找'\\0'的字符串,所以是乱码