C++程序的必要结构
对于每一个C++程序来说,都有个必要的结构。
话不多说,咱们直接进入正题
先上Hello World!
#include<stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}
这是C语言的☝☝☝
#include<iostream>
using namespace std;
int main(){
//printf("Hello World!\n");
//printf在C++中依然可以使用
cout<<"Hello world"<<endl ;
//cout C++里新增的输出方式,会在下一章中讲到
return 0;
}
这是C++的☝☝☝
其中包含了3个主要部分,分别是
- 头文件
- 命名空间
- 程序主体
头文件
和C语言一样,在C++中我们用的大多数函数都是前人写好放在头文件中的(eg:cout,printf()),我们不可能每次都重新去书写这些函数,所以C++程序的第一个必要结构就是引用头文件了,把前人写的函数,直接调用。
这里本人将列举一些常用头文件中常用的函数,至于其作用我们后面再谈
注意:下面的函数并不是头文件中所有的函数,只是本人认为常用的
首先,最最最重要的万能头文件
< bits/stdc++.h >
但是有些比赛不允许使用万能头文件,所以其他头文件还是需要了解下的
< iostream >
输入输出流,in out stream
//cin cout
//cin,cout是流对象,并非函数
getline()
< cstdio >
C++中的< stdio.h >,但是还是有些不同
getchar() putchar()
gets() puts()
scanf() printf()
freopen() fclose()
< cmath >
数学函数集合
log() tan()
sin() cos()
pow() exp()
sqrt() abs()
< algorithm >
标准算法库
max() min()
swap() sort()
fill() unique()
count() find()
lower_bound() upper_bound()
< cstring >
C++里的< string.h >
功能几乎和C语言中的< string.h >一样
memset()
memcpy()
strcpy()
memcmp()
strlen()
< string >
STL中的一员,定义了一个新的数据类型用于处理字符串
里面重载了+,-,=,==,!=等运算符,使对于字符串的使用变得非常方便
(重载将在下一章讲解)
size() empty()
at() copy()
length() insert()
还有一些其他STL的头文件就不一一列举了,后面讲STL时会再讲到
命名空间
其实上面的Hello World其实也可以这么写
#include<iostream>
int main(){
std::cout<<"Hello world"<<std::endl ;
//std::printf("Hello world\n");
return 0;
}
那对比之前
#include<iostream>
using namespace std;
int main(){
cout<<"Hello world"<<endl ;
//printf("Hello world\n");
return 0;
}
命名空间是C++中新引进的概念,命名空间是一种特殊的作用域,你可以在程序中(包括其他命名空间中)调用不同命名空间中的函数,结构体,类,变量,这样就可以使程序更为模块化,且可以很好的防止命名冲突
C++自带一个std命名空间,C++标准函数或者对象都是在std中定义,我们所常用的也是std命名空间中的,所以得标明是std命名空间(也就是std::printf ()),因为其他命名空间也可以有printf()这个函数,可能会出现二义性(有歧义)
而using namespace 是什么意思呢
就是对某个命名空间进行声明,在后面会再进一步讲解using
为了便于理解
你可以认为这个语句是把一个命名空间当成默认的命名空间,即该语句后面的未标明命名空间的函数或变量全是默认的命名空间内的
当然也可以"设置"多个,但是我们在编写程序时,应当避免出现二义性,所以一般的,我们还是会加上::
举个栗子:
#include<iostream>
#include<cstdio>
namespace zzz{
struct num_node{
int x;
};
void printf(int x){//zzz命名空间中也可以有printf()
std::printf("%d",x);
//在zzz命名空间内也可以调用std命名空间内的printf()
}
}
using namespace zzz;//声明命名空间zzz
using namespace std;//可以声明多个命名空间
num_node x;//默认zzz命名空间后就不需要::了
//想加也可以加(前提是不会出现二义性,出现了就必须加了)
int main(){
num_node x;
std::cout<<"Hello world"<<std::endl ;
zzz::printf(1);
std::printf("1");
printf(1);//这个printf()是默认命名空间zzz中的哦
printf("1");//这个是std中的
//可以直接使用是因为函数的重载,并不会出现二义性
return 0;
}
另外:
1.命名空间必须在全局作用域下声明,可以是函数的全局作用域,不能在循环内!
2.命名空间可以嵌套命名空间
3.在其中可以放函数、变量、结构体、类
4.可以随时加入新成员
因为我们使用的主要是std命名空间,所以我们一般会将其声明一下,即using namespace std;
这样,我们后面使用std命名空间内的函数或对象时,就不用多加个std::了
对我们这些初学者来说,完美的偷了个懒,嘿嘿
当然你也可以不去理解命名空间的意义,只是把这个当成C++程序的一个模板。那你的C++学习之旅必将会少一分乐趣。
#include<iostream>
using namespace std;
int main(){
return 0;
}
程序主体
这个就没什么好讲的了,和C语言一样,只是多了可以用一些新的东西(函数,类…),牢记那些规则,语法,尽情的去创作吧
本章字数可能有点多,在没有超链接没有图的情况下达到2900+,但是确实C++学习中十分重要的部分,特别是命名空间的理解,十分重要
也算是完成了第一次的周更,以后还会周更的,喜欢就点个赞吧,喜欢这个专栏的可以点个关注,我们下周见。
下一章—重载
由于之前对声明命名空间的描述容易产生歧义,现已更新—2020,12,22