太一的博客

一个程序学徒

文件与IO(二)

stat

功能:读取文件元数据

1
2
3
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);

...More

文件与IO

什么是I/O

  • 输入/输出是主存和外部设备之间拷贝数据的过程
    • 设备 -> 内存(输入操作)
    • 内存 -> 设备 (输出操作)
  • 高级I/O
    • ANSI C 提供的标准 I/O 库称为高级 I/O,通常也称为带缓冲的 I/O
  • 低级I/O
    • 通常也称为不带缓冲的 I/O

...More

shell

Shell 程序的第一行

  • 第一行: 指定用哪个程序来编译和执行脚本
    • #!/bin/bash
    • #!/bin/sh
    • #!/bin/csh
  • 注释行用 # 符号

...More

makefile

make 工具

  • 利用 make 工具可以自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。
  • make 工具通过一个称为 Makefile 的文件来完成并自动维护编译工作。Makefile 文件描述了整个工程的编译、链接等规则。

...More

gcc学习

GCC编译四个步骤

预处理

预处理环节主要是进行头文件、宏的展开

例如我们有一个简单的hello.c程序:

1
2
3
4
5
6
7
#include <stdio.h>
#define HELLOWORLD "hello world!!!\n"
int main()
{
printf(HELLOWORLD);
return 0;
}

我们可以使用-E选项让gcc只运行C预编译器

...More

cpp面向对象之多态

多态分为两类

  • 静态多态:函数重载 和 运算符重载属于静态多态,复用函数名
  • 动态多态:派生类和虚函数实现运行时多态

静态多态和动态多态区别:

  • 静态多态的函数地址早绑定 - 编译阶段确定函数地址
  • 动态多态的函数地址晚绑定 - 运行阶段确定函数地址

...More

C++子类父类构造的顺序

原因:

  1. 子类构造函数中的某些初始化可能是基于父类的,所以规定构造在类层次的最根处开始,而在每一层,首先调用基类构造函数,然后调用成员对象构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>

using namespace std;

class Base
{
public:
Base()
{
cout << "Base构造函数!" << endl;
}
~Base()
{
cout << "Base析构函数!" << endl;
}
};

class Son:public Base
{
public:
Son()
{
cout << "Son构造函数!" << endl;
}
~Son()
{
cout << "Son析构函数!" << endl;
}
};

void test01()
{
// 继承中的构造和析构顺序如下:
// 先构造父类,再构造子类,析构的顺序与构造的顺序相反
Son s;
// Base构造函数!
// Son构造函数!
// Son析构函数!
// Base析构函数!
}

int main() {
test01();
}

继承方式

C++ 中有三种继承方式:公有继承、保护继承、私有继承

  • 父类中私有成员,子类都是不可以访问的
  • 公有继承,父类访问类型不变
  • 保护继承,把除私有以外的变为保护
  • 私有继承,全都变成私有

...More