一、
引用初始化2种:
1、int x1=30;
const int &y1=x1;//用const变量引用不会单独分配内存空间
2、const int &y1=43;//只读,无法修改;在给自面量做引用时,不加const会直接报错,用const常量引用会单独分配内存空间
二、
1、在函数取值为指针时,只有变量是指针时候最特殊,不需要加&,其余都要加&(包括结构体、变量等等),但如果是引用,则原封不动的扔进去
例:
void mm(int *p)
{
printf("123");
}
void main()
{
int a=1;
int b=2;
int *p;
*p=a;
mm(p);
mm(&b);
}
2、指针
int get_teacher(teacher **p)
{
*p=90;
}
//p是实参的地址,*p去间接修改实参的值
3、二级指针做参数
#include
using namespace std;
struct Teacher
{
char name[64];
int age;
};
//二级指针做函数参数
//在被调用函数,获取资源
int getTea(Teacher **p)
{
Teacher* tmp = NULL;
if (p == NULL)
{
return -1;
}
tmp = (Teacher*)malloc(sizeof(Teacher));
if (tmp == NULL)
{
return -2;
}
tmp->age = 45;
//p是实参的地址 *实参的地址 去间接地修改实参的值
*p = tmp;
}
int main()
{
Teacher *pt;
getTea(&pt);
cout << "age="<
system("pause");
}
三、内联函数
用内联函数替代代码片段
注意:没有申明;没有返回,跳转,压栈;不能存在循环语句;不能存在过多的判断语句
例:
inline void printA(int a,int b)
{
...
}
void main()
{
printA(a,b);
}
四、宏定义
注意与内联函数区别,注意尽量不要使用带++、--的变量作为函数参数
//带参数的宏
#define MYFUNC(a, b) ((a) < (b) ? (a) : (b))
inline int myfunc(int a, int b)
{
return a < b ? a : b;
}
int main1402()
{
int a = 1;
int b = 3;
//int c = myfunc(++a, b); // a=2 b=3 c=2
int c = MYFUNC(++a, b); //==>宏替换并展开 ((++a) < (b) ? (++a) : (b)) //a=3 b=3 c=3
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
system("pause");
return 0;
五、
1、函数默认参数原则:如果默认参数出现,则右边都是默认参数;调用时可以不写默认参数
2、函数占用参数,在调用时,必须写够参数。作用:为以后函数扩展做准备
例:
void func1(int a, int b, int)
{
cout<<"a"< }
void main_占位参数()
{
//func1(1, 2); //err调用不起来
func1(1, 2, 3);
}
3、当默认参数和占位参数一起,2个或3个参数都可以调用
六、函数重载
定义:相同函数名,输入参数类型或者个数不同
注意:返回类型不是 函数重载判定标准
函数重载本质上是不同的函数
当函数重载与默认参数一起使用时,会产生二义性
六、函数重载与函数指针
函数指针的语法如下:
//函数指针 基础的语法
//1声明一个函数类型
typedef void (myTypeFunc)(int a,int b) ; //int
//myTypeFunc *myfuncp = NULL; //定义一个函数指针 这个指针指向函数的入口地址
//声明一个函数指针类型
typedef void (*myPTypeFunc)(int a,int b) ; //声明了一个指针的数据类型
//myPTypeFunc fp = NULL; //通过 函数指针类型 定义了 一个函数指针 ,
//定义一个函数指针 变量
void (*myVarPFunc)(int a, int b);
函数重载会严格执行变量类型匹配