常见类型
int类似于Rust中的i32类型, 使用32bit存储整数 (31bit数字, 1bit符号)short类似Rust i16long存储大于32bit的整数float,double单/双精度浮点数bool略char同C语言, 使用 8bit存储字符string于C语言不同, C++标准库提供了string头文件, 用于实现更加方便的字符串处理. 例如如下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using namespace std;
int main(void) {
string prePhrase = "This course is ",
postPhrase = " Programming Fundamentals!", blank =
"________";
cout << "Fill in the blank of the following sentence" << endl;
cout << prePhrase << blank << postPhrase << endl;
cin >> blank;
if (blank == "ECE244") {
cout << "Correct!" << endl;
string sentence = prePhrase + blank + postPhrase;
cout << sentence << endl;
} else {
cout << "Incorrect!" << endl;
}
return 0;
}
循环
哈哈哈, 和C一样, 略
函数
1 | return_type function_name(parameter_list) { |
值传递
给函数传递参数一般有三种常见的方法: Pass-by-value (按值传递), Pass-by-pointer (指针传递), Pass-by-reference (引用传递)
Pass-by-value (按值传递): 在函数的内存帧中创建一个本地版本的变量, 独立于调用者中那一份. 对该本地版本做修改, 不会对原变量产生任何影响
按值传递不是能解决所有的问题, 因为他隔离了调用者中的变量和函数本地变量. 举个例子, 我们无法通过按值传递实现一个swap函数
1 |
|
所以, 我们需要一种可以把影响传递到调用者中的传递方式 - 指针传递
Pass-by-pointer (指针传递): 传递一个指向存储变量值内存地址的指针, 通过修改改内存地址的值, 实现对调用者函数中变量值的修改
以下是一个指针传递版本的swap:
1 |
|
指针传递同样不是完美的, 指针传递较为复杂, 且容易引入错误. 为了解决这个问题, C++引入了引用这个概念.
引用有如下性质
- 引用在定义的时候必须初始化
- 引用无法被重新赋值为另一个变量: 类似于Rust中的可变借用, 但是区别在于C++没有Rust中对于内存安全的检查, 也不可以Rebind. 此处将引用初始化时理解为一种永久绑定(Binding), 而后把引用当作原函数的别名使用(alias).
- 引用不是一个独立的变量: 引用 没有独立的内存地址
- **引用不是指针!!! **: 引用更多是原函数的别名, 不可以对于引用使用
&,*这些引用, 解引用操作.
Pass-by-reference (引用传递): 传递一个变量的 “别名”
这是一个引用传递版本的swap:
1 |
|
可以很明显的发现, 该版本的代码实现相比指针传递简单了许多
指针 vs. 引用
引用比指针更加安全, 引用不允许为NULL, 且强制初始化, 避免了解引用空指针造成的内存安全问题
引用不占用额外内存空间: 引用是原变量的别名, 而指针需要一块额外内存存储目标变量的内存地址
引用不可以被重新赋值为其他变量
Citation
该学习笔记基于如下教材, 本文仅为对本书部分引用的翻译和解读
Salma Emara, Khufu: OOP using C++