C++兼容C。
" hello world "
C:
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
C++:
#include<iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
C++中所有库的东西都放入std这个命名空间,即std是C++所有库的命名空间。
可以看出,C和C++在语法上面差别是很大的,并且C++的语法更加复杂,因此造就了C++是最难学的语言之一。
C++关键字总计63个,C只有32个。
C++里面分:全局域,局部域,命名空间域,类域.全局域和局部域和C语言类似,后面两种之后再说。
在C语言中,假如全局变量和局部变量命名一致时,我们如何来访问全局变量呢?这里就用到一个运算符,叫做域作用限定符 ::,::左边代表域的名称(不写的话默认全局域),右边代表变量名。
int x = 0;
int main()
{
int x = 1;
printf("%d", ::x);// 0
return 0;
}
刚刚那个namespace就是一个命名空间。那么为什么会有命名空间呢?
全局的变量会面临一个命名冲突的问题,并且当包含一个头文件时,使用这个头文件中的函数进行命名时,就会出现命名冲突问题。可以理解为:程序员的命名和库的命名冲突了。因此,为了优化这个问题,提出了命名空间。
定义命名空间的时候需要用到namespace这一关键字,后面接域的名字,再用一对{}来包括就好了。这算是一个全局域。即命名空间里封锁的都是全局的东西。
namespace s1
{
// ...
}
命名空间域中可以定义变量,函数,类型。
namespace s2
{
int x = 1;
int Add(int x, int y)
{
return x + y;
}
struct Node
{
struct Node* node;
int val;
};
}
//命名空间嵌套
namespace s3
{
int x = 2;
int Add(int x, int y)
{
return x + y;
}
namespace s4
{
int x = 3;
int Sub(int x, int y)
{
return x - y;
}
}
}
答案是:可以。编译器不会报错。当两个命名空间的名称一样时,编译器会将两个命名空间合并为一个命名空间,但是这两个同名命名空间中的变量,函数,类型名称不能相同,否则就冲突了。
注意:一个命名空间就定义了一个新的作用域,该命名空间中的所有内容仅限于该作用域。
namespace s2
{
int x = 1;
int Add(int x, int y)
{
return x + y;
}
struct Node
{
struct Node* node;
int val;
};
}
int main()
{
printf("%d\n", s2::x);
printf("%d\n", s2::Add(1, 2));
struct s2::Node phead;
}
尤其是结构体的使用,看着很别扭。、
使用using namespace 命名空间名称引入。
指将命名空间域的访问权展开,使全局可以访问。但是注意:展开后,命名空间相当于一个全局域,所以仍然是局部优先。不要随意展开!!!
using namespace s2;
int main()
{
printf("%d\n", x);
printf("%d\n", Add(1, 2));
struct Node phead;
}
使用using 命名空间名称 ::成员变量。
using s2::Add;
int main()
{
printf("%d\n", s2::x);
printf("%d\n", Add(1, 2));
}
std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
使用cout标准输出对象(控制台)(这个c代表控制台console)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
以及按命名空间使用方法使用std。
cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出(也支持\n换行,因为C++兼容C),他们都包含在包含<
iostream >头文件中。
<<是流插入运算符(和cout使用),>>是流提取运算符(和cin使用)。
使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型。
规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用<iostream>+std的方式。
#include<iostream>
using namespace std;
int main()
{
int i = 0;
char ch = 0;
cin >> i>>ch;
cout << i << endl << ch << endl;
cout << "hello world"<<endl << "nihao" << endl;
return 0;
}
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
void Func(int a = 4,int b = 3,int c = 2)
{
cout << a << endl;
cout << b << endl;
cout << c << endl << endl;
}
int main()
{
Func();//4 3 2
Func(10, 20, 30);//10 20 30
Func(10, 20);//10 20 2
Func(10);//10 3 2
return 0;
}
由此可以看出,全缺省参数函数传参时,是