C++ 引用、内联函数、函数默认参数、函数重载
2018-02-08 18:59
627 查看
一、引用:
1、整型数据占4个字节的空间,a是一个标识符,这个标识符代表这一块空间,
对这个标识符操作相当于操作这块空间
int a = 10;
给这个 4 字节的空间取个别名 a 是大名 其他都叫别名
类型 &别名 = 原名,b 是 a的一个别名, b 也代表a所表示的4字节空间
对 b 操作实际上就是对 a 操作, 引用的对象是不可改变的,所以引用必须要初始化
int &b = a; b = 20;
2、用途:代替指针,有更好的可读性和实用性
例如在交换两个数值时
3、
引用是有空间的 4字节
引用使用之前必须要初始化
引用的本质是一个常指针
char &b = a ==> char * const b = &a;
4、引用作为函数的返回值:
1、不能返回一个局部变量的引用,问题在于函数运行结束之后,栈空间会被释放
2、如果一个函数返回的是引用,则该函数可以作为左值使用
3、用一个普通变量去接这个引用,接回来的是这个值
指针引用
常引用:用普通变量去初始化常引用,不能通过引用来改变变量的值;
用一个常量去初始化常引用
如果是一个常量,编译器会分配一个空间去存储这个常量值,引用代表这一块空间
二、内联函数
1、宏函数的优点:宏函数没有正常函数的出栈和入栈的开销,能提高运行效率
缺点:每一次展开,会使得整个程序显得冗长
例如:
2、C++建议用内联函数代替宏函数
内联函数 内联编译的函数和宏函数很像,都是做的代码替换,在调用的地方用
所以没有函数的入栈和出栈开销
内联函数的定义:在函数定义前加 inline 关键字
inline int mul(int a , int b)
{
return a*b;
}
特点:
1、内联函数在编译时处理, 而宏函数在预处理的时候处理
2、内联函数是一种请求,不一定成功
3、内联函数一旦成功,函数体在运行的时候是不存在的,因为其存放在符号表中
不能进行取地址操作,也不能作为回调函数
内联函数请求成功的因素:
1、函数体不要太大, 不要超过5行
2、不要有任何形式的循环语句
3、不要有很复杂的判断语句
三、函数默认参数
1、在函数定义的时候可以给函数的形参设置一个默认的值,如果调用时没有传入相应的参数,则使用默认参数
2、默认参数如果写在声明中,则在定义时,不要再写默认参数;相反,如果在定义时,写了默认参数,那么
声明时就不要写,二者择其一
int func5_1(int a = 3, int b = 5)
{
return a + b;
}
默认参数的规则:当函数的某一个形参有默认值以后,它的右边的所有参数都必须要有默认值
int func5_2(int a, int b = 5, int c = 1)
{
return a + b + c;
}
占位参数,只有类型声明,没有变量名
占位参数和默认参数可以一起使用
int func5_4(int a, int)
{
return a;
}
四、函数重载
函数重载:用同一个函数名字,通过匹配不同的参数调用不同的函数
函数的参数个数不同
参数的类型不同
参数的顺序不同
函数的返回值类型不能作为重载的判断条件
函数默认参数和函数重载一起使用可能会造成歧义
//void Print(int a, int b = 0)
void Print(int a, int b)
{
cout << "a = " << a << ", b = " << b << endl;
}
void Print(char *str)
{
cout << "str = " << str << endl;
}
void Print(double d)
{
cout << "d = " << d << endl;
}
void Print(int a, char *str)
{
}
void Print(char *str, int a)
{
}
1、整型数据占4个字节的空间,a是一个标识符,这个标识符代表这一块空间,
对这个标识符操作相当于操作这块空间
int a = 10;
给这个 4 字节的空间取个别名 a 是大名 其他都叫别名
类型 &别名 = 原名,b 是 a的一个别名, b 也代表a所表示的4字节空间
对 b 操作实际上就是对 a 操作, 引用的对象是不可改变的,所以引用必须要初始化
int &b = a; b = 20;
2、用途:代替指针,有更好的可读性和实用性
例如在交换两个数值时
void mySwap1(int *pa, int *pb) //地址传递 { int tmp = *pa; *pa = *pb; *pb = tmp; } void mySwap2(int &a, int &b) //引用 { int tmp = a; a = b; b = tmp; }
3、
引用是有空间的 4字节
引用使用之前必须要初始化
引用的本质是一个常指针
char &b = a ==> char * const b = &a;
4、引用作为函数的返回值:
1、不能返回一个局部变量的引用,问题在于函数运行结束之后,栈空间会被释放
2、如果一个函数返回的是引用,则该函数可以作为左值使用
3、用一个普通变量去接这个引用,接回来的是这个值
int &b = test3_1(); // int *const b = test3_1(); ==> int *const b = &a; cout << "b = " << b << endl; int &c = test3_2(); c = 90; test3_2(); // 如果一个函数返回的是引用,则改函数可以作为左值使用 test3_2() = 200; test3_2(); // 用一个普通变量去接一个 引用 接回来的是个值 int d = test3_2(); d = 300; test3_2();
指针引用
void init2(Teacher* &p) { p = (Teacher *)malloc(sizeof(Teacher)/sizeof(char)); if (p == NULL) { return; } p->age = 10; p->name = (char *)malloc(sizeof(char)*100); strcpy(p->name, "小明"); }
常引用:用普通变量去初始化常引用,不能通过引用来改变变量的值;
const int &a1 = a;
用一个常量去初始化常引用
如果是一个常量,编译器会分配一个空间去存储这个常量值,引用代表这一块空间
const int &a2 = 10; // const int *const a2 = &10;
二、内联函数
1、宏函数的优点:宏函数没有正常函数的出栈和入栈的开销,能提高运行效率
缺点:每一次展开,会使得整个程序显得冗长
例如:
#define MAX(a,b) (((a) > (b)) ? (a):(b))
2、C++建议用内联函数代替宏函数
内联函数 内联编译的函数和宏函数很像,都是做的代码替换,在调用的地方用
所以没有函数的入栈和出栈开销
内联函数的定义:在函数定义前加 inline 关键字
inline int mul(int a , int b)
{
return a*b;
}
特点:
1、内联函数在编译时处理, 而宏函数在预处理的时候处理
2、内联函数是一种请求,不一定成功
3、内联函数一旦成功,函数体在运行的时候是不存在的,因为其存放在符号表中
不能进行取地址操作,也不能作为回调函数
内联函数请求成功的因素:
1、函数体不要太大, 不要超过5行
2、不要有任何形式的循环语句
3、不要有很复杂的判断语句
三、函数默认参数
1、在函数定义的时候可以给函数的形参设置一个默认的值,如果调用时没有传入相应的参数,则使用默认参数
2、默认参数如果写在声明中,则在定义时,不要再写默认参数;相反,如果在定义时,写了默认参数,那么
声明时就不要写,二者择其一
int func5_1(int a = 3, int b = 5)
{
return a + b;
}
默认参数的规则:当函数的某一个形参有默认值以后,它的右边的所有参数都必须要有默认值
int func5_2(int a, int b = 5, int c = 1)
{
return a + b + c;
}
占位参数,只有类型声明,没有变量名
占位参数和默认参数可以一起使用
int func5_4(int a, int)
{
return a;
}
int func5_5(int a, int = 0) { return a; }
四、函数重载
函数重载:用同一个函数名字,通过匹配不同的参数调用不同的函数
函数的参数个数不同
参数的类型不同
参数的顺序不同
函数的返回值类型不能作为重载的判断条件
函数默认参数和函数重载一起使用可能会造成歧义
//void Print(int a, int b = 0)
void Print(int a, int b)
{
cout << "a = " << a << ", b = " << b << endl;
}
void Print(char *str)
{
cout << "str = " << str << endl;
}
void Print(double d)
{
cout << "d = " << d << endl;
}
void Print(int a, char *str)
{
}
void Print(char *str, int a)
{
}
相关文章推荐
- C/C++的区别(默认值、内联函数、函数重载、const、引用、参数、返回值)
- C++中 函数的升级---内联函数、默认参数、占位参数、函数重载、C与C++结合
- [C++学习笔记]--内联函数、函数重载、函数defualt参数
- C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针
- 《C++捷径教程》读书笔记--Chapter 8--函数,第二部分:引用,重载和默认参数
- C++入门学习:内联函数、函数的默认参数和占位参数
- 北大 C++ 1.7 内联函数、函数重载和函数缺省参数
- VS2010 C++ 学习笔记(一) 引用 函数参数默认值 函数重载 内联inline
- 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板
- C++引用调用、内联函数、带默认形参值的函数
- <C++>c++程序有函数重载,能不能设置默认参数值?
- C++学习总结(十一)——类的静态函数,成员函数的默认参数,类中包含引用和常量
- 位运算+引用+const+new/delete+内联函数、函数重载、函数缺省参数
- 就让你歧义!(C++的默认参数函数与无参数函数的重载)
- C++离航篇——函数默认参数、函数重载、内敛函数
- [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子
- C++ 函数参数传递-传递指向指针的引用
- C++中的const,引用本质,内联,默认/占位参数,
- c++将引用或者是指针作为函数参数实现实参的运算
- [C++]实验四:掌握内联函数的使用、参数个数不确定的函数的设计...