从这篇博客开始,我们就要进入C++的大门了,C++看这名字就是对于C语言的补充和升级,所以我们在C++的编译器上时可以执行C语言的
话不多说,我们先来打印一个hello world
#include<iostream>
using namespace std;
int main() {cout << "Hello world" << endl;return 0;
}
我们只要学过C语言,就可以看懂包含头文件和主函数,看不懂的就是using这句和主函数中的那句。
using这一句实际上就是使用叫做std的命名空间的意思,std是官方定义的一个命名空间
那么定义命名空间的意思是什么呢?我们来看下面这一段C语言代码
#include<stdio.h>
int time = 0;
int main() { printf("%d\n", time);return 0;
}
我这么写是完全可以的,但是当我包含上time.h这个头文件后就不可以了,因为time.h中有一个函数,函数名是time,这样的话名字就相同了,C语言是不支持名字相同的。其实不仅是一个程序员写的和库中的可能会冲突,当我们写一个大的工程时,不同的程序员之间定义的变量名和函数名也会冲突,所以我们的C++祖师爷为了处理这个问题,就引用了命名空间这个概念。
那么我们如何去定义一个命名空间呢?
namespace jxh {int a = 0;int Add(int x, int y) {return x + y;}struct Node {int data;struct Node* next;};
}
就是namespace加上一个你喜欢的一个单词或者是名字,我这里用的是我名字的缩写,我们在这个命名空间里可以去定义变量,函数,结构体等等
那我们应该如何去使用呢?
#include<iostream>
namespace jxh {int a = 0;int Add(int x, int y) {return x + y;}struct Node {int data;struct Node* next;};
}
using namespace jxh;
int main() {printf("%d", a);return 0;
}
#include<iostream>
namespace jxh {int a = 0;int Add(int x, int y) {return x + y;}struct Node {int data;struct Node* next;};
}
int main() {printf("%d", jxh::a);return 0;
}
这两种方法都是可以正常使用的,但是我们要介绍一下::这个符号,它是由两个冒号构成的,叫做域作用限定符,就表示在jxh这个命名空间内的a变量,这样编译器就可以找到并使用了。
struct jxh::Node node1;
当然我们要使用结构体的话要这么用(其实C++管结构体叫做类,我们在以后的博客中会解释),因为struct本身就是一个关键字,它并不是定义在jxh中的
并且命名空间还可以嵌套使用,就是在命名空间中定义命名空间
#include<iostream>
namespace jxh {int a = 0;namespace jxh1 {int a = 10;}
}
int main() {printf("%d", jxh::jxh1::a);return 0;
}
接着我们的hello world说,这里的std就是C++官方定义的一个命名空间,里面包含很多东西,其中就包括下面的cout 和endl,所以我们要使用cout等时,可以用using,也可以用::域作用限定符,只不过用using的话就将std中的全部东西都暴露出来了,用域限定作用符会比较安全一些
#include<iostream>
int main() {std::cout << "Hello world" << std::endl;return 0;
}
然后cout中的c就是console,意思是控制台,out就是输出的意思,<<这个符号是流插入,就是把后面的流到控制台中,就是输出到控制台中。后面的endl其实就相当于换行(l就是line,end line就是结束一行),就是std里边定义的,当然之前用’\n’换行的方法也是适用的
#include<iostream>
int main() {std::cout << "Hello world" << '\n';//"\n"return 0;
}
另外再提一下,<<这个符号可以自动识别类型,就是各种类型都可以直接打印
#include<iostream>
using namespace std;
int main() {int a = 1;double b = 1.1;cout << a << endl<< b << endl;return 0;
}
有类似与printf的,那么自然有类似与scanf的,就是>>叫做流提取
#include<iostream>
using namespace std;
int main() {int a = 0;int b = 0;cin >> a >> b;cout << a << endl << b << endl;return 0;
}
这样就可以给a b输入值了
最后我们在说一下如果要函数声明和定义分装到两个文件,那么这时命名空间应该怎么用呢?
这时.cpp文件和.h文件中都使用一个命名空间把它们包含起来就可以了,编译器最后执行时会把相同命名空间的代码进行合并。最简单的,一个文件中也可以定义相同的命名空间。
#include<iostream>
namespace jxh {int a = 10;
}
namespace jxh {int b = 20;
}
using namespace std;
using namespace jxh;
int main() {cout << a << endl << b << endl;return 0;
}