七、命名空间和数组
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 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。
| #include <iostream>
using namespace std;
int main(){
count<<"hi c++" << endl;
return 0 ;
}
|
2. 数组
c++
的数组实际上和python
的 list
差不多,都是具有下标(索引) , 稍有不同的是,python
的list
不区分类型,而c++
的数组必须是同一类型。
| scores = [100,98,88,'zhangsan',True]
for s in scores:
print(s)
|
| #include <iostream>
int main() {
int scores[]{100,95,90,88}
for(int s : scores){
std::cout << s << std::endl;
}
return 0 ;
}
|
1. 声明和初始化
数组是一系列相同类型的元素,放置在连续的内存位置,数组中的元素都可以通过索引来单独操作它们。 若查看某个变量存储地址可以使用 取地址符 &
仅仅声明,而没有初始化的数组,内部的元素无法得到保证,系统会随机进行赋值。
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可以认为是有多少列。多维数组无法进行长度推断,所以具体到行列的长度