七、命名空间和数组#

1. 命名空间#

假设这样一种情况,当一个班上有两个名叫 张三的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者某些特征等等。

同样的情况也出现在 C++ 应用程序中。例如,您可能会写一个名为 a 的变量,在另一个可用的库中也存在一个相同的变量 a。这样,编译器就无法判断您所使用的是哪一个。

因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。

1. 自定义命名空间#

使用命名空间范围内的成员(变量、函数、类),需要使用 域操作符::

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <iostream>

//深圳的张三
namespace shenzhen{
    string name = "张三";
}

//武汉的张三
namespace wuhan{
    string name = "张三";
}

int main() {
    std::cout << shenzhen::name << std::endl;
    return 0;
}

2. 使用using指令#

可以使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。

1
2
3
4
5
6
7
#include <iostream>
using namespace std;

int main(){
    count<<"hi c++" << endl;
    return 0 ;
} 

2. 数组#

c++的数组实际上和pythonlist 差不多,都是具有下标(索引) , 稍有不同的是,pythonlist不区分类型,而c++的数组必须是同一类型。

  • python的数组
1
2
3
scores = [100,98,88,'zhangsan',True]
for s in scores:
    print(s)
  • c++的数组
1
2
3
4
5
6
7
8
9
#include <iostream>

int main() {
int scores[]{100,95,90,88}
    for(int s : scores){
        std::cout << s << std::endl;
    }
    return 0 ;
}

1. 声明和初始化#

数组是一系列相同类型的元素,放置在连续的内存位置,数组中的元素都可以通过索引来单独操作它们。 若查看某个变量存储地址可以使用 取地址符 &

icon

  • 声明

仅仅声明,而没有初始化的数组,内部的元素无法得到保证,系统会随机进行赋值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <iostream>

int main (){

    int scores[5];

    //这里遍历打印出来,数组的元素是随机的。
    for(int s : scores){
        std::cout << "s=" <<s << std::endl;
    }
    return 0 ;
}
  • 初始化
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main(){
    //数组类型 数组名称  [元素个数]{初始化列表}

    //1. 声明后再初始化
    int scores [5];
    scores[0] = 11;
    scores[1] = 22;
    scores[2] = 33;
    scores[3] = 44;
    scores[4] = 55;


    //2. 声明并初始化
    int scores [5]{100,89,95,70,80};

    int socres [10]{88,75}; //剩下的都会以0占位,只初始化了前两位

    int socres [10]{0};; // 表示10个长度的数组,每个元素都是0

    //3. 自动推算数组大小
    int socres[]{22,33,44,55,66}; //数组长度没有指定,根据后面初始化长度来推断。
    return 0 ;
}

2. 访问数组#

  • 获取数组中的某个元素

数组是具有下标(索引)的容器,可以使用下标 (索引)来获取 , 下标(索引)从 0 开始。型如: 数组名称[元素索引]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>

int main(){

    //声明并初始化数组
    int scores [5]{100,89,95,70,80};

    std::cout<<"数组的第一个元素是: "<< scores[0]<<std::endl;
    std::cout<<"数组的第二个元素是: "<< scores[1]<<std::endl;
    std::cout<<"数组的第三个元素是: "<< scores[2]<<std::endl;
    std::cout<<"数组的第四个元素是: "<< scores[3]<<std::endl;
    std::cout<<"数组的第五个元素是: "<< scores[4]<<std::endl;


    //越界,不会报错,但是输出内容不是我们想看到的
    std::cout<<"数组的第一个元素是: "<< scores[5]<<std::endl; 

    //修改指定位置的元素
    scores[0] = 66;

    return 0 ;
}
  • 遍历数组

c++的数组,并没有提供获取长度的方法,所以不能直接遍历。一种是直接指定遍历的长度,一种是通过代码计算出数组的长度 ,一种是使用c++11提供的基于范围的for循环

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>

int main(){
    //定义数组
    int  scores[]{100,95,97,88,85,80,75};

    //直接指定数组
    for(int i = 0; i < 7; i++){
        std::cout << scores[i] << std::endl;
    }

    //手动计算数组长度
    int length = sizeof(scores) / sizeof(int);
    for(int i = 0 ; i < length; i++){
         std::cout << scores[i] << std::endl;
    }


    //+++++++++++++++++++++++++++++++++++++++++++++++++++

    //c++11 提供的for循环 
    for(int score : scores){
          std::cout <<cores[i] << std::endl;
    }
    return 0 ;
}

3. 多维数组#

数组里面的元素存储的还是数组,即可称之为多维数组。二维数组是常见的多维数组,再多维度的数组阅读起来就稍微有点复杂了。二维数组的操作实际上实际上和一维数组并没有多大区别。

  • 声明

数组类型 数组名称[x] [y]; x可以认为是有多少行 , y可以认为是有多少列。多维数组无法进行长度推断,所以具体到行列的长度

#