C++的第一个程序
开始的开始,我们写程序的第一步是啥?
头文件!
写C++的第一个程序从头文件开始!
#include <iostream>的解析
iostream是啥意思呢?来我给你分分! I O stream
啥意思呢? i-input 输入 o-output输出 stream-流
这个头文件本质上类似C语言的stdio.h,是输入输出流头文件!
好,头文件找到了我们开始写第一个程序吧!
第一个程序
#include <iostream> //std(标准) 使用标准的命名空间 using namespace std; //有且只有一个主函数 可以有多个其他函数 int main(int argc, char *argv[]) { //cout 输出 类似 c语言的printf //endl 类似 c语言的 换行符 // printf("Hello world!\n"); //cout代表的输出设备 cout << "Hello world!" << endl;//将字符串输出到 控制台 //cin代表的是输入设备 int num =0; cin >> num;//将建键盘输入的数据 赋值给 num cout<<"num = "<<num<<endl; return 0; }
这时候问题又来了?using namespace std;又是啥?
using namespace std;
使用using namespace std;是一种简化代码的方式,它可以完全打开std命名空间,使得在代码中可以直接使用std中的函数和对象,而不需要在前面加上命名空间名称和 ::
啥意思呢? 请看下面这段代码:
printf("Hello world!\n");//C语言常用形式 int num = 0; scanf("%d,&num"); printf("%d\n",num); //以下为C++中支持的输出输入方式 using namespace std; cout << "Hello world!" << endl;//加入了using namespace std;后 int num =0; cin >> num; cout<<"num = "<<num<<endl; // std::cout << "hello world!" << std::endl;//无using namespace std; int num = 0; std::cin >> num; std::cout << num << std::endl;
通过比对,我们很容易就能观察到C++中,加入了using namespace std;后,与没有加入前的区别,加入后就不需要在输入输出以及换行前加入std::了!
接着我们再来看看其中与C语言相对应的操作!
cin、cout、endl
cin == scanf cout == printf endl == '\n'
注意:endl中的 l 是字母 l 而不是数字 1 !!!
C++对C的扩展
1、::作用域运算符(表明 数据、方法 的归属性问题)
先看下面这一段代码
using namespace std; int a = 10;//全局变量 void test1() { int a = 20;//局部变量 cout<<"局部变量a = "<<a<<endl;//优先选择局部变量 //::作用域运算符(c++独有) cout<<"全局变量a = "<<::a<<endl;//取全局变量 }
输出结果为:
2、命名空间 namespace 解决命名冲突
2.1 namespace命名空间的定义
看看下面这段代码:
//定义一个名字为A的命名空间(变量、函数) namespace A { int a = 100; } namespace B { int a = 200;7 } void test2() { //A::a a是属于A中 cout<<"A中a = "<<A::a<<endl;//100 cout<<"B中a = "<<B::a<<endl;//200 }
注意:命名空间只能全局范围内定义!!
2.2 命名空间可嵌套命名空间
栗子:
namespace A { int a = 1000; namespace B { int a = 2000; } } void test3() { cout<<"A中的a = "<<A::a<<endl; //1000 cout<<"B中的a = "<<A::B::a<<endl; //2000 }
2.3 可以随时把新的成员加入已有的命名空间中(常用)
栗子:
namespace A { int a = 100; int b = 200; } //将c添加到已有的命名空间A中 namespace A {7 int c = 300; } void test4() { cout<<"A中a = "<<A::a<<endl;//100 cout<<"A中c = "<<A::c<<endl;//200 }
2.4 命名空间 可以存放 变量 和 函数
栗子:
namespace A { int a=100;//变量 void func()//函数 { cout<<"func-a = "<<a<<endl; } } void test5() { //变量的使用 cout<<"A中的a = "<<A::a<<endl; //函数的使用 A::func(); }
2.5 命名空间中的函数 可以在“命名空间”外 定义
栗子:
namespace A { int a=100;//变量 void func(); } void A::func()//成员函数 在外部定义的时候 记得加作用域 { //访问命名空间的数据不用加作用域 cout<<"func-a = "<<a<<endl; } void funb()//普通函数 { cout<<"funb-a = "<<A::a<<endl; } void test6() { A::func(); funb(); }
对于namespace的拓展
1、无名命名空间,意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识
符加上了static,使得其可以作为内部连接。
2、可以对命名空间取个别名
栗子:
namespace A { int a=10; } void text7() { namespace B = A; }
3、using使用命名空间
3.1 简化从命名空间的成员访问
栗子:
namespace AB { int a=100; void func(){cout<<"hello world!"<<endl;} } void test8() { //使用AB命名空间 using namespace AB; //出现的变量 从AB命名空间中找 找不到 从其他地方中 cout<<"a = "<<a<<endl; func(); }
3.2 using 使用整个命名空间
看了上面这个例子,我们不妨思考一下,如果我在定义了一个相同名字的局部变量或者全局变量(此直接使用报错)呢?客官别急,且听我为你 一 一 讲解💪
栗子:
局部变量:
namespace AB { int a = 100; void func() { cout << "hello world!" << endl; } } void test8() { int a = 200; //使用AB命名空间 using namespace AB; //出现的变量 从AB命名空间中找 找不到 从其他地方中 cout << "a = " << a << endl;//访问的是局部变量中的a cout << "a = " << AB::a << endl;//访问的是AB的a func(); }
全局变量:
话不多说!直接上图!
这里为VS2022下的报错,可见这样定义是不能用的!但是如果我硬是要这么用呢?看下一点,这时需要指定命名空间中的成员,这样才不会与全局变量冲突!
3.3 using 指明使用具体的命名空间成员
这里先了解两条规则:
1、using直接使用 命名空间中的成员 不会和 全局变量冲突。
2、using直接使用 命名空间中的成员 会和 局部变量冲突。
栗子:
全局变量
namespace AB { int a = 100; void func() { cout << "hello world!" << endl; } } int a = 200; void test8() { //using直接使用 命名空间中的成员 不会和 全局变量冲突 using AB::a; cout << "命名空间中a = " << a << endl;//命名空间中的成员 100 cout << "全局变量中a = " << ::a << endl;//200 //但是func使用的时候 必须加作用域 AB::func(); } int main() { test8(); return 0; }
局部变量
报错啦!!!
3.4 using声明碰到函数重载
namespace A { //函数重载 函数名+参数 组合代表是函数的入口地址 void func() { cout << " 无参的func" << endl; } void func(int a) { cout << " int的func" << endl; } void func(int a, int b) { cout << " int int的func" << endl; } } void test9() { //using指明 使用 A中的func 会对 所有的func起作用 using A::func; func(); func(10); func(10, 20); }
总结
不知道各位读者在看完本文后是否跟作者与相同的疑惑,using namespace std;跟using和namespace是不是有啥关联呢?👀
这里说明一下main中的std:
1、使用标准的命名空间std。
2、std中所有成员名 可以直接使用。
3、cout endl cin都是命名空间std的成员。
简单的来说就是这个std其实跟我们上面用using、namespace的原理是相同的!
以下是详细的介绍:
using namespace std;是C++中的一个命名空间的声明语句,它的作用是引入标准命名空间std中的所有成员,使得在代码中可以直接使用std命名空间中的函数、类、对象等,而不需要使用std::前缀。
using声明是C++中的一个语法结构,它可以用来引入命名空间中的特定成员。例如,可以使用using std::cout;来引入std命名空间中的cout对象,之后就可以直接使用cout,而不需要使用std::cout。
namespace是C++中的一个关键字,用于定义命名空间。命名空间可以看作是一个容器,用于将全局作用域中的标识符(如变量、函数、类等)进行分组,以避免命名冲突。例如,std命名空间中包含了许多标准库的函数和类。
因此,using namespace std;语句的作用就是引入std命名空间中的所有成员,使得在代码中可以直接使用std命名空间中的函数、类、对象等,而不需要使用std::前缀。
感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!
给个三连再走嘛~