{
int x = 3;
int y = 5;
int const &z = x;
// z = 10; // z不能被改变
x = 20;
cout << x << endl;
system("pause");
return 0;
}
别名被限制上了不能修改,但是原变量是可以修改的。
函数中的const
因为可以保证传入函数内部的值不会因为误操作而修改原有值
3-2-6-constFunctionDemo/main.cpp
#include <iostream>
using namespace std;
void fun( const int &a, const int &b);
int main(void)
{
int x = 3;
int y = 5;
fun(x, y);
cout << x << "," << y << endl;
system("pause");
return 0;
}
void fun( const int & a, const int & b)
{
// 错误因为传入的值为const。不能进行修改。
a = 10;
b = 20;
}
把const去掉,因为传入的是引用,所以原始值可以被修改。
而当const修饰之后,传入函数内部的值并不会修改原有值
关于const用法,以下错误的是:
A. int const a = 3; int *p = &a; //
B. int a = 3; int const *p = &a;
C. int a = 3; int * const p = &a;
D. const int a = 3; int const &b = a;
B const 修饰*p
C const 修饰 p
D const修饰a的别名b
mtianyan:指针指向const修饰的变量时,应该是const int const *p = &a;
单元巩固
使用const关键字定义整型变量count,并定义指针p引用变量count。利用for循环打印count次Hello C++
3-4-C++-UnitDemo/main.cpp
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(void)
{
// 定义常量count
const int count = 3;
int const *p = &count;
// 打印count次字符串Hello C++
for (int i = 0; i < *p; i++)
{
cout << "Hello C++" << endl;
}
system("pause");
return 0;
}
因为只对*p
进行了const。因此可以让p指向其他地址。
c++函数新特性
函数参数默认值
void fun(int i, int j=5, int k=10); // j,k有默认值
void fun(int i, int j=6, int k); // 错误写法
有默认参数值的参数必须在参数表的最右端
声明写默认值,定义不建议写。 定义时写默认值有些编译器无法通过。
void fun(int i, int j = 5, int k = 10);
void fun(int i, int j, int k)
{
cout << i << j << k;
}
使用时:
int main()
{
fun(20);
fun(20,30);
fun(20,30,40);
}
无实参则用默认值,否则实参覆盖默认值
函数重载
前提: 在相同作用域下
两个条件:
- 用同一个函数名定义的多个函数
- 参数个数 或 参数类型不同
demo代码:
int getMax(int x, int y, int z)
{
//TO DO
}
double getMax(double x ,double y)
{
//TO DO
}
思考:编译器如何识别重载的函数
实际的编译之后,名称+参数形成新的函数。来区分两个所谓的同名函数。
int getMax(int x, int y, int z)
->getMax_int_int_int
double getMax(double x ,double y)
->getMax_double_double
调用时,则根据实参类型和个数自动识别。
重载的好处:
- 求几个数最大值,比如有时候求三个数有时候求5个数,有时候求整数,有时候求浮点数。不需要想名字,计算机帮我们决定。
内联函数
主调函数调用普通函数有五个步骤:
- 调用fun(),2. 找到fun()的相关函数入口 3. 执行fun() 中的相关代码 4. 返回主调函数
- 主调函数向下运行其他代码直到结束。
内联函数会在编译时将函数体代码和实参代替函数调用语句。
内联函数关键字inline
inline int max(int a,int b,int c);
int main()
{
int i =10,j=20,k=30,m;
m = max(i,j,k);
cout<<"max="<<m<<endl;
return 0;
}
使用时和普通函数一样使用。代码展开后相当于代码粘贴进来。
思考: 为什么不所有地方都使用内联函数?
- 内联编译是建议性的,由编译器决定
- 逻辑简单(最好不要包含for循环等),调用频繁的函数建议使用内联
- 递归函数无法使用内联方式。
内容总结
- 函数参数默认值: 实参覆盖默认值
- 函数重载: 名称相同,参数可辩 (个数类型)
- 内联函数: inline 效率高 有条件(1.逻辑简单,2.不能是递归)
C++函数特性代码演示
学习函数默认参数,重载,内联函数。
4-2-c++-functionDefaultParameter/main.cpp
#include <stdlib.h>
#include <iostream>
using namespace std;
void fun(int i=30, int j = 20, int k = 10);
int main(void)
{
fun();
fun(100);
fun(100, 200);
fun(100, 200, 300);
system("pause");
return 0;
}
void fun(int i, int j, int k)
{
cout << i << "," << j << "," << k << endl;
}
已传入的实参覆盖默认值,未传入的使用默认值。 默认值从右侧开始赋值,声明时赋默认值,定义时不要默认值。
函数重载
前提条件,函数在同一个作用域下,默认多个函数在同一个命名空间时。
当没有定义命名空间时,函数同名就默认是重载了。
4-2-C++-FunctionOverload/main.cpp
#include <stdlib.h>
#include <iostream&g