C++基础教程

​​​​​一、基础知识

1、C++编译流程

以Unix系统编译中间文件为说明:

.cpp—(编译预处理)—>.ii—(编译)—>.s—(汇编)—>.o—(ld,连接)—>.out

2、#include

作用于编译预处理阶段,将被include文件抄送在include所在位置,并会在相应位置写出调用栈,生成中间文件.ii,该中间文件可读

include文件加引号表示先从当前目录寻找索引,加尖括号表示从编译器指定根目录索引,Unix默认为"~//usr/include"目录

3、定义、声明、头文件

.h头文件中只应存放三种代码:

函数声明:没有大括号,形如void fun()

变量声明:extern 变量名

class、结构体定义

extern表示声明一个全局变量

声明只是提示编译器,存在这个东西,并没有定义出实体,不定义直接调用会报错。

4、标准头文件结构

#ifndef HEADER_FLAG

#define HEADER_FLAG

/*头文件*/

#endif

这是为了防止多次include同一个头文件时,每次都抄送到预编译文件中,造成文件过大、循环导入或者结构体定义重复以致报错(声明重复问题不大)。

5、默认参数

在声明中写默认参数,不在定义中给默认参数。

6、调用函数过程

本地变量进入堆栈(未必初始化)

函数参数进入堆栈

返回地址计入堆栈

返回值进入寄存器(运行函数)

pop掉参数

返回值进入堆栈(返回地址,所以要pop掉参数,堆栈先进后出)

7、内联函数

在编译阶段优化,省略上一小结中复杂的堆栈操作,效果如下,

汇编(伪)优化如下,

注意,inline 函数名实际是一个声明,而非定义所以不需要额外声明。实际上以空间换时间(编译会将函数插入调用位置),编译器如果发现函数递归或者过于巨大,可能会拒绝inline操作,函数较小可能被自动inline,建议就是小函数inline(2-3行),超过20行的就不要inline了。

相比于宏,inline可以做类型检查,给出debug提示,下图中C++会提示double的f(a)和%d不匹配,C会直接给出一个奇怪的值,

 8、const

初始化之后不可修改,值得注意的是下图这种,指针和const,到底是地址(指针)还是地址中的内容(对象)是const

重点在于const和*的位置顺序,下述代码中2、3两句等价,

且const变量不能传给其他非const的指针(因为这样有可能造成修改),

函数和const

函数虚参加const表示函数内部不可修改该变量,对输入无要求

return const 对接收函数返回的类型无要求

class和const

const 对象,此时我们不能保证class方法是否修改成员变量,又不能限制函数不能使用(class就没有意义了)

const 对象 or 成员变量是const,要求成员变量必须有初始值,因为事后无法赋值

main文件(编译时可以感知类声明文件),类声明文件,类定义文件:声明、定义(两个位置都需要添加)函数时后面添加const关键字如,int fun() const。

下图运行结果为"f() const",

实际构成了重载,

void f(A* this)

void f(const A* this)

 9、字符串

char *s = "Hello World";  // 将代码段的字符串地址直接付给指针,所以后面尝试修改会报错(代码段不可修改),

             // 应该在开头改写为const char *s

char s[] = "Hello World";  // 数组被写入堆栈,将代码段的字符串拷贝到堆栈

10、引用

char& r = c;  // 引用可以做左值

相当于给c取了一个别名,此时c、r绑定到同一实体。

int x;int y;

int& a = x;

int& b = y;

a = b;  // 等价x=y

注意,引用无法取地址,即 int&* r 的写法是

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值