主要讲解一些非面向对象编程的语法功能
1.引用(重点)
1.1 概念
引用是一个特殊的变量类型。引用是指针的一个平替,引用相当于给一个已经存在的变量"起别名"
语法:类型 &引用变量名=已经定义过的变量

操作引用和操作原变量完全一样,引用的变量和原变量地址相同

注意:引用类型和原变量的类型相同
1.2 特点:
- 一个变量可以有多个别名

引用必须初始化,不能赋值为NULL

可以改变引用的值,但是不能再次使其成为其他变量的引用
声明引用的时候,可以引用纯数值的,在前面添加const修饰

可以将变量的引用地址赋值给一个指针,指针还是执行原变量的地址

可以对指针建立引用

- 可以使用const修饰引用,此时如果原变量的值改变,引用的值也会发生变化

1.3 引用的参数
【思考】
写一个函数,函数有两个参数a和b,函数的功能是交换传入的两个参数传入的变量的值。
#include <iostream> // 引入头文件 标准输入输出流`
`using namespace std;`
`void swap1(int *a,int *b)`
`{`
` // 三杯水的交换方式`
` int tem=*a;`
` *a=*b;`
` *b=tem;`
` cout << a << endl;`
` cout << b << endl;`
`}`
`void swap2(int *a,int* b)`
`{`
` // 异或的交换方式`
` *a=*a^*b;`
` *b=*a^*b;`
` *a=*a^*b;`
`}`
`// 引用参数`
`void swap3(int & a1,int & b1)`
`{`
` // 异或的交换方式`
` a1=a1^b1;`
` b1=a1^b1;`
` a1=a1^b1;`
`}`
`int main()`
`{`
` int a=10;`
` int b=20;`
` swap3(a,b);`
` cout <<"-------" << endl;`
` cout << a << endl;`
` cout << b << endl;`
` return 0;`
`}`
`
引用作为参数时,不会开辟新的内存空间,同时和原变量的操作保持一致。
引用作为参数时,在不参与计算或者改变数据的情况下,建议使用const修饰参数

练习:
#include <iostream>
using namespace std;
void modifyValue(int &ref) {
ref = 20;
}
int main() {
int num = 10;
modifyValue(num);
cout << num << endl;
return 0;
}
答案:20
2.赋值(熟悉)
除了 =赋值以外,c++添加了新的赋值方式

c++11 对上述的赋值方式进行了升级

3.键盘键入(熟悉)
cin可以将用户输入在命令行的内容赋值到变量中
cin和cout都属于iostream头文件

输入字符串时,不使用空格结束,可以选择使用getline,getline不写第三个参数默认回车结束

4.string(掌握)
string不是C++的基本数据类型,它是一个C++标准库中的字符串类,使用时需要引入头文件#include <string>,而不是string.h。
string在绝大多数情况下可以代替C语言中的字符串,不必担心内存是否足够和字符串长度等 ,其内部还包含了很多字符串处理函数,可以完成各种情况下的字符串处理功能。
获取字符串的长度: 字符串变量名.size(); 字符串变量名.length();
获取字符串的单个字符: 通过下标 ( 下标: 中括号 或者 .at(下标) )
#include <iostream>`
`#include <string>` ` // 引入头文件`
`using namespace std;`
`int main()`
`{`
` string str="hello";`
`// 长度:`
` cout << str.size () << endl;// 5`
` cout << str.length () << endl;` `// 5`
` // 单个字符:`
` cout << str[0] << endl;` `// h`
` cout << str[2] << endl; // l`
` cout << str.at(1) << endl; // e`
` cout <<"-------" << endl;`
`// at方式越界会抛出异常信息 停止程序`
` cout << str.at(100) << endl;` `// 程序异常停止`
` cout << "主函数结束" << endl;`
` return 0;`
`}`
`
string循环遍历方式:
- for 循环
- for each (c++11 提出)
语法:
for(元素的类型 变量名:容器的名称)
{
// 操作变量
}
迭代器遍历 (略 后面到容器再讲解)

字符串类型转换:

5.函数
5.1 内联函数(掌握)
内联函数用于取代c语言中的宏定义的函数,内联函数在编译的时候,直接把函数体展开到主函数中编译 ,在运行期可以减少调用的开销。(减少调用的开销,但是占用内存)
通常有以下特征的:
- 代码长度5行以内
- 不包含复杂的控制语句
- 被频繁的调用

手动添加inline关键字表示我建议将此函数定义为内联函数,但是最终的编译效果是否按照内联的方式处理的,不确定,添加inline只是给编译器一个建议,最终取决于编译器自己。
5.2 函数重载(重点)
c++中允许多个函数使用同一个名称,但是函数的参数要不同(参数的类型或者是参数个数)这种情况称之为函数重载。
函数的重载只和参数类型和个数不同有关,和返回值等其他因素都没有关系。
#include <iostream> // 引入头文件 标准输入输出流`
`#include <string>`
`using namespace std;`
`int fun(int a,int b)`
`{`
` return a+b;`
`}`
`int fun(int a)`
`{`
` cout << a << endl;`
` return a;`
`}`
`int fun(double a)`
`{`
` cout << "double :"<< a << endl;`
` return 1;`
`}`
`int main()`
`{`
` int ret=fun(1,2);`
` cout << ret << endl; // 3`
` fun(3.14); // double :3.14`
` fun(100); // 100`
` return 0;`
`}
函数重载时,整型使用int类型 (优先级高),浮点型使用double(优先级高)
5.3 函数的默认(缺省)值 (掌握)
c++中允许给函数的参数设置默认值,调用时可以选择性的传入参数,不传递,使用默认值,传递参数,使用传递的新值。

注意:
- 如果函数声明和定义分离,默认值只能出现一次

- 向后原则(向右原则):当函数的某一个参数有了默认值之后,后续的所有参数都必须有默认值
- 函数的重载最好不要和函数默认值一起使用,一起使用会产生二义性问题,代码的可读性也会下降

5.4 哑元函数(熟悉)
函数的参数只有类型,没有名称,此时此参数就称之为哑元,这个函数就称之为哑元函数

主要用途:
- 保持函数的向前兼容性
#include <iostream>`
`#include <string>`
`using namespace std;`
`void fun(int a,int )`
`{`
` cout << "进行了很复杂的处理...." << endl;`
`}`
`// 后续`
`void a()`
`{`
` fun(1,2);`
` cout << "sfasfd";`
`}`
`void b(int a,int b)`
`{`
` fun(a,b);`
`}`
`void c(int a)`
`{`
` fun(a,100);`
` fun(1000,100);`
`}`
`int main()`
`{`
`a();`
`b(1,2);`
`c(10);`
` return 0;`
`}`
`
区分函数重载
#include <iostream>`
`#include <string>`
`using namespace std;`
`void b(int a,int b)`
`{`
` cout << a << " " << b << endl;`
`}`
`void b(int a,int b,int)`
`{`
` cout << a << " " << b << endl;`
` cout << a << " " << b << endl;`
`}`
`int main()`
`{`
` b(1,2,0);`
` return 0;`
`}`
`
后续学习运算符重载时结合使用
练习:
using namespace std;
void func(int a, int = 0) {
cout << a << endl;
}
int main() {
func(5);
return 0;
}
A) 合法
B) 不合法
C) 仅在 C++11 及以上版本合法
D) 仅在 C++98 合法
答案:A