C++标准输入输出及命名空间

1.hello world

#include <iostream>
// iostream 是标准输入输出的头文件
//C++中编译器更严格,main函数的返回值必须是 int 类型
int main(int argc, const char *argv[])
{
//std 是标准命名空间,为了解决命令污染的问题
//cout 是标准输出流对象
//:: C++中才有的运算符 作用域限定符 表示cout是std命名空间里的
//<< 流输出运算符,向输出流对象输出数据
//endl 换行 \n
std::cout<<"hello world"<<std::endl;
return 0;
}

2.标准输出–cout

cout自动识别输出对象的类型

#include <iostream>
int main(int argc, const char *argv[])
{
char a = 'c';
short b = 10;
int c = 20;
std::cout<<a<<" "<<b<<" "<<c<<std::endl;
return 0;
}

练习:
使用cout输出斐波那契数列的前20位。1 1 2 3 5 8 13 。。。

#include <iostream>

int main(int argc, const char *argv[])
{
int a = 1;
int b = 1;
int c = 0;
std::cout<<a<<std::endl;
std::cout<<b<<std::endl;
for(int i = 0; i < 18; i++)
{
 c = a+b;
 std::cout<<c<<std::endl;
 a = b;
 b = c;
}
return 0;
}

3.标准输入–cin

cin 是标准输入流对象 也是自动识别输入类型的

#include <iostream>
int main(int argc, const char *argv[])
{
   int num = 0;
   std::cin>>num;//cin输入时不加endl 类似于scanf 不加 \n 一样
   std::cout<<"输入的数据是:"<<num<<std::endl;
   char c = '0';
   std::cin>>c;
   std::cout<<"输入的字符是:"<<c<<std::endl;
   int a = 0;
   int b = 0;
   std::cin>>a>>b;
   std::cout<<a<<" "<<b<<std::endl;
   return 0;
}

4.cout的格式化输出

#include <iostream>
#include <iomanip> //需要加上该头文件
using namespace std; //需要使用命名空间 std

int main(int argc, const char *argv[])
{
int a = 126;
std::cout<<"dec:"<<std::dec<<a<<std::endl;//十进制输出
std::cout<<"hex:"<<std::hex<<a<<std::endl;//十六进制输出
//需要加上 iomanip 头文件 和 命名空间 std
std::cout<<"oct:"<<setbase(8)<<a<<std::endl;//八进制输出
const char *p = "hello";
std::cout<<p<<std::endl;
std::cout<<setw(8)<<p<<std::endl;//指定8位位宽输出 是右对齐的
//指定8位位宽输出 是右对齐的 不够的位 补 *
std::cout<<setfill('*')<<setw(8)<<p<<std::endl;
return 0;
}

练习:
1.输入一个字符,小写转大写,大写转小写,其他情况输出 *
2.打印下面的图案
*
**
***
****
*****

#include <iostream>
int main(int argc, const char *argv[])
{
int i = 0;
int j = 0;
for(i = 0; i < 5; i++){
	for(j = 0; j <=i; j++){
	std::cout<<"*";//不加endl 输出就不换行了
	}
	std::cout<<std::endl;
}
	return 0;
}

三、命名空间

出现相同的命名,会有冲突。名字包括 变量名、函数名、结构体名、枚举名…

1.命名空间的使用方式

1.std::cout //每次使用名字时都加命名空间
2.using std::cout;//使用名字前,先用using关键字声明一下
//声明之后,后面所有使用该名字时,都不需要加命名空间了
3.using namespace std;//声明要使用 std 命名空间中的所有名字
//后面使用任何一个都不需要加 std:: 了

 #include <iostream>
//using std::cout;//2
//using std::endl;//2
using namespace std;//3
int main(int argc, const char *argv[])
{
//std::cout<<"hello world"<<std::endl; //1
//cout<<"hello world"<<endl;//2
cout<<"hello world"<<endl;//3
int a;
cin>>a;
cout<<a<<endl;
return 0;
}

2.自己写命名空间

格式:

namespace 命名空间名{
成员类型1 成员名字1;
成员类型2 成员名字2;
...
成员类型n 成员名字n;
}

例如:

#include <iostream>
using namespace std;
namespace Teacher{
char name[32] = "Yangfs";
int age = 18;
}
using Teacher::name;//2
using namespace Teacher;
int main(int argc, const char *argv[])
{
//cout<<Teacher::name<<Teacher::age<<endl;
//cout<<name<<endl;//2
//cout<<age<<endl;//2 只声明 name 是不能用age的
cout<<name<<" "<<age<<endl;
return 0;
}

防止污染,可以将冲突的名字用不同的命名空间包起来

#include <iostream>
using namespace std;

namespace Teacher{
char name[32] = "Yangfs";
int age = 18;
}

namespace Student{
char name[32] = "Xiaoming";
int age = 16;
}

using namespace Teacher;

int main(int argc, const char *argv[])
{
  cout<<name<<" "<<age<<endl;//使用的是Teacher里的名字
  return 0;
}

及时定义了命名空间,也可能出现污染的情况

#include <iostream>
using namespace std;

namespace Teacher{
char name[32] = "Yangfs";
int age = 18;
}

namespace Student{
char name[32] = "Xiaoming";
int age = 16;
//short age = 15;//同一个命名空间中是不可以出现相同名字的
 }

//当声明了多个命名空间里面都有相同的名字时,还是会有冲突  
using namespace Teacher;
using namespace Student;

int main(int argc, const char *argv[])
{
//有歧义 会报错
//cout<<name<<" "<<age<<endl;
//有歧义了 就必须用 命名空间名和作用域限定符 来区分了
cout<<Teacher::name<<" "<<Teacher::age<<endl;
cout<<Student::name<<" "<<Student::age<<endl;
return 0;
}

当命名空间中的名字和局部变量的名字冲突时

#include <iostream>
using namespace std;
namespace Teacher{
char name[32] = "Yangfs";
 }
using namespace Teacher;
int main(int argc, const char *argv[])
{
char name[32] = "Xiaoming";
//当命名空间中的名字和局部变量的名字冲突时
//不会报错 会使用 局部变量 ‐‐‐‐局部优先
cout<<name<<endl;
return 0;
}

没有命名空间的名字会被放在匿名空间里

#include <iostream>
using namespace std;

namespace Teacher{
char name[32] = "Yangfs";
}
using namespace Teacher;
//没有命名空间的名字会被放在匿名空间里
char name[32] = "Xiaoming";
 int main(int argc, const char *argv[])
 {
 cout<<Teacher::name<<endl;
 cout<<::name<<endl;//使用匿名空间中的名字
 return 0;
 }

命名空间可以嵌套使用 —了解就行

#include <iostream>
using namespace std;
namespace Teacher{
char name[32] = "Yangfs";
namespace Student{
 char name[32] = "Xiaoming";
 }
}
 using namespace Teacher;
 int main(int argc, const char *argv[])
 {
 cout<<Teacher::name<<endl;
 cout<<Teacher::Student::name<<endl;//嵌套的命名空间的使用
 return 0;
 }

命令空间里可以封装函数

#include <iostream>
using namespace std;

namespace Teacher{
char name[32] = "Yangfs";
void print_hello();
}
void Teacher::print_hello(){ //命名空间内部声明 外部定义的用法
cout<<"hello"<<endl;
}

using namespace Teacher;
int main(int argc, const char *argv[])
{
Teacher::print_hello();//函数的调用
return 0;
}

3.命名空间使用总结:

1.std::cout<<“hello”;
2.using std::cout;
3.using namespace std;
4.如果引用了多个命名空间,访问名字出现歧义时,需要加命名空间名:: 来区分
5.如果函数内部有名字和命名空间中的名字冲突时,局部优先原则
6.没有命名空间的名字会被默认放在匿名空间中 使用 ::name 来访问
7.命名空间可以嵌套使用–了解
8.命名空间中封装函数时,一般只封装函数声明,定义在外面
定义时,函数名前要用命名空间名和作用域限定符来指定定义的是哪个命名空间里的函数。


版权声明:本文为xyx340521原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>