Skip to content
Word Count: 1.1k | Expected Read Time: 4 min

ECE244笔记-1-C++基础·类型与传参

常见类型

  1. int 类似于Rust中的i32类型, 使用32bit存储整数 (31bit数字, 1bit符号)

  2. short 类似Rust i16

  3. long 存储大于32bit的整数

  4. float, double 单/双精度浮点数

  5. bool

  6. char 同C语言, 使用 8bit存储字符

  7. string 于C语言不同, C++标准库提供了 string 头文件, 用于实现更加方便的字符串处理. 例如如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <iostream>
    #include <string>
    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
2
3
return_type function_name(parameter_list) {
// function body
}

值传递

给函数传递参数一般有三种常见的方法: Pass-by-value (按值传递), Pass-by-pointer (指针传递), Pass-by-reference (引用传递)

Pass-by-value (按值传递): 在函数的内存帧中创建一个本地版本的变量, 独立于调用者中那一份. 对该本地版本做修改, 不会对原变量产生任何影响

按值传递不是能解决所有的问题, 因为他隔离了调用者中的变量和函数本地变量. 举个例子, 我们无法通过按值传递实现一个swap函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
void swapByValue(int a, int b);
int main(void) {
int a = 5, b = 10;
cout << "Before swapping: " << "a = " << a << ", b = " << b <<
endl;
swapByValue(a, b);
cout << "After swapping: " << "a = " << a << ", b = " << b << endl
;
return 0;
}
void swapByValue(int a, int b) {
int temp = a;
a = b;
b = temp;
}

所以, 我们需要一种可以把影响传递到调用者中的传递方式 - 指针传递

Pass-by-pointer (指针传递): 传递一个指向存储变量值内存地址的指针, 通过修改改内存地址的值, 实现对调用者函数中变量值的修改

以下是一个指针传递版本的swap:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
void swapByPointers(int* pa, int* pb);
int main(void) {
int a = 5, b = 10;
cout << "Before swapping: " << "a = " << a << ", b = " << b <<
endl;
swapByPointers(&a, &b);
cout << "After swapping: " << "a = " << a << ", b = " << b << endl
;
return 0;
}
void swapByPointers(int* pa, int* pb) {
int temp = *pa;
*pa = *pb;
*pb = temp;
}

指针传递同样不是完美的, 指针传递较为复杂, 且容易引入错误. 为了解决这个问题, C++引入了引用这个概念.

引用有如下性质

  1. 引用在定义的时候必须初始化
  2. 引用无法被重新赋值为另一个变量: 类似于Rust中的可变借用, 但是区别在于C++没有Rust中对于内存安全的检查, 也不可以Rebind. 此处将引用初始化时理解为一种永久绑定(Binding), 而后把引用当作原函数的别名使用(alias).
  3. 引用不是一个独立的变量: 引用 没有独立的内存地址
  4. **引用不是指针!!! **: 引用更多是原函数的别名, 不可以对于引用使用&, *这些引用, 解引用操作.

Pass-by-reference (引用传递): 传递一个变量的 “别名”

这是一个引用传递版本的swap:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;

void swap(int& x, int& y);
int main(void) {
int a = 10;
int b = 20;
swap(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}

void swap(int& x, int& y) {
int tmp = y;
y = x;
x = tmp;
}

可以很明显的发现, 该版本的代码实现相比指针传递简单了许多

指针 vs. 引用

  1. 引用比指针更加安全, 引用不允许为NULL, 且强制初始化, 避免了解引用空指针造成的内存安全问题

  2. 引用不占用额外内存空间: 引用是原变量的别名, 而指针需要一块额外内存存储目标变量的内存地址

  3. 引用不可以被重新赋值为其他变量

Citation

该学习笔记基于如下教材, 本文仅为对本书部分引用的翻译和解读
Salma Emara, Khufu: OOP using C++

About this Post

This post is written by Jinyuan Zhou, licensed under CC BY-NC 4.0.

#C/C++ #ECE244