C++学习笔记

基础的输入与输出

  1. 输出工具cout

    1
    cout << "Hello World"; // 输出Hello World

    cout可根据变量类型自动识别输出格式,免去printf中要使用的如%d的格式控制符。

  2. 换行符endl

    1
    cout << "Hello World" << endl; // 输出Hello World并换行

    等效于输出"\n"

  3. 输入工具cin

    1
    2
    int a;
    cin >> a; // 输入a的值

    cin根据变量类型自动识别输入格式,免去scanf中要使用的如%d的格式控制符。

  4. 插入运算符<<>>

    指明信息流动的路径

cout是一个ostream类对象,cin是istream类对象,它们都定义在iostream头文件中。要使用cout和cin,必须在程序开头包含iostream头文件,并使用using namespace std;编译指令使std名称空间内的名称可用。

数据处理

  1. {}方式初始化时进行的转换

    也被称为统一初始化列表初始化,旨在为各种类型的初始化提供一套统一且更安全的语法。在类型转换方面,它引入了更严格的检查规则。

    其禁止窄化转换(即可能导致数据丢失的转换),但允许安全转换(不会导致数据丢失)。

  2. 强制类型转换

    表示方式:

    1
    2
    (type) value;
    type (value);

    强制类型转换不会改变变量本身,而是返回一个转换后的新值。

    C++还引入了4个强制类型转换符,其使用要求更为严格:

    1. static_cast<>

      可将值从一种数值类型转换为另一种数值类型

      1
      static_cast<typeName> (thorn)
    2. 等待补充

  3. C++11新增的auto关键字

    1
    auto item = value;

    编译器根据初始化表达式推断变量的类型。该声明方式适合处理复杂的类型,如STL(标准模块库)容器类型。

字符串

  1. \0表示空字符,用于标记字符串的结尾,不以\0结尾的只能被称为字符数组而非字符串。可用插入\0的方式截断字符串。

  2. 读取字符输入的函数:

    in C:

    1. gets(char *str)
      读取整行输入直到遇到换行符,同时添加空字符使其成为字符串。gets函数不检查缓冲区是否溢出,故已在新标准中被废除。(对应的puts()会在字符串末尾自动添加换行符)
    2. fgets(char* str,int n,FILE *stream):读取到n-1个字符或遇到换行符时停止,其将换行符一并读入数组中。(对应的fputs()不会在末尾添加换行符)
    3. gets_s(char *str,rsize_t n):增加一个参数限制读取长度,其余与gets一致。
    4. s_gets(char *str,int n):自定义函数,为fgets添加替换换行符为空字符的功能。

    in C++:

    1. cin.getline(char*str,int n):读取整行,第二个参数为要读取的字符数,当其为n,函数最多读取n-1个字符,最后一个字符设置为空字符,该成员函数在读取指定书目的字符或遇到换行符时停止读取。
    2. cin.get(char*str,int n):读取到行尾,但是该成员函数读取到换行符时停止,换行符被留在缓冲区中。其另一种用法是不带任何参数时调用,只读取一个字符(包括换行符),可用于处理换行符,为下一行输入做准备。
    3. getline(cin,str):其不是istream类的类方法,将cin作为参数表明其到何处查找输入,其也无需指出长度,因为其接受的输入Str是string对象,会自动调整大小。
  3. string类

    需包含string头文件(不是cstring或string.h),其初始化操作(包括列表初始化)、使用cin/cout进行输入输出、用数组表示法访问其中字符的方式与C风格字符串相同。

    区别:

    1. 可将string对象声明为简单变量,可突破不能将一个数组赋值给另一个数组的限制。
    2. 其简化了字符串合并操作,可使用加法运算符将两个字符串连接起来。而且string可自动调整大小,不用关心长度。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <iostream>
    #include <string>
    #include <cstring>
    using namespace std;
    int main() {
    // C 风格字符串
    char str1[20] = "Hello";
    strcat(str1, " World"); // 拼接,需保证数组够大
    cout << str1 << endl;
    // C++ string
    string str2 = "Hello";
    str2 += " World"; // 自动扩展,无需关心长度
    cout << str2 << endl;
    return 0;
    }
  4. 其他形式的字符串字面值
    除char类型外,C++还支持wchar_t、char16_t和char32_t类型的字符串字面值。这些字符串字面值的前缀分别是L、u和U。表示示例如下:

    1
    2
    3
    wchar_t title[]=L"hello";   // 宽字符字符串
    char16_t name[]=u"hello"; // Unicode字符16位字符串
    char32_t car[]=U"hello"; // Unicode字符32位字符串

    还有一种新增的类型是原始字符串raw,字符表示自己而不进行转义,其前缀为R,表示示例如下:

    1
    const char* quote = R"(Jim "King" Smith)";

杂项

  1. sqrt()函数

    返回平方根