C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式
等。熟悉C语言之后,对C++学习有一定的帮助,本章节主要目标:
1. 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用
域方面、IO方面、函数方面、指针方面、宏方面等。
2. 为后续类和对象学习打基础
本节重点:
1. C++关键字
2. 命名空间
3. C++输入&输出
4. 缺省参数
5. 函数重载
6. 引用
7. 内联函数
8. auto关键字(C++11)
9. 基于范围的for循环(C++11)
10. 指针空值---nullptr(C++11)
目录
1.C++关键字(c++98)
2.命名空间
2.1命名空间的定义
2.2命名空间的使用
2.3优先级
3 c++输入&输出
1.C++关键字(c++98)
C++总计63个关键字,C语言32个关键字
ps:下面我们只是看一下C++有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再
细讲。
asm | do | if | return | try | continue |
auto | double | inline | short | typedef | for |
bool | dynamic_cast | int | signed | typeid | public |
break | else | long | sizeof | typename | throw |
case | enum | mutable | static | union | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | using | friend |
class | extern | operator | switch | virtual | register |
const | false | private | template | void | true |
const_cast | float | protected | this | volatile | while |
delete | goto | reinterpret_cast |
2.命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
例如:
对比两个运行程序,我们会发现,在没载入头文件stdlib.h之前,定义的rand这个全局变量, 程序可以正常运行,但是包含该头文件之后,会出现报错“rand”以前定义是“函数”;这就出现了冲突,我们定义rand这个变量,和展开头文件stdlib中的rand函数冲突了,c语言是没法处理命名冲突的问题,所以c++提出了namespace来解决。
2.1命名空间的定义
使用namespace关键字,后面命名空间的名字,然后接一对{} ,大括号里面放成员,就构成了命名空间。命名空间就像一堵墙,将定义的成员放进这堵墙内,需要访问的时候打开这堵墙进行访问,平时,这堵墙是禁止访问的。例如:
namespace mx
{
int rand = 1;
}
命名空间不仅仅可以定义变量,还可以定义函数,结构体,同时还可以嵌套定义结构体,例如:
namespace mx
{
//变量
int rand = 1;
//函数
int Add(int x, int y)
{
return x + y;
}
//结构体
struct person
{
char name[30];
int age;
};
//嵌套结构体
namespace mx2
{
int addr = 123;
}
}
同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
一个工程中的test.h和上面test.cpp中两个N1会被合并成一个。因为 在链接时候符号表里N1的有效地址只有一个。
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
2.2命名空间的使用
命名空间有三种使用方式
第一种,加命名空间和作用限定符,例如:
int main()
{
printf("%d", mx::rand);
return 0;
}
第二种,使用命名空间将命名空间中某个成员引入,例如:
using mx::person;
int main()
{
struct person pp =
{
"zhangsan",
20
};
printf("%d\n", mx::rand);
printf("%d\n", pp.age);
return 0;
}
第三种,使用using namespace 将域全部展开
using namespace mx;
int main()
{
struct person pp =
{
"zhangsan",
20
};
printf("%d\n", mx::rand1);
printf("%d\n", pp.age);
printf("%d\n", Add(1, 2));
return 0;
}
2.3优先级
访问的优先级依次是 局部域->全局域->展开了命名空间域或者指定访问命名空间域。例如:
3 c++输入&输出
1.输入:cin标准输入对象(键盘)
2.输出:cout标准输出对象(控制台)
3.endl:换行
使用cin和cout和endl必须包含头文件<iostream>;为了方便,我们将c++中标准库的命名空间std打开,作为全局使用,主要这只是为了练习操作方便,实际使用不建议。
4. <<是流插入运算符,>>是流提取运算符1. 在日常练习中,建议直接using namespace std即可,这样就很方便。using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 +using std::cout展开常用的库对象/类型等方式
5.使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。例如:
#include <iostream>
using namespace std;
int main()
{
int a;
double b;
char c;
// 可以自动识别变量的类型
cin>>a;
cin>>b>>c;
cout<<a<<endl;
cout<<b<<" "<<c<<endl;
return 0;
}
关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等
等。因为C++兼容C语言的用法,这些又用得不是很多,我们这里就不展开学习了。后续如果有需要,我们再配合文档学习。