C++基础
C++语言新特性
2.1 C++的新特性
C++比 C 语言新增的数据类型是布尔类型(bool)。但是在新的 C 语言标准里已经有布尔类
型了,但是在旧的 C 语言标准里是没有布尔类型的,编译器也无法解释布尔类型。
在传统的 C 语言里,变量初始化时必须在程序的前面定义在前面,而 C++则是可以随用随
定义。C++也可以直接初始化,比如 int x(100);这样就直接赋值 x=100,这些都是 C++特性的好
处。这里只说这些常用的新特性,其他特性不做描述或者解释了。
2.2 C++的输入输出方式
在 C 语言里,我们是这样输入或者输出的。
输入设备 输入流 scanf 变量
变量 printf 输出流 输出设备
输出过程
输入过程
在 C++里,我们使用以 cin 和 cout 代替了 scanf 和 printf。在输入和输出的流程上是不变的,
只是关键字变了,用法也变了。
输入设备 输入流 cin 变量
变量 cout 输出流 输出设备
输出过程
输入过程
要说效率上,肯定是 C 语言的 scanf 和 printf 的效率高,但是没有 C++中的 cin 和 cout 使
用方便。
C++的 I/O 语法方式如下。
cout 语法形式:
cout<<x<<endl;
x 可以是任意数据类型,甚至可以写成一个表达式,这比 C 语言需要指定数据类型方便多
了,endl 指的是换行符,与 C 语言的“\n”效果一样。
错误示例:
cout<<x,y<<endl; // 在变量间不能用“,”。
正确写法:
cout<<x<<y; // endl 可流省略,只是一个换行的效果。
cin 语法形式:
cin>>x;
x 可以是任意数据类型。
拓展,如何输入两个不同的变量。
cin>>x>>y;
2.3 C++之命名空间 namespace
在第 1.3 小节里我们已经使用过命名空间,如下代码第 2 行。using namespace std;同时我们要注意第 1 行,不能写成 iostream.h,有.h 的是非标准的输入输出流,c 的标准库。无.h 的是标
准输入输出流就要用命名空间。
1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 cout << "Hello, World!" << endl;
6 return 0;
7 }
using 是编译指令,声明当前命名空间的关键词。可以从字面上理解它的意思,using 翻译
成使用。这样可以理解成使用命名空间 std。因为 cin 和 cout 都是属于 std 命名空间下的东西,
所以使用时必须加上 using namespace std;这句话。cin 和 cout 可以写 std::cin 和 std::cout,“::”
表示作用域,cin 和 cout 是属于 std 命名空间下的东西,这里可以理解成 std 的 cin 和 std 的 cout。
为什么要使用命名空间?
有些名字容易冲突,所以会使用命名空间的方式进行区分,具体来说就是加个前缀。比如
C++ 标准库里面定义了 vector 容器,您自己也写了个 vector 类,这样名字就冲突了。于是标
准库里的名字都加上 std:: 的前缀,您必须用 std::vector 来引用。同理,您自己的类也可以加
个自定义的前缀。但是经常写全名会很繁琐,所以在没有冲突的情况下您可以偷懒,写一句
using namespace std;,接下去的代码就可以不用写前缀直接写 vector 了。
从命名空间开始我们就隐隐约约可以看到 C++面向对象的影子了。命名空间在很多 C++库
里使用到。有些公司也会自定义自己的 C++库,里面使用了大量的命名空间。从这里我们也可
以看出 C++是非常之有条理的,容易管理的,不含糊,易使用的。
在初学 Qt 时我们是比较少使用命名空间,或者比较少看到命名空间。当然也是可以在 Qt
里自定义命名空间,然后与 C++一样正常使用。
下面通过一个简单的例子来介绍自定义的命名空间和使用自定义的命名空间。在 Ubuntu
上我们新建一个目录 02_namespace_example,然后在 02_namespace_example 里新建一个
02_namespace_example.cpp 文件,内容如下。
1 #include <iostream>
2 using namespace std;
3
4 namespace A
5 {
6 int x = 1;
7 void fun() {
8 cout<<"A namespace"<<endl;
9 }
10 }
11 using namespace A;
12 int main()
13 {
14 fun();
15 A::x = 3;
16 cout<<A::x<<endl;
17 A::fun();
18 return 0;
19 }
第 4 行,自定义了命名空间 A,里面定义了一个变量 x,并将 x 赋值为 1;定义了一个函数
fun(),并在 fun()加了输出打印语句 cout<<“A namespace”<<endl;。
第 11 行,声明使用命名空间 A。
第 14 行,在第 11 行声明了命名空间 A 后,才能直接使用 fun();否则要写成 A::fun();
第 15 行,将 A 命名空间下的 x 重新赋值为 3。
第 16 行,打印出 A 命名空间下的 x 的值。
第 17 行,调用 A 命名空间下的 fun()。
执行下面的指令开始编译。
g++ 02_namespace_example.cpp -o 02_namespace_example
编译完成执行的结果如下。
2.2 C++面向对象
面向对象的三大特征是继承,多态和封装,C++重面向对象重要的就是这些,我们下面通
过一些简单的实例加以理解,从这小节开始,我们将开启新的编程旅途。与 C 语言编程的思想
完全不同了,这就是 C++!理解概念和掌握这些编程方法对学习 C++有很大的好处。