跳转至

Introduction⚓︎

1023 个字 46 行代码 预计阅读时间 6 分钟

背景知识
  • 回顾 C 语言:

    • 优势:
      • 高效编程
      • 能直接访问机器,适用于 OS ES(end system)
      • 灵活
    • 劣势:
      • 不充分的类型检查
      • 缺乏对大规模编程的支持
      • 面向过程编程 (procedure-oriented programming)
  • C++ 之父——Bjarne Stroustrup,他的个人网站

  • C++ 的目标:支持面向对象编程(来自 SmallTalk,并结合 C 语言的灵活性和高效性
  • C++ 的提升之处:数据抽象、访问控制、初始化和清除 (cleanup)、引用、函数重载、I/O 流、名称控制、运算符重载、更加安全和强大的内存管理、模板、异常处理 ...
  • C++ 是一种混合语言,支持各种编程范式 (programming paradigm),包括
    • 面向过程编程 (procedure-oriented programming)
    • 面向对象编程 (object-oriented programming, OOP)
    • 泛型编程 (generic programming)

The First C++ Program⚓︎

#include <iostream>
using namespace std;

int main() {
    int number;
    cout << "Enter a decimal number: ";
    cin >> number;
    cout << "The number you entered is " << number << endl;
    return 0;
}

解释

  • C++ 的头文件不用 .h 后缀,且头文件的名称由小写字母构成
  • cincout 分别表示标准输入流和标准输出流
    • 它们都支持连续输入 / 输出多个值
    • 注意:cin 无法读取空白字符(包括空格、换行、制表符等)
  • 方便起见,源程序开头加一句 using namespace std,表示使用标准名称空间。如果没有这句的话,后面的 cincoutendl 都要加上 std:: 前缀,否则无法编译
  • <<>> 分别表示插入符 (insertor) 和提取符 (extractor),并分别适用于 coutcin
  • endl:换行,意为 end of line

C++ 中,任意类型的变量存放的都是一个对象 (object)

Strings⚓︎

  • C++ 中,字符串有专门的类,叫作 string
    • C++ 中,强烈建议使用 string 类表示字符串,因为它是真正的字符串类型。而在 C 语言中实际上没有字符串类型,只是用字符数组和字符指针来模拟字符串,而且后者不太安全
    • C++ 字符串末尾没有 \0 字符。事实上,除了 C 语言外,其他语言都是将字符串本身及其长度存在内存中,因此不用 \0 标记结尾
  • 使用 string 类时,必须在代码开头加上 #include <string>
  • 定义字符串变量:string str;
  • 使用字符串字面量初始化的三种方式:

    string str = "Hello";
    string str("Hello");
    string str{"Hello"};
    

    其中前两种方式是等价的,且这两种方式适用于其他类型(比如 int 等)

  • 赋值:

    char char1[20];
    char char2[20] = "jaguar";
    string str1;
    string str2;
    char1 = char2;                // illegal
    str1 = str2;                  // legal
    
  • 输入和输出

    • 可以直接用cin / cout读写

      cin >> str;
      cout << str;
      
    • 读取一整行字符串:getline(cin, line_var)

    注意

    如果 cin 之后用到 getline,由于 cin 忽略空白字符,输入流里可能还有未被读取的换行符,而 getline 将会读取一行字符串,直到遇到换行符。所以在使用 getline 前,应当先用 cin.get() 读取换行符(这个函数的功能是读取单个字符,然后再用 getline

  • 获取字符串的单个字符:可以像字符数组一样访问字符串

    string s = "Hello";
    s[0] = 'J';
    
  • 字符串拼接 (concatenation)

    string str3;
    str3 = str1 + str2;
    str1 += str2;
    str1 += "lalala";
    
  • 获取长度:s.length();

    • C 中,. 运算符用于检索结构体内的成员
    • 而在 C++ 中,它又是作为一个检索对象成员的运算符
    小技巧

    如果 vscode 中下载了 C/C++ 插件,那么编写代码时在对象后敲个 . 后,vscode 就会显示该对象可用的所有成员。

  • 创建字符串(使用构造函数)

    string(const char *cp, int len);
    string(const string& s2, int pos);
    string(const string& s2, int pos, int len);
    
  • 获取子字符串:substr(int pos, int len);

  • 改变字符串:

    // const 表示不可修改的变量
    insert(size_t pos, const string& s);
    // 从字符串中删除从 pos 位置开始,长度为 len 的子字符串
    erase(size_t pos = 0, size_t len = npos);
    append(const string& str);
    // 用字符串 str 替代原字符串中从 pos 位置,长为 len 的子字符串
    replace(size_t pos, size_t len, const string& str);  
    
  • 寻找字符串

    • 该函数会返回找到的指定字符串首字符在原字符串中的索引,如果未找到,则返回 -1
    size_t find(const string& str, size_t pos = 0) const;
    

从子字符串开始的所有函数(更确切的说法是“方法”)都是字符串对象的成员,因此实际使用时要用 . 运算符访问:

string s = "NoughtQ666";
string subs = s.substr(6, 3);

Pointers⚓︎

  • 指向对象的指针

    string s = "hello";
    string* ps = &s;
    
  • 指针运算符

    • &:获取地址(ps = &s;
    • *:获取对象((*ps).length()
    • ->:调用函数(ps->length()
  • 对象和指针在声明时的区别

    • string s;:此时对象 s 被创建并被初始化
    • string *ps;:此时对象 ps 还不清楚指向何处
  • 赋值

    string s1, s2;
    s1 = s2;
    string *ps1, *ps2;
    ps1 = ps2;
    

评论区

如果大家有什么问题或想法,欢迎在下方留言~