C++学习笔记
第2章 基础
include头文件
- C风格:<math.h>
- C++风格(引入C库):
- C++风格(C++库):
名称空间
- using namespace std;
- std::cout << "";
- using std::cout;
函数
函数原型:只描述函数接口,一般在头文件中
函数定义:函数具体实现代码,一般在库文件中
第3章 处理数据
变量
下划线开头和包含两个下划线的变量由系统使用
输出不同进制
- 二进制:bitset<32> x(num);
- 八进制:cout<<oct;
- 十进制:cout<<dec;
- 十六进制:cout<<hex;
bool类型
任何数字和指针可以隐式转换为bool:非0为true,0为false
const常量
比#define更好:明确类型且限制作用域
强制类型转换
不修改变量本身,会创建一个新的指定值
- C风格:(int) a
- C++:int(a) // 更像函数调用
auto自动推断类型
auto n = 1;
第4章 复合类型
数组
int a[] = {1,2,3};
int a[10] {}; // 省略等号
模板类vector和array可代替数组
字符串
C风格是char a[]数组,以'\0'结尾
char a[] = {'h','e','l','l','o'}; // 这是字符数组,不是字符串
char a[] = {'h','e','l','l','o','\0'}; // 这是正确的字符串
char a[] = "hello"; // 这也是正确的字符串
// sizeof(a) = 6, strlen(a) = 5;
字符串拼接不能用+,直接拼
cout << "hello" "what";
string是C++类型字符串
string s = "hello";
使用+或者+=拼接
字符串操作函数
strcpy() 字符串复制
strcat() 字符串拼接
操作C类型数组不安全,C++类型自动处理不同长度,更安全
原始字符串
string a = R"(this is original)";
结构体
struct MyStruct {
int a;
string b;
}
MyStruct ms; // 省略前面的struct
ms.b = {3, "test"};
共用体
同时只能存储一种类型,占用最大类型的空间
union {
int a;
string b;
}
枚举
enum bits { one = 1, two =2 };
指针
*定义指针,取地址的内容,&取地址
int a = 3;
int *p = &a;
// p 与 a 相同都是数字3,p 与 &a 相同都是一个地址
int * p1,p2; // p1是int指针,p2是int数字
int *p;
*p = 100; // 这样写是错的,定义指针一定要初始化
int *p = new int;
*p = 100; // 这么写才对
指针创建数组
int * arr = new int[10];
delete[] arr;
// 数组名地址与数组地址相同,但sizeof(arr)返回整个数组字节长度
指针创建结构
访问成员用 ->, 不能用.
存储方式
- 自动存储:栈内存,自动释放
- 静态存储:static,全局存在
- 动态存储:堆内存,用 new 和 delete 分配释放
数组的替代
vector可变数组,array长度固定数组,都自动管理内存;数组和array存储在栈中,vector存储在堆中。
第5章 循环和关系表达式
第6章 分支语句和逻辑运算符
第7章 函数
函数参数默认是值传递,会创建一个新变量。
如果参数是数组,那么会创建一个新的数组指针。
如果参数是结构体,也是传递结构的副本。
如果参数是string,也是传递string的副本。
如果参数是类对象,默认是按值传递,也可以传递指针。
函数指针
指向存储函数机器码的地址
double foo(int); // 函数声明
double (*pf)(int); // 函数指针声明,参数和返回值必须与函数相同。pf可以直接当foo函数使用,也可以当形参。
第8章 函数探幽
内联函数
函数声明和定义前都加上inline,编译器会在调用处替换,而不是跳转到这个函数来调用。
函数模板
参数定义泛型类型
template <typename T>
void swap(T &a, T &b) {
T temp;
temp = a;
a = b;
b = temp;
}
第9章 内存模型和名称空间
编译
自己的头文件用"",标准库的头文件用<>
防止重复定义
#ifndef MY_H_
#define MY_H_
// 头文件具体内容
#endif