C++动态内存管理

C++中,动态内存管理是通过一对运算符来完成:new 和 delete。new操作符在内存中为对象分配空间并返回一个指向该对象的指针,delete接收一个动态对象的指针,销毁该对象,并释放与之相关的内存。

手动管理内存看起来只有这两个操作,似乎很轻松,但实际上这是一件非常繁琐的事情,分配了内存但没有释放内存的场景发生的概率太大了!回想一下,你有多少次打开抽屉却没关上,拿出来的护肤品擦完脸之后却忘了放回去,吃完饭却忘了洗碗。类似这种没有收尾的事情我做的太多了。(以上这些都是在实际生活中我爱人批评我的点)

我连这种明面上的事情都能忘记收尾,何况分配内存!所以为了世界和平,我放弃了手动管理内存。好在C++引入了两种智能指针:shared_ptr和unique_ptr。这两种智能指针可以自动管理内存。(生活中要是有这种东西能自动帮我把东西放回去该多好!)

接下来就介绍一下这两种智能指针的使用方法,使用shared_ptr和unique_ptr需要引入头文件memory。

(更多…)

C++入门:三、函数

这是我学习C++的第三篇笔记,函数。我的学习路径是

1. 变量和数据类型
2. 流程控制
3. 函数
4. 面向对象
5. 标准库

现在学习的是函数的声明、定义、调用等相关知识。

函数声明和定义

函数的声明包含返回类型,函数名字,0个或者多个形参,无函数体,通常在头文件中对函数进行声明。

返回类型 函数名称(参数类型1 参数1, 参数类型2 参数2);
// 例如声明一个求阶乘的函数
int fact(int val);

函数的定义包含返回类型,函数名字,0个或多个形参,以及函数体。

返回类型 函数名称(参数类型1 参数1, 参数类型2 参数2) {
    函数体
}

比如写一个求阶乘的函数,可以写成下面这样

int fact(int val)
{
    int ret = 1;
    while (val > 1) {
        ret *= val--; // ret乘val的值返回给ret,val再自减1
    }
    return ret;
}

写一些简单的函数大多数语言都差不多,不过可惜每种语言或多或少都有自己的特色,这是比较令人头秃的地方。

(更多…)

C++入门:二、流程控制

这是我的C++学习笔记第二篇,学习流程控制语句

我的学习路径如下:

1. 变量和数据类型
2. 流程控制
3. 函数声明和调用
4. 面向对象
5. 标准库

顺序

顺序语句为一条一条顺序执行的语句。C++的顺序语句有赋值,四则运算,位运算,逻辑运算等

int i = 0;
int j = i + 1;

条件

C++提供两种条件,一个是if条件语句,另一个是switch选择语句。

if条件

// 单个条件
if (条件) {
   语句 //条件成立则执行语句
}

// 带有else的条件
if (条件) {
    语句
} else {
    语句
}

// 带有else if 的条件
if (条件1) {
    语句1
} else if (条件2) {
    语句2
} else {
    语句3
}

switch条件

switch (值) {
    case "值1":
        语句1
    break;
    case "值2":
        语句2
    break;
    default:
        语句3
    break;
}

循环

循环语句有while循环,for循环,do…while循环。

while 循环

while (条件) {
   语句
   ...
}

条件为真,就一直执行语句。如果初次条件不为真,语句一次都不会执行。

for 循环

for (初始; 条件; 下一步) {
    语句
    ...
}

更简单的for循环,范围for循环。类似与遍历的效果,序列可以是一个数组,vector,string等迭代器。

for (变量定义 : 序列) {
    语句
}

比如遍历一个vector

vector<int> v = {0,1,2,3,4,5};
for (auto &r: v) {
    r *= 2;
}

do…while 循环

do {
    语句
} while(条件);

异常

try 语句

try用作处理异常,用法

try {
    可能发生异常的语句
} catch (异常声明) {
    处理异常的语句
} catch (异常声明) {
    处理异常的语句
}
...

throw表达式

throw通常用于抛出一个异常,比如

throw runtime_error("error")

C++入门:一、变量和数据类型

这是我的C++学习笔记第一篇,同所有的程序语言学习路径一样,首先学习的是变量和数据类型。

我的学习路径如下:

1. 变量和数据类型
2. 流程控制
3. 函数声明和调用
4. 面向对象
5. 标准库

这一章,学习的是变量和数据类型,需要了解的有:

1. 变量怎么定义?
2. 常见的都有哪些数据类型,占用的内存是多少?
3. 变量的作用域都有哪些?
4. 变量的生命周期是什么?

了解这些,对于变量基本就够了。

Hello world

在开始之前,先写一个hello world来熟悉一下程序的主要结构以及如何打印一个变量。

#include <iostream>

int main () {
    std::cout << "hello world" << std::endl;
    return 0;
}

iostream提供标准输入输出的头文件,程序以main函数问入口,std为标准库的命名空间,“<<” 为输出操作符,std::cout为标准输出,std::endl为结束符,表示将等待输出的内容从内存传送到标准输出。

(更多…)