C++ 入门基础涵盖发展历程、版本迭代及参考资源。重点解析命名空间解决命名冲突的原理与用法,包括定义、嵌套及多文件合并机制。同时对比 C 语言 IO,讲解 C++ 流式输入输出操作符重载特性及性能优化技巧。
草莓泡芙5 浏览
C++ 入门基础
一、C++的发展历史
1. 发展历史
起源(1979-1983): C++ 的起源可以追溯到 1979 年,当时 Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在贝尔实验室从事计算机科学和软件工程的研究工作。面对项目中复杂的软件开发任务,特别是模拟和操作系统的开发工作,他感受到了现有语言(如 C 语言)在表达能力、可维护性和可扩展性方面的不足。1983 年,Bjarne Stroustrup 在 C 语言的基础上添加了面向对象编程的特性,设计出了 C++ 语言的雏形,此时的 C++ 已经有了类、封装、继承等核心概念,为后来的面向对象编程奠定了基础。这一年该语言被正式命名为 C++。在随后的几年中,C++ 在学术界和工业界的应用逐渐增多。一些大学和研究所开始将 C++ 作为教学和研究的首选语言,而一些公司也开始在产品开发中尝试使用 C++。这一时期,C++ 的标准库和模板等特性也得到了进一步的完善和发展。
标准化(1989-1994): C++ 的标准化工作于 1989 年开始,并成立了一个 ANSI 和 ISO(International Standards Organization)国际标准化组织的联合标准化委员会。1994 年标准化委员会提出了第一个标准化草案。在该草案中,委员会在保持斯特劳斯特卢普最初定义的所有特征的同时,还增加了部分新特征。在完成 C++ 标准化的第一个草案后不久,STL(Standard Template Library)是惠普实验室开发的一系列软件的统称。它是由 Alexander Stepanov、Meng Li 和 David R Musser 在惠普实验室工作时所开发出来的。在通过了标准化第一个草案之后,联合标准化委员会投票并通过了将 STL 包含到 C++ 标准中的提议。STL 对 C++ 的扩展超出 C++ 的最初定义范围。虽然在标准中增加 STL 是个很重要的决定,但也因此延缓了 C++ 标准化的进程。
C++ 中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/类型出处 (声明或定义) 的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。
namespace 只能定义在全局,当然他还可以嵌套定义。
项目工程中多文件中定义的同名 namespace 会认为是同一个 namespace,不会冲突。
C++ 标准库都放在一个叫 std(standard) 的命名空间中。
1)使用 namespace 来命名空间,以及使用命名空间
#include<stdio.h>#include<stdlib.h>namespace A // A 是命名空间的名字,一般开发中是用项目名字做命名空间名
{
// 命名空间中可以定义变量/函数/类型int rand = 10;
intADD(int a, int b){
return a + b;
}
structNode {
structNode* next;
int val;
};
}//注意这里没有分号!!int a = 1;
intmain(){
// 编译器语法查找确认规则是默认先局部查找->全局查找->没有找到就报未声明的标识符这个错误// ::域作用限定符,这里指定作用域,就直接按这个域去找->没有找到就报未声明的标识符这个错误int a = 0;
printf("%d\n", a);
printf("%d\n", ::a); // ::前面不加域就是默认全局域!不会到命名空间里查找!printf("%p\n", rand); // 这里的 rand 是 stdlib.h 中的指针,要用%p 访问printf("%d\n", A::rand); // 这里访问的就是 A 域中的 randprintf("%p\n", A::ADD);
printf("%d\n", A::ADD(1, 2)); // 这里是直接调用该函数// A::struct Node node;//这是错误的structA::Node node;
return0;
}
这个程序的运行结果如下:
!!!这里需要注意的是命名空间域不会影响变量的生命周期(是一个全局的生命周期)。
2)命名空间的嵌套使用
#include<stdio.h>#include<stdlib.h>// 命名空间的嵌套使用namespace A {
namespace a {
int rand = 10;
intADD(int a, int b){
return a + b;
}
}
namespace b {
int rand = 20;
intADD(int a, int b){
return (a + b) * 10;
}
}
}
intmain(){
printf("%d\n", A::a::rand);
printf("%d\n", A::b::rand);
printf("%d\n", A::a::ADD(1, 2));
printf("%d\n", A::b::ADD(1, 2));
return0;
}
#include<iostream>//C++ 中不需要带.h#include<algorithm>intmain(){
int a[5] = { 4,1,2,5 };
// 指定命名空间访问
std::sort(a, a + 4);
return0;
}
2)using 将命名空间中某个成员展开
#include<iostream>#include<algorithm>// 命名空间中成员部分展开using std::cout;
using std::cin;
intmain(){
int a, b;
cin >> a >> b; // 输入
cout << a << " " << b << '\n'; // 输出return0;
}