欢迎来到C++的世界,这是一门令人兴奋的语言。
好吧,每当我开始阅读C++的书籍的时候,开头的第一句话必定是这个,
也不知道其他语言的编程书籍是不是这样,那就让这句话也作为我C++分享之路上的第一句话吧。
目录
写在前面
1. C++怎么学?
1. C语言
2. Object-Oriented C++
3. Template C++
4. STL
2. 第一个C++程序
3. 命名空间
namespace的用法
4. 输入输出
写在最后:
这篇文章我也打算将一点C++入门的语法,不过在那之前,我想聊一聊,C++该怎么学?
最近我阅读了Scott Meyers大佬写的Effective C++,觉得他写的非常不错,
我就以他书中的第一条条款作为C++的介绍,也就是回答C++怎么学这个问题。
条款1:视C++为一个语言联邦
学C++你学要从这四个方面入手:
是的,C++是基于C语言的一门语言,如果你没有一个扎实的C语言基础,那你学C++会很难受,
这边建议赶紧去学好C语言,再来学C++,不要贪快。
说人话就是面向对象,C++包含了面向对象的特性,即所谓封装,继承,多态,
在这个C++学习的专栏中,我也打算从类和对象入手,开始讲解C++。
也就是模板,这里是C++的泛型编程的部分,实际上模板的威力强大,它带来了崭新的编程规范,
即:模板元编程,但是我这里就不这么深入了,学好模板的特性就基本够用了
STL是一个标准模板库,这是C++非常重要的组成部分,每个C++程序员都需要和STL一起工作,
学好STL自然非常必要,之后我会探索STL一些经典容器/适配器的底层,让我们更好的理解STL。
当然,
学好了上述的几个知识,你就可以说你是一个会C++的程序员了,虽然离精通还远远算不上,
C++的知识自然不止这几个部分,还有C++11的新语法,未来C++也会继续更新(虽然很慢)
它还有许多重要的,区别于C语言的新特性, 而这些新特性,就是我接下来准备介绍的,
C++入门的内容,衔接C语言,让我们一起走进C++的世界!
(PS:瞻仰一下C++祖师爷的帅照,感谢一下祖师爷赏饭吃,不然都没有C++程序员这个工作)
#include
using namespace std;
int main()
{
cout << "hello world!" << endl;
return 0;
}
输出:
hello world!
怎么说呢,其实C++跟C语言确实是不分家的,
学过C语言的我们都知道,最上面的是头文件,下面是主函数,还有return 0,
那个cout和cin一看就知道是输入输出相关的东西,
那么第二行是个啥呢?
这就要说到C++的第一个知识点了:
我们来看这段代码:
#include
int printf = 0;
int main()
{
return 0;
}
很显然,这段代码是编译不通过的,
因为printf是stdio.h里面的一个函数,这就是C语言中命名冲突的问题,
1. 我们的跟库里的冲突
2. 我们与其他人协作项目的时候冲突
你没办法知道库里究竟用了啥名字,你也不知道其他人用了啥名字,
C++为了解决这样的问题,就提供了这样一个关键字:namespace
比如说,我们想让前面那段代码不再冲突:
我们发现这样是可以运行成功的,
这个就是命名空间,在这个命名空间的{ }内,是一个域。
实际上我们在C语言阶段就学过变量的作用域,(还记得局部优先的原则吧)
比如说这段代码:
#include
int a = 10;
int main()
{
int a = 1;
printf("%d\n", a);
printf("%d\n", ::a);
return 0;
}
我们直接访问a,优先选择的是局部域内的变量,
如果我们偏要访问全局变量a呢?
可以用域作用限定符,用法如上,
输出:
1
10
再比如说,看这段代码:
#include
namespace xl {
int a = 10;
}
int main()
{
int a = 1;
printf("%d\n", a);
printf("%d\n", xl::a);
return 0;
}
我们可以这样访问命名空间内的变量,
实际上,我们的程序是不会主动到命名空间域搜索的,
只有我们自己指定,才会前往:
#include
namespace xl {
int a = 10;
}
int main()
{
printf("%d\n", a);
return 0;
}
这样的代码时无法编译的。
这个时候你大概就知道命名空间的左右了,
除了直接指定命名空间使用变量,也可以将命名空间展开,
(其实就是将变量暴露到外面)
来看代码:
#include
namespace xl {
int a = 10;
}
using namespace xl;
int main()
{
printf("%d\n", a);
return 0;
}
这样子,我们也能访问a变量,
这个时候,我们应该也能大概知道最开始那段代码,
using namespace std; 是什么意思了,其实就是展开了C++标准库的命名空间。
当然,像我们这样直接展开只是方便我们平时练习代码,
其实在做项目的时候,我们不会直接将这样一个大的命名空间直接展开的,
不然还加这个命名空间干啥。
来看看不展开的代码:
#include
int main()
{
std::cout << "hello world!" << std::endl;
return 0;
}
这样我们就解决了这个问题,来看代码:
#include
namespace xl {
int printf = 10;
}
int main()
{
printf("hello\n");
printf("%d\n", xl::printf);
return 0;
}
输出:
hello
10
实际上,C语言可解决不了这样的情况。
补充:
命名空间是支持嵌套的,来看例子:
#include
namespace xl {
namespace me {
int printf = 10;
}
}
int main()
{
printf("hello\n");
printf("%d\n", xl::me::printf);
return 0;
}
这个就是命名空间的嵌套,有些场景还是会用到的。
另外,同名的命名空间会自动合并在一起,来看例子:
#include
namespace xl {
int x = 10;
}
namespace xl {
int y = 20;
}
int main()
{
printf("%d\n", xl::x);
printf("%d\n", xl::y);
return 0;
}
扩展知识:
不知道你有没有想过,为什么C++的头文件不像C语言头文件,
C语言的头文件都有.h的后缀,例如:stdio.h,string.h等等,
而C++的头文件却没有.h,例如:iostream, vector等等,
实际上,在一些很老的编译器下,是支持所谓#include
比如说 VC6.0,这些头文件是没有被命名空间包裹的,但是后来,
C++把所有的这些头文件的内容都塞到std命名空间里面了,为了和以前区分,
就把塞进命名空间的这部分头文件改成没有.h结尾的,像#include
然后带命名空间确实很好用,C++就慢慢把带.h结尾的头文件淘汰了,
所以现在C++标准库的头文件基本就都不带.h了。
补充:
如果我们不展开整个命名空间,但是有一些变量,对象或者函数我们需要经常调用,
该怎么解决?我们可以指定访问
来看例子:
#include
using std::cout;
using std::endl;
int main()
{
cout << "hello world" << endl;
return 0;
}
用using std::,就能指定访问了。
这样就不用把整个命名空间展开,展开常用的就行。
cout,cin这些是对象,
cout这些对比printf,他能自动识别类型。
我们直接来看例子:
#include
using namespace std;
int main()
{
// << 流插入运算符 endl 我们可以直接理解成 \n
cout << "hello world" << endl;
int n = 10; //自动识别类型
cout << n << endl;
double x = 1.1;
// >> 流提取运算符,他也能自动识别类型
cin >> x;
cout << x << endl;
return 0;
}
输入:
2.22
输出:
hello world
10
2.22
2.22
补充:
有人可能会问,cout 能像printf一样指定精度吗?
答案是可以,但是很麻烦,如果有这样的需求,建议直接用printf
因为C语言和C++ 是兼容的,哪个方便用那个就行。
补充:
有人可能会说C语言的printf,scanf比C++的cin,cout快,
确实是这样,因为C++需要对C语言进行兼容和同步,就会比较慢,
不过也有方法能关掉C++对C语言的同步,
如果在一些算法竞赛的话,C语言确实会快,
但是在平时的话,以我们现在电脑的配置,我觉得可以忽略不计。
以上就是本篇文章的内容了,感谢你的阅读。
如果感到有所收获的话可以给博主点一个赞哦。
如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~