引言从万能的《C++ Primer Plus》 里引用这样一段话: 在C++发展的早期,大多数人都没有想到模板函数和模板类会有这么强大而有用,他们甚至没有就这个主题发挥想象力。但聪明而专注的程序员挑战模板技术的极限,阐述了各种可能性。根据熟悉模板的程序员提供的反馈,C++98标准做了相应的修改,并添加了相应的标准模板库。从此以后,模板程序员在不断探索各种可能性,并消除模板的局限性。 “template”的曲折历史和程序员们的”laziness”可见一斑(笑)。譬如,我们在做算法题的时候,使用标准模板库中的容器类可以极大地减少代码量,提高做题效率。 在这个专题中,我打算用几篇的内容,对模板的定义与使用,算法竞赛常用的STL,以及C++11的一些新特性进行简要的讲解(或许只能算作介绍)。希望能对即将到来的蓝桥杯省赛和ACM校赛有些许帮助。 函数模板使用函数模板的原因之前我们讲了函数重载。使用函数重载,可以减少函数名称的冗余。但是我们仍要对各重载函数一一进行实现,尽管这几个函数都基本一样: 1234567891011void Swap(int & a,int & ...
引言上一节中我们举了这样一个例子: 123456789101112131415161718#include <iostream>class MyClass{public: int _a; char _b; int add(){ return (_a+_b); }};int main(){ MyClass m,n; m._a=1; m._b=2; n._a=3; n._b=4; std::cout<<m.add(); return 0;} 我们是一个一个地将对象的成员进行初始化的 。这样不仅麻烦 ,而且使代码显得太长。 或许我们可以在类中定义一个初始化的函数 : 12345678910class ClassName{public: void init(int a,char b){ _a=a; _b=b; }private: int _a; cha ...
引言本节我们将学习C++中类的存储模型,据此更好地讲解this指针及其作用。由于C++的类和C语言中的结构体大致相当,所以我们先回顾C中结构体的存储方式,即字节对齐 。 先看个例子学习C语言时,我们可能了解过结构体的字节对齐 。数据结构老师讲的合理吗……它是结构体的成员进行存储时采用的方式。比如,对于下面这样一个结构体: 1234567typedef struct MyStruct{ int a; char b; int c; short int d; char e;}MyStruct; 可否想过,如果我们对其进行取大小运算,即sizeof(MyStruct),结果将会是多少? 我们可能会直接将各个成员的大小加起来,所以结果将会是4+1+4+2+1=12 。我们不妨去程序里面验证一下: 结果和我们之前计算的竟然不一样!我不演了,这个问题就出在结构体的字节对齐 。 字节对齐的含义字节对齐可以表述为:各种类型的数据按照一定的规则在空间上排列,而不是按顺序一个接一个地排放。 就上面的例子而言,结构体的中每四个字节分一段,所以储存的结果为: ...
C++是一门面向对象的语言。C++刚出现的时候,被称为”C with Classes”,可见类之于C++的重要性。在本章我们将关注C++的类及其用法。 引言:C语言的结构体C语言中,我们学习了结构体。使用结构体可以把不同类型的变量组合在一起。 123456struct MyStruct{ int a; char b; float c;};struct MyStruct mystruct; 使用结构体,要分清下面几个概念: 结构体名 :MyStruct是结构体的名字。 结构体类型 :struct Mystruct是一个结构体类型 结构体变量 :struct MyStruct类型的变量mystruct是一个结构体变量。 为了避免每次定义结构体变量的时候都要写 struct MyStruct ,我们常常采用 typedef 的方式将结构体名升级为类型名: 123456typedef struct MyStruct{ int a; char b; float c;}MyStruct;MyStruct myst ...
引言本节涉及到预处理和编译的相关知识,我们先来回顾一下C/C++程序执行的过程(以g++编译器为例)。 预处理 的指令为cpp main.cpp > main.i。 它主要进行的是头文件的展开与宏的替换。预处理后得到的文件为main.i。 编译 的指令为g++ -S main.i。 编译后得到的文件为main.s。 汇编 的指令为as -o main.o main.s。 汇编得到的文件为main.o。.o文件时我们经常见到的中间文件(直接用IDE应该很少见到)。 链接 的指令为g++ -o main main.o。 Windows平台下生成的文件就是我们经常看到的.exe (可执行文件)。 如果读者还有疑惑或不熟悉,请移步这篇教程: C/C++的执行过程https://www.fullcomb.top/post/fb935c76.html 宏(Macro)宏的使用 定义一个符号常量。这是我们经常使用的宏定义的形式,如#define PI 3.14 。它的好处是便于代码的维护。 宏函数替换常用的语句。如#define MAX(x,y) ((x)>(y)?(x): ...
引言在我们学习C语言的指针 的时候大多数教材都会讲到“交换a和b两个数 ”的例子: 123456789101112#include <stdio.h>void swap(int a,int b){ int temp=a; a=b; b=temp;}int main(){ int a=1,b=2; swap(a,b); printf("%d,%d",a,b); return 0;} 由于实参的保护机制,这样的交换是不成功的。要达到交换的目的,C语言告诉我们应该使用指针: 实参的保护机制是C语言的内容,但是为了保证这个C++系列 知识点的完备性,我尽可能地穿插讲解一些C语言的知识点。 知识点补充:实参的保护机制 TODO,涉及到汇编内容比较多,我也不怎么熟悉还得捋捋,但是又得尽可能讲简单点……还没想好怎么写比较好……看来都还给老师了…… 123456789 ...
引言实例一读者也许使用过一些图形库进行图形绘制或游戏制作,如 自己先想想再把鼠标移过来。使用这些库的时候,我们直接调用里面的函数(API)即可实现想要的功能。 API : Application Programming Interface,应用程序编程接口 而在调用这些API时,经常会遇到这样的情况:要使用的函数形参有很多。但是,我们往往只需要设置其中的某些参数,或者不知道其他参数设置了有什么用。这时就更希望那些我们没有自定义的参数使用比较合理的默认值。这样就不必输入全部的参数,使用起来也更加简便。 要实现这点,在C++中,就要用到省略参数。 实例二若要求我们实现一个加法器的程序,使它既能进行int相加,也能进行double相加和float相加。C语言中,我们的做法是分别定义下列的加法函数,然后针对不同类型的数据分别调用。 123int add_int(int a,int b); double add_double(double a,double b);float add_float(float a,float b); 有没有办法可以只用一个函数add(),既能实现int相加,也能 ...
引言学习一门语言,一般都是从Hello,world!开始的。我们先来看一下C++的Hello,world!。 123456#include <iostream>using namespace std;int main(){ cout<<"Hello,world!"<<endl; return 0;} 这时初学者一般会有两个疑惑: namespace是什么鬼? cout和endl又是什么? 为什么头文件没有.h? 这三个问题将在本节解决。 命名空间情景在使用C语言进行协同项目开发时,可能会有这样的情况:A和B在编写各自的模块时,都定义了相同名字的函数。他们各自的代码能够编译通过,但是最后合并的时候,编译器却会报错。这个问题就是重定义。 如下图,A和B都定义了一个名叫foo的函数。我们分别编译A和B的代码,是没有问题的。但是,最后链接的时候,编译器报错”ambiguating new declaration“(重定义)。 如果对C的编译和链接有疑惑,可以去简单看看这篇文章: 编译与链接https ...
这次讲一个可以说过时,但是也可以说永不过时的内容:C/C++的编译与链接。说它过时,因为我们学习C语言的时候,第一个讲的就是这个知识点;而它不过时,是因为它是程序运行的基础。比如在一个C/C++工程中,可能会有很多的 .c/.cpp、.h/.hpp文件,这时候我们要运行这个工程,就离不开编译与链接。 接下来将在命令行一步步地进行这个过程。 编译与链接C/C++的执行过程包括预处理(Prepocessing)、编译(Compilation)、汇编(Assembly)、链接(Link)四步。我们常常忽略预处理与汇编,直接把这个过程称为编译与链接;有时候甚至直接用编译来代指这整个过程(虽然可能是不标准的说法)。 下面两张图总结C/C++的编译与链接: 预处理(Preprocessing)以 test.c 为例,对它进行预处理的命令是:cpp test.c > test.i。它的作用是将 test.c 中包含的头文件和定义的宏 (Macro) 展开,得到 test.i 文件。 .i 文件,它也是 C 文件的一种,即里面的代码也是C语言。 程序中进行预处理的标志是 #,常见的预处理指 ...
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick StartCreate a new post1$ hexo new "My New Post" More info: Writing Run server1$ hexo server More info: Server Generate static files1$ hexo generate More info: Generating Deploy to remote sites1$ hexo deploy More info: Deployment
avatar
Sato
我们的前方究竟会通往何处?
Follow Me In Github
公告

莱莎的炼金工房

十年炼金无人问,一朝肉腿天下知。

住在村裡的萊莎有如鄰家女孩,是一位“再普通不過”的少女。
某日,萊莎一行下定決心,前往禁止進入的「浮島對岸」,展開首次探險活動。
于是,僅限今夏的冒險,从此开始。