C++基础2020-11-04 & 2020-11-08

--- 卷王之卷,我愿称之为HKU第一卷!

C++指针

  • 每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址
  • 指针是一个变量,其值为另一个变量的地址
  • 所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数
  • 在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针
  • NULL 指针是一个定义在标准库中的值为零的常量
  • 在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的
  • 内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置
  • 未初始化的变量存有一些垃圾值,导致程序难以调试
  • 在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针
  • 指针可以用关系运算符进行比较
  • 修改 var 的值是非法的。这是因为 var 是一个指向数组开头的常量,不能作为左值
  • 把 ptr 声明为一个数组,由 MAX 个整数指针组成。因此,ptr 中的每个元素,都是一个指向 int 值的指针 int *ptr[MAX];
  • 指向指针的指针(多级间接寻址)
  • 能接受指针作为参数的函数,也能接受数组作为参数
  • C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量

C++ 引用

  • 不存在空引用,引用必须连接到一块合法的内存,引用必须在创建时被初始化
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象,指针可以在任何时候指向到另一个对象
  • void swap(int& x, int& y) 通过引用调用函数
  • double& setValues( int i ) 返回引用
  • 被引用的对象不能超出作用域,返回一个对局部变量的引用是不合法的,但是,可以返回一个对静态变量的引用

C++ 日期 & 时间

  • C++ 标准库没有提供所谓的日期类型,继承了 C 语言用于日期和时间操作的结构和函数
  • 为了使用日期和时间相关的函数和结构,需要引用 头文件
  • 四个与时间相关的类型:clock_t、time_t、size_t 和 tm
  • clock_t、size_t 和 time_t 能够把系统时间和日期表示为某种整数

time函数

  • time_t time(time_t *seconds) 返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位
  • 如果 seconds 不为空,则返回值也存储在变量 seconds 中
  • time.h是早期的头文件, 在C++标准之前就有了, ctime是C++标准的头文件, 两个一般是同一个文件
  • char *ctime(const time_t *timer) 返回一个表示当地时间的字符串
    time_t curtime;
    time(&curtime);
    cout<
  • struct tm *localtime(const time_t *timer)
  • clock_t clock(void) 返回程序执行起(一般为程序的开头),处理器时钟所使用的时间
  • 为了获取 CPU 所使用的秒数,您需要除以 CLOCKS_PER_SEC
  • 在 32 位系统中,CLOCKS_PER_SEC 等于 1000000,该函数大约每 72 分钟会返回相同的值
clock_t st = clock();
...
clock_t ed = clock();
cout<<(double)(ed-st)/CLOCKS_PER_SEC;
  • char *asctime(const struct tm *timeptr) timeptr 是指向 tm 结构的指针
  • struct tm *gmtime(const time_t *timer) 格林尼治标准时间
  • time_t mktime(struct tm *timeptr) 把 timeptr 所指向的结构转换为一个依据本地时区的 time_t 值
    timeinfo = localtime(&rawtime);
    timeinfo->tm_year -= 1900;
    timeinfo->tm_mon -= 1;
    timeinfo->tm_mday = day;
    mktime(timeinfo);
    cout<tm_wday;

  • double difftime(time_t time1, time_t time2)
  • size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) 根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中
  • strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", info);

C++ 基本的输入输出

  • C++ 的 I/O 发生在流中,流是字节序列。如果字节流是从设备流向内存,这叫做输入操作。如果字节流是从内存流向设备,这叫做输出操作
  • ,该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务
  • ,该文件为用户控制的文件处理声明服务。我们将在文件和流的相关章节讨论它的细节
  • cout 对象"连接"到标准输出设备,通常是显示屏
  • C++ 编译器根据要输出变量的数据类型,选择合适的流插入运算符来显示值
  • << 运算符被重载来输出内置类型(整型、浮点型、double 型、字符串和指针)的数据项
  • 预定义的对象 cin 是 iostream 类的一个实例
  • C++ 编译器根据要输入值的数据类型,选择合适的流提取运算符来提取值,并把它存储在给定的变量中
  • 如果要求输入多个数据,可以使用如下语句:cin >> name >> age;,相当于 cin >> name;cin >> age;
  • 预定义的对象 cerr 是 iostream 类的一个实例。cerr 对象附属到标准错误设备,通常也是显示屏,但是 cerr 对象是非缓冲的,且每个流插入到 cerr 都会立即输出
  • 预定义的对象 clog 是 iostream 类的一个实例。clog 对象附属到标准错误设备,通常也是显示屏,但是 clog 对象是缓冲的。这意味着每个流插入到 clog 都会先存储在缓冲区,直到缓冲填满或者缓冲区刷新时才会输出
  • 使用 cerr 流来显示错误消息,而其他的日志消息则使用 clog 流来输出

C++ 数据结构

struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
  • 为了访问结构的成员,我们使用成员访问运算符(.)
  • 可以把结构作为函数参数, void printBook( struct Books book );
  • 为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符
  • 为创建的类型取一个"别名"
typedef struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}Books;
  • 现在,您可以直接使用 Books 来定义 Books 类型的变量,而不需要使用 struct 关键字

你可能感兴趣的:(C++基础2020-11-04 & 2020-11-08)