从C到C++

主要讲解一些非面向对象编程的语法功能

1.引用(重点)

1.1 概念

引用是一个特殊的变量类型。引用是指针的一个平替,引用相当于给一个已经存在的变量"起别名"

语法:类型 &引用变量名=已经定义过的变量

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

注意:引用类型和原变量的类型相同

1.2 特点:

  1. 一个变量可以有多个别名

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

可以改变引用的值,但是不能再次使其成为其他变量的引用

声明引用的时候,可以引用纯数值的,在前面添加const修饰

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

可以对指针建立引用

  1. 可以使用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循环遍历方式:

  1. for 循环
  2. 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++中允许给函数的参数设置默认值,调用时可以选择性的传入参数,不传递,使用默认值,传递参数,使用传递的新值。

注意:

  1. 如果函数声明和定义分离,默认值只能出现一次
  1. 向后原则(向右原则):当函数的某一个参数有了默认值之后,后续的所有参数都必须有默认值
  2. 函数的重载最好不要和函数默认值一起使用,一起使用会产生二义性问题,代码的可读性也会下降

5.4 哑元函数(熟悉)

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

主要用途:

  1. 保持函数的向前兼容性
复制代码
#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

相关推荐
折哥的程序人生 · 物流技术专研1 小时前
《Java 100 天进阶之路》第39篇:Java泛型方法的定义和使用
java·开发语言·后端·面试·求职招聘
天天进步20151 小时前
Tunnelto 源码解析 #1:从 tunnelto --port 8000 看内网穿透的完整链路
开发语言
啄缘之间1 小时前
8.【学习】工业级详细接口约束&覆盖率
开发语言·笔记·学习·uvm·sv
Chase_______1 小时前
【Java基础核心知识点全解·09】Java 内存布局与垃圾回收详解:栈、堆、栈帧、GC Roots 与对象回收
java·开发语言
江南十四行2 小时前
并发编程(四)
开发语言·python
葱卤山猪2 小时前
C++17 联合体
开发语言·c++
折哥的程序人生 · 物流技术专研2 小时前
Java 23 种设计模式:从踩坑到精通 | 抽象工厂 —— 支付/收款如何成套创建?跨平台 UI 如何一键换肤?
java·开发语言·后端·设计模式
方也_arkling2 小时前
【Java-Day11】抽象类和抽象方法
java·开发语言
Ulyanov2 小时前
深入QML-Python通信 构建响应式交互界面的桥梁设计:QML+PySide6现代开发入门(五)
开发语言·python·算法·交互·qml·系统仿真