【C++】std::是什么?

“std”一个命名空间。“::”运算符是“范围”运算符。它告诉编译器在哪个类/命名空间中查找标识符。

所以std::cout告诉编译器你想要“cout”标识符,并且它在“std”命名空间中。

如果你刚才说cout,那么它只会在全局命名空间中查找。由于 cout 没有在全局命名空间中定义,所以它无法找到它,并且会给你一个错误。告诉编译器“获取 std 命名空间中的所有内容并将其转储到全局命名空间中”。这允许您在没有 std:: 前缀的情况下使用,但它增加了名称冲突的可能性,因为您没想到的一堆额外名称也被添加到全局名称空间中,

using namespace std;cout

C++ 标准库头文件

https://en.cppreference.com/w/cpp/header

引例:

#include<iostream>
int main()
{
    std::cout<<"我喜欢C++";//输出一句话
    std::cout<<std::endl;//换行
    return 0;
}

1.std是什么?

        std::    是个名称空间标示符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准函数库中的函数或对象都要使用std来限定。

         对象count是标准函数库所提供的对象,而标准库在名字空间中被指定为std,所以在使用cout的时候要加上std::。这样编译器就会明白我们调用的cout是名字空间std中的cout。             

2.为什么将cout放到名字空间std中?

是因为像cout这样的对象在实际操作中或许会有好几个,比如说你自己也可能会不小心定义了一个对象叫cout,那么这两个cout对象就会产生冲突。

3.std都是什么时候使用?

   一般来说,std都是要调用C++标准库时,要写上std;

   使用非标准库文件iostream.h,不用写。

比如上面引例这样改写就不需要std:

#include<iostream.h>
int main()
{
    cout<<"我喜欢C++";//输出一句话
    cout<<endl;//换行
    return 0;
}

当然还有一种方法:

在main函数的上面使用了两行语句:

using std::cout;
using std::endl;

那么cout和endl前面就不需要std::

比如这样改写引例:

#include<iostream>
using std::cout;
using std::endl;
int main()
{
    cout<<"我喜欢C++";//输出一句话
    cout<<endl;//换行
    return 0;
}

其实还有种更简便的方法,就是直接使用using namespace std来代替using std::cout和using std::endl。

using namespace std 告诉编辑器我们将要使用空间std中的函数或者对象。

所以cout和endl前面不用注明它们是std这个名字空间中的cout和endl。

#include<iostream>
using namespace std;
int main()
{
    cout<<"我喜欢C++";//输出一句话
    cout<<endl;//换行
    return 0;
}

C++ 字符串 – C++ 中的 std::string 示例

字符串是任何编程语言中必不可少的组成部分,C++ 也不例外。

无论您是想存储文本、操作文本还是接受键盘输入和输出,了解什么是字符串以及如何有效地使用它们都非常重要。

本文将教授您需要了解的有关在 C++ 中处理和使用字符串的所有知识。

什么是字符串?

字符串本质上是字符的集合。一些示例包括“Hello World”、“我的名字是 Jason”等。它们用双引号括起来"

在 C++ 中,我们有两种类型的字符串:

  1. C 风格的字符串
  2. std::strings(来自 C++ 标准字符串类)

您可以使用自己的小函数非常轻松地创建自己的字符串类,但这不是我们将在本文中讨论的内容。

C 风格的字符串

这些是从 C 编程语言派生的字符串,并且在 C++ 中继续得到支持。char这些“字符集合”以空终止\0空字符)类型的数组的形式存储。

如何定义 C 风格的字符串:

char str[] = "c string";

这里,str是一个char长度数组9(额外的字符来自\0编译器添加的空字符)。

以下是在 C++ 中定义 C 风格字符串的其他一些方法:

char str[9] = "c string";
char str[] = {'c', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};
char str[9] = {'c', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};

如何将 C 风格的字符串传递给函数

#include <iostream>

int main() {
    char str[] = "This is a C-style string";
    display(str);
}

// C-style strings can be passed to functions as follows:
void display(char str[]) {
    std::cout << str << "\n";
}

如何在 C++ 中使用 C 风格的字符串函数

C 标准库附带了几个方便的函数,您可以使用它们来操作字符串。虽然不广泛推荐使用它们(见下文),但您仍然可以通过包含<cstring>标头在 C++ 代码中使用它们:

#include <cstring> // required


1. strcpy(s1,s2) --> Copies string s2 into string s1.                 
2. strcat(s1,s2) --> Concatenates string s2 onto the end of string s1
3. strlen(s1)    --> Returns the length of string s1         
4. strcmp(s1,s2) --> Returns 0 if s1==s2; less than 0 if s1<s2; greater than 0 if s1>s2
5. strchr(s1,ch) --> Returns a pointer to the first occurrence of character ch in string s1
6. strstr(s1,s2) --> Returns a pointer to the first string s2 in string s1      

标准::字符串

C 风格的字符串相对不安全——如果字符串/字符数组不是以 null 结尾的,它可能会导致大量潜在的错误。

例如,一大堆其他缺点中的缓冲区溢出是C++ 开发人员社区不推荐使用 C 风格字符串的一些原因。

C++ 标准库提供的std::string类是一个更安全的替代方案。以下是你如何使用它:

如何定义一个std::string

#include <iostream> 
#include <string> // the C++ Standard String Class

int main() {
    std::string str = "C++ String";
    std::cout << str << "\n"; // prints `C++ String`"
}

std::stringC 风格的字符串和s之间最明显的区别是字符串的长度。如果您需要 C 样式字符串的长度,则每次都需要使用如下strlen()函数计算它:

#include <iostream>
#include <cstring> // required to use `strlen`

int main() {
    char str[] = "hello world";
    std::cout << strlen(str) << "\n";
}

如果您不将其存储在变量中并且在程序的多个部分中都需要它,您可以快速观察到此选项的成本。  

另一方面,std::string字符串已经具有内置的长度属性。要访问它,您可以使用以下.length()属性:

#include <iostream>
#include <string> // required to use `std::string`

int main() {
    std::string str = "freeCodeCamp";
    std::cout << str.length() << "\n";
}

简单、整洁、简洁,但重要的是减少了计算量。

但是访问长度属性并不是使用std::strings 的唯一好处。这里还有几个例子:

#include <iostream>
#include <string>

int main() {
   std::string str = "freeCodeCamp";
   
   // Inserting a single character into `str`
   str.push_back('s');
   std::cout << str << "\n"; // `str` is now `freeCodeCamps`
   
   // Deleting the last character from `str`
   str.pop_back();
   std::cout << str << "\n"; // `str` is now `freeCodeCamp`
   
   // Resizing a string
   str.resize(13);
   std::cout << str << "\n"; 
   
   // Decreasing excess capacity of the string
   str.shrink_to_fit()
   std::cout << str << "\n";
}

如何传递std::string一个函数

#include <iostream>

int main() {
    std::string str = "This is a C-style string";
    display(str);
}

// Passing `std::string`s are as you would normally pass a regular object
void display(std::string str) {
    std::cout << str << "\n";
}

你什么时候会使用 C 风格的字符串 over std::string

到现在为止,您应该确信std::strings 比 C 风格的字符串有很多优势(最显着的是自动内存管理)。但有时您想使用 C 风格的字符串来代替:

  1. 如果您有 C 背景,您可能会习惯使用 C 风格的字符串。
  2. std::string,尽管有好处,但非常复杂。像其他语言一样,如果你不知道自己在做什么,它会很快变得非常复杂。另外,它使用了大量的内存,这对于您的程序而言可能并不理想。
  3. 如果您在运行时小心地管理程序的内存(通过在完成使用对象时释放对象的内存),考虑到它们的小和轻量级,使用 C 风格的字符串会带来性能优势。

总结

我希望这篇文章可以作为 C++ 中字符串的介绍。关于这个美妙的抽象还有很多东西要学习,我希望写更多的文章来深入研究更高级的字符串和 C++ 概念。