C++编程基础-1.C&C++
前言:
C++是一门比较难学的语言,当时初学时,老师给的建议是先可以囫囵吞枣的学习一下主干,遇到具体的问题可以去查阅更为官方的书籍。本人感觉还是对我初学阶段起到了很大作用,这里也希望这条建议能够为大家提供一些帮助。因为不是所有的细节都适合在初学阶段去深入研究,也能够防止被本不该去深入研究的问题磨灭掉我们的积极性。
本专栏会由浅入深的去更新C++ 11的相关内容,是对自己刚结束的一轮潦草学习的回顾,也希望能够帮助一些想要学习C++的同学。
早期设计
C++ 最早就叫 “C with Classes”,它是在C语言的基础上发展而来的,所以C++高度兼容C语言。C++ 在很大程度上吸收并兼容了 C 语言的核心特性(如指针、显式内存管理和结构化编程),并在此基础上引入了面向对象、泛型编程等高级抽象机制。
编程范式
C和C++的本质区别之一就是编程范式的不同。
编程范式可以简单理解为编码的思维方式。
C语言主要支持面向过程的编程范式。面向过程是以程序的过程或步骤为中心。在这种范式中,问题被分解为一系列可解决的步骤或过程(通常是函数或子程序)
C++是一门多范式语言, 在兼容面向过程编程范式的同时,原生支持面向对象、泛型等多种编程范式;这一点构成了它与以面向对象为中心的语言(如 Java)之间的核心区别。
在面向对象的编程范式。面向对象以对象为中心,对象是包含数据和操作这些数据的函数的实体。在面向对象范式中,程序通常被建模为对象之间的协作与交互。
此外C++还支持泛型编程范式。泛型范式编程关注算法和数据结构的抽象与复用,使得同一套算法能够在不牺牲性能的前提下适用于多种类型。后续的C++模板机制是泛型编程范式的重要实现手段。(在理解上泛型编程范式更为抽象,并不是面向的层级更高,而是抽象的对象更加脱离具体实体)
在更高级的应用中,模板还可用于模板元编程,即在编译时期进行计算和逻辑推导,常用于高性能库和基础设施的实现。
三种范式不是互相替代的,而是互相补充的。在一些项目代码框架的设计中,会经常看到一种情况是外层
下面我用同一个题目来展示面向过程,面向对象,泛型三种范式的应用
题目:对一组整数做处理:把正数翻倍,负数清零,然后打印
//面向过程编程范式
#include
void process(int* arr, int n) {
for (int i = 0; i < n; ++i) {
if (arr[i] > 0) {
arr[i] *= 2;
} else {
arr[i] = 0;
}
}
}
int main() {
int data[] = {1, -2, 3};
process(data, 3);
for (int i = 0; i < 3; ++i) {
printf("%d ", data[i]);
}
}
//面向对象编程范式
#include
#include
class Processor {
public:
void run(std::vector& data) {
for (int& x : data) {
processOne(x);
}
}
private:
void processOne(int& x) {
if (x > 0) {
x *= 2;
} else {
x = 0;
}
}
};
int main() {
std::vector data = {1, -2, 3};
Processor p;
p.run(data);
for (int x : data) {
std::cout << x << " ";
}
}
//泛型编程范式
#include
#include
template
void process(It begin, It end) {
for (; begin != end; ++begin) {
if (*begin > 0) {
*begin *= 2;
} else {
*begin = 0;
}
}
}
int main() {
std::vector data = {1, -2, 3};
process(data.begin(), data.end());
for (int x : data) {
std::cout << x << " ";
}
}
总结:
面向过程范式主要考虑怎么一步一步怎么做,关注for/if逻辑。
面向对象范式主要考虑谁来负责某件事,关注类/职责。
泛型范式主要考虑这套规则的对什么类型都适用,关注模板/迭代器。
框架中三种范式的配合:
// 外层:面向对象(架构)——“谁负责这件事”
class Processor {
public:
virtual ~Processor() = default;
virtual void run(std::vector& data) = 0;
};
// 外层实现(仍然是 OOP)
class DoublePositiveProcessor : public Processor {
public:
void run(std::vector& data) override {
process(data.begin(), data.end());
}
};
// 内部:泛型(算法)——“规则对谁都适用”
template
void process(It begin, It end) {
for (; begin != end; ++begin) {
handle(*begin);
}
}
// 细节:面向过程(实现)——“一步一步怎么干”
class DoublePositiveProcessor : public Processor {
public:
void run(std::vector& data) override {
process(data.begin(), data.end());
}
};
// 调用者
int main() {
std::vector data = {1, -2, 3};
Processor* p = new DoublePositiveProcessor();
p->run(data);
for (int x : data) {
std::cout << x << " ";
}
}
外层:面向对象(架构),只关心谁能干这事。
内部:泛型(算法),关心怎么把这类事通用地干。
细节:面向过程(实现),关心具体一步怎么做。







