目录
2.输入
引言
先来看一段最基础的C++和C语言的代码,打印Hello World!:
C++:
#include<iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
C:
#include<stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
我们可以发现一些区别:
1.包含的头文件不一样了,并且C++中头文件的结尾没有.h
2.C++中有using namespace std;这一行语句
3.C++中的打印是cout函数,并且没有括号而是<<
4.C++中换行是endl,而不是C语言中“\n”
下面我们来详细的讲一下区别:
正文
1.头文件iostream
<iostream> 和 `stdio.h` 是 C++ 和 C 中用于输入输出的头文件,它们有一些区别:
1. 命名空间:
- ’iostream` 中定义了输入输出流相关的类和函数,这些类和函数通常位于 `std` 命名空间下。因此,在使用时,需要使用 `std::` 前缀,比如 `std::cout`、`std::cin` 等。
- `stdio.h` 中定义了一系列 C 标准输入输出函数,如 `printf()`、`scanf()` 等,并没有定义在任何命名空间下,因此可以直接使用,不需要额外的命名空间前缀。
2. 类型安全:
- C++ 的 `iostream` 提供了类型安全的输入输出,它使用了运算符重载来支持不同类型的输入输出操作。比如,`<<` 和 `>>` 运算符被重载用于输出和输入操作,这使得代码更加直观,并且在编译时就能够检测到类型不匹配的错误。
- C 的 `stdio.h` 中的输入输出函数是不类型安全的,比如 `printf()` 和 `scanf()` 通过格式化字符串来确定输入输出的类型,因此在使用时需要保证格式化字符串与参数类型匹配,否则可能会导致运行时错误或未定义行为。
3. C++ 特性:
- `iostream` 提供了一些 C++ 特有的功能,比如 `std::cin` 和 `std::cout` 可以通过重定向实现与文件、字符串等的交互,而且支持类似于 `std::endl` 的操纵符来控制输出格式。
- `stdio.h` 是 C 语言的标准头文件,在 C++ 中也可以使用,但它不支持诸如流重定向和操纵符等 C++ 特性。
总的来说,`iostream` 更适合于 C++ 中的输入输出需求,它提供了更多的类型安全和面向对象的特性,而 `stdio.h` 则是 C 语言中的传统输入输出方式,在 C++ 中也可以使用,但相比 `iostream` 缺乏一些类型安全和面向对象的特性。
4. iostream中常用的函数
1. `std::cout`:标准输出流,用于向标准输出设备(通常是控制台)输出数据。
2. `std::cin`:标准输入流,用于从标准输入设备(通常是键盘)读取数据。
3. `std::cerr`:标准错误流,用于向标准错误设备(通常也是控制台)输出错误信息。
4. `std::endl`:操纵符,用于输出换行并刷新输出缓冲区。
5. `std::flush`:操纵符,用于刷新输出缓冲区但不输出换行符。
6. `std::getline()`:用于从输入流中读取一行数据并存储到字符串中。
7. `std::setw()`:设置输出字段的宽度。
8. `std::setprecision()`:设置浮点数输出的精度。
9. `std::fixed`:操纵符,设置浮点数输出为固定小数点格式。
10. `std::scientific`:操纵符,设置浮点数输出为科学计数法格式。除了上述函数外,`iostream` 还定义了一些其他输入输出类和函数,以及一些与文件输入输出相关的类和函数,如文件流类 `std::ifstream`、`std::ofstream`,以及文件操作函数 `std::open()`、`std::close()` 等。
2.命名空间namespace
1.命名空间的理解:
在C++中,命名空间(namespace)是一种用来组织代码和防止命名冲突的机制。命名空间可以将代码中的全局变量、函数和类等成员组织到一个作用域中,使得不同的作用域中的标识符可以具有相同的名称而不会发生冲突。
命名空间的主要作用包括:
-
避免命名冲突: 在大型项目中,往往会有多个开发者编写代码,如果不使用命名空间,很容易发生变量、函数或类名重名的情况,导致代码不可维护。使用命名空间可以将不同模块或库中的标识符隔离开来,避免冲突。
-
代码组织和管理: 命名空间可以将相关的代码组织到一个逻辑单元中,使得代码更具可读性和可维护性。通过使用命名空间,可以清晰地知道哪些标识符属于哪个模块或库。
-
可扩展性和可重用性: 使用命名空间可以提高代码的可扩展性和可重用性。当需要添加新的功能或模块时,可以将其放置在特定的命名空间下,而不会影响到其他部分的代码。
举个例子吧,我们的名字,有很多时候会重名,比如张三。世界上可能有几十几百个张三。
我们的世界里当然可以用身份证号码来分啦,但在没有身份证的时代怎么分呢?
有办法的,比如,可以在名字前面加上地方名,如
广东的张三
上海的张三
同样的道理,我们在编程时,不同的程序员可能都会喜欢用同样的名字来表示相同的东西,如,大家可能都会用 dog 来表示狗类。好了,现在有好几位程序员都写了 dog 类,可能各自的功能不同或相同。就好比好几家人都养了条狗一样。好了,在程序调用时,编译器傻了,它不知道该拉哪家的狗出来响应呀!
怎么办?哦,让我们在狗前面加上 namespace(名字空间) 以示区分,好了,于是程序中就有了
张三 的 狗
李四 的 狗
例如:
#include<iostream>
namespace A
{
int fun(int x, int y)
{
return x + y;
}
}
namespace B
{
int fun(int x, int y)
{
return x * y;
}
}
int main()
{
std::cout << A::fun(1, 3) << std::endl;
std::cout << B::fun(1, 3) << std::endl;
return 0;
}
运行结果:
2.命名空间的使用:
当我们想使用命名空间std里面的cout函数时,需要这样去写:
std::cout<<"Hello World!"<<endl;
使用规则是:
命名空间的名字 + :: + 函数名称
如何创建自己的命名空间呢:
//例如,定义一个名为 my_namespace 的命名空间并在其中定义一个函数:
namespace my_namespace
{
void my_function()
{
// 函数实现
}
}
所以在调用自己写的my_function函数时应写为:
my_namespace::my_function(); // 调用命名空间中的函数
还有另一种方法:
使用using将命名空间中需要使用的某个成员引入
using A::add; //函数引用
namespace A
{
int add(int x, int y)
{
return x + y;
}
}
int main()
{
cout << add(1,3) << endl;//此时的add函数就可以直接从A命名空间调用
}
但是经常写全名或者一个个引用会很繁琐,所以在没有冲突的情况下你可以偷懒,写一句
using namespace std;
相当于讲命名空间中所有的函数都引用了出来。(std就是C++标准函数库的命名空间)
3.输入和输出的实现
1.输出
我们在C语言中用printf进行打印,虽然C++中包含了<stdio.h>头文件后也可以使用,但是C++中提供了更高效安全的std::cout函数进行输出。
std::cout
是 C++ 标准库中用于标准输出的流对象。它通常与插入运算符 <<
一起使用,用于将数据输出到标准输出设备(通常是控制台)。std::cout
提供了一种方便的方式来显示程序输出,可以输出各种类型的数据,包括基本数据类型(如整数、浮点数)、字符、字符串以及用户定义的类型(通过重载 <<
运算符)等。
下面是一个简单的示例,演示了如何使用 std::cout
输出一条消息到控制台:
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}
并且在输出格式化的数据时,不需要再像printf一样写%d%c之类的,直接写变量就可以
#include<iostream>
using namespace std;
int main()
{
int i = 9;
cout << "i的值是:" << i << endl; //endl相当于C语言中的\n,表示换行
}
结果:
2.输入
类似于std::cout,C++中有其输输入函数std::cin
std::cin
是 C++ 标准库中用于标准输入的流对象。它通常与提取运算符 >>
一起使用,用于从标准输入设备(通常是键盘)读取数据到程序中的变量。std::cin
提供了一种方便的方式来获取用户输入的数据,可以读取各种类型的数据,包括基本数据类型(如整数、浮点数)、字符、字符串以及用户定义的类型(通过重载 >>
运算符)等。
#include <iostream>
int main() {
int number;
std::cout << "Enter an integer: ";
std::cin >> number;
std::cout << "You entered: " << number << std::endl;
return 0;
}
4.endl和"\n"区别
-
endl
:- endl 是一个特殊的控制符,用于在输出流中插入一个换行符并刷新缓冲区。
- 当你使用
std::cout << endl;
时,它会在输出流中插入一个换行符,并且会执行缓冲区的刷新操作,将缓冲区中的内容输出到目标设备(比如屏幕)。 - 由于
endl
会执行刷新操作,因此在某些情况下,使用频繁或在输出量大的情况下可能会影响性能。
-
'\n'
:'\n'
是换行符的转义字符,表示一个简单的换行操作,但不会执行缓冲区的刷新。- 你可以在输出流中直接使用
'\n'
,例如std::cout << "Hello\n";
将在输出中插入一个换行符,但不会执行刷新操作。 - 与
endl
相比,'\n'
的性能更高,因为它不涉及缓冲区的刷新。
因此,如果你只需要简单的换行而不需要立即刷新缓冲区,可以使用 '\n'
;而如果需要在输出换行的同时立即刷新缓冲区,可以使用 endl
。在大多数情况下,推荐使用 '\n'
,除非确实需要显式刷新缓冲区。
上述只是最基本的一些区别,后续会继续解释更多更深入的·区别,谢谢观看