C++容许为同一个函数定义几个版本, 从而使一个函数名具备多种功能, 这称之为函数重载.算法
像这样: 虽然函数名同样, 可是参数列表不同, 一个求两个整型参数的最大值, 一个求三个整型参数的最大值.数组
int getMax(int a, int b) {
if (a > b) {
return a;
} else {
return b;
}
}
int getMax(int a, int b, int c) {
if (a > b) {
if (a > c) {
return a;
} else {
return c;
}
} else {
if (b > c) {
return b;
} else {
return c;
}
}
}
复制代码
a. void是无类型标识符, 只能声明函数的返回值类型, 不能声明变量安全
b. C++当中有bool类型, 而C中没有bash
c. C++的常量分为符号常量, 浮点常量, 整数常量编辑器
像这样:函数
咱们能够经过屏幕输出来查看011, 11, 0x11各表明十进制的多少工具
int a = 011; // 八进制数
cout << a << endl; // 以十进制格式输出
int b = 11; // 十进制数
cout << b << endl; // 以十进制格式输出
int c = 0x11; // 十六进制
cout << c << endl; // 以十进制格式输出
复制代码
申请内存空间: new 类型名[size], 申请能够存size个该数据类型对象的存储空间学习
释放内存空间: delete 指针名;ui
像这样: spa
int * p; // 声明int类型指针
p = new int[5]; // 申请5个int类型数据的存储空间
cout << p << endl; // 该内存空间的首地址
delete p; // 释放内存空间
复制代码
为现有对象起个别名, 别名表明的内存空间与引用对象的内存空间是同样的
引用的声明方式: 数据类型(类型名) & 别名 = 对象名;
&的位置可有可无
像这样:
int c = 10;
int & d = c;
int& e = c;
int &f = c;
cout << c << endl;
cout << d << endl;
cout << e << endl;
cout << f << endl;复制代码
咱们再进一步的使用它
int a = 5; // 定义int类型变量, 并赋值
cout << a << endl; // 输出变量a的值: 5
cout << &a << endl; // 输出变量a的地址: 0x7ffeefbff52c
int & b = a;
cout << b << endl; // 引用b的值: 5
cout << &b << endl; // 引用b的地址: 0x7ffeefbff52c复制代码
能够看到, 上下两组输出结果是同样的, 也就是说引用b, 和变量a都是表明的同一块内存地址
因此更改b的值, a的值也会变
b = 8;
cout << a << endl;
复制代码
像这样: 是错误的
int & b;
// 编译器提示信息: Declaration of reference variable 'b' requires an initializer, 变量b须要一个初始化器
引用的做用
a. 引用用于函数的参数表, 不产生临时对象, 提升安全性和执行效率
void swap(int & a, int & b) {
int temp = a;
a = b;
b = temp;
}
int a = 5;
int b = 10;
cout << "交换前 " << "a的值:" << a << " b的值:" << b << endl;
swap(a, b);
cout << "交换后 " << "a的值:" << a << " b的值:" << b << endl;
复制代码
b. 引用用于函数返回值 用到的时候不多, 由于不安全, 你可能问访问到一个已经被释放的对象
引用能够这么使用
int a = 5;
int & b = a; // 声明引用
int * p = &a; // 声明指向变量的指针
int * q = &b; // 声明指向引用的指针
int * & r = p; // 声明指针对指针的引用 (p, r是指针, 等号左边 * 表明声明的r是指针, &表明声明的r是引用)复制代码
可是不能这么使用
int & & s = a; // 不能声明引用的引用
复制代码
指针和引用的区别和联系
联系: 它们都会对内存地址上存在的变量进行修改, 但引用不占用新的地址, 节省开销
区别: 指针是低级的直接操做内存地址的机制, 可由整型数强制类型转换获得, 功能强大, 可是容易出错, 引用是较高级的封装了指针的特性, 不直接操做内存地址, 不可强制类型转换获得, 安全性高
a. 指向常量的指针
int a = 5;
int b = 8;
const int * p = &a; // 指向常量的指针, 也就是"*p="不成立, 也就是不能经过指针p修改指向的内存地址中的值, 可是p的值能够更改
*p = 10; // 错误
p = &b; // 正确
复制代码
int a = 5;
int b = 8;
int * const p = &a; // 常量指针, 也就是"p="不成立, 也就是p的值不能更改, 可是是它所指向的内存地址中的值能够修改
*p = 10; // 正确
p = &b; // 错误
复制代码
c. 指向常量的常量指针
int a = 5;
int b = 8;
const int * const p = &a; // 指向常量的的常量指针, 既不能够经过p修改它所指向的内存地址中的值, 也不可更改p的值
*p = 10; // 错误
p = &b; // 错误复制代码
// 定义数组
int a[] = {3, 2, 1, 5, 4};
int b[5] = {};
// 数组反转
// reverse(a, a + 5);
// 升幂排序
// sort(a, a + 5);
// 降幂排序
// sort (a, a+5, greater<int>());
// 复制数组内容
// copy(a, a + 5, b);
// 逆向复制数组a中的内容到数组b
// reverse_copy(a, a + 5, b);
// 检索
// int * p = find(a, a + 5, 5);
// cout << p << endl;
// cout << a + 5 << endl;
// if (p == a + 5) {
// cout << "没有值为5的数组元素" << endl;
// } else {
// cout << "有值为5的数组元素" << endl;
// }
// 正向输出
copy(a, a + 5, ostream_iterator<int>(cout, "数字 "));
cout << endl;
// 逆向输出
reverse_copy(a, a + 5, ostream_iterator<int>(cout, "数字 "));
for (int i = 0; i < 5; i++) {
cout << a[i] << " ";
}
cout << endl;
for (int i = 0; i < 5; i++) {
cout << b[i] << " ";
}
cout << endl;复制代码
使用编辑器编辑一个C++源程序, 也就是源文件, 扩展名为.cpp, 像这样: Hello.cpp;
使用C++编译器对这个源程序进行编译, 产生目标文件, 扩展名为.obj, 像这样: Hello.obj;
使用链接程序, 将目标文件与系统库链接, 产生可执行文件, 扩展名为.exe, 你这样: Hello.exe
任什么时候候咱们都不要忘记语言只是咱们解决问题的工具, 思想才是咱们解决问题的本质, 技术不深, 咱们能够去查, 去练习, 而思想只有慢慢的去陪养, 去思考, 去总结!