1、命名空间
c++引入命名空间是为了解决命名冲突问题;
假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。
同样的情况也出现在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。
因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。
(1) 定义命名空间
命名空间的定义使用关键字 namespace,后跟命名空间的名称,如下所示:
namespace namespace_name {
// 代码声明
}
实例
#include <iostream>
using namespace std;
// 第一个命名空间
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// 第二个命名空间
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
int main ()
{
// 调用第一个命名空间中的函数
first_space::func();
// 调用第二个命名空间中的函数
second_space::func();
return 0;
}
(2)using 指令
可以使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。
#include <iostream>
using namespace std;
// 第一个命名空间
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// 第二个命名空间
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main ()
{
// 调用第一个命名空间中的函数
func();
return 0;
}
2、变量
(1)常数:
两种定义方式:
#define PI 3.14
const float PI 3.1415
(2)整数
类型 | 字节数(位数) | 最小值 | 最大值 |
---|---|---|---|
int | 4(32) | -2147483648 | 2147483648 |
shot int | 2(16) | -32768 | 32768 |
unsigned int | 4(32) | 0 | 4294967295 |
… |
(3)浮点型:
float:4字节;
double:8字节;
long double:16字节;
(4)字符
- 包含字母、数字、标点、控制符号等;
- 每个字符占1字节(8位);
- 在内存中以整数数值(ASCII码的10进制表示)的方式存储;
- C++声明字符时用单引号(‘A’)引起来;
- char:占8位, -128 —127
- unsigned char: 8位 0-255
3、运算符&表达式
位运算符
(在学习…)
4、数据类型转换问题
(1)自动转换
类型数值范围大的优先作为转换对象
double>float>unsigned long>long> unsigned int> int
也就是long 和int相加会自动转换成long
(2)强制转换
使用于大范围转换小范围
int a;
float b,c;
a=(int)b+c;
5、数组
(1)一维数组
- 最基本的数组结构。
- 和变量一样,必须先声明,编译时才给分配连续的内存空间。
- int A[6]; int A[6]={1,2,3,4,56};
- 初值数小于数组元素个数,以0填充。
- 没有指定数组元素个数,编译时按初值个数赋值。
(2)二维数组
- int A[5][6]; int A[5][6]={0};
- int A[2][4]={{1,2,3},{4,5,6}}; //用0补
- int A[ ][3]={{1,2,3},{4,5,6}}; <-----以上四种定义方式合法;
- int A[5][]6; <-----不合法!!
6、字符串
-
c++加了字符串类string来表示字符串;
-
字符串必须用’\0’表示一个字符串的结束
-
‘a’:字符a,长度1; “a”:字符串a, 长度2;
-
声明:
1、
char a[]=“STRING”;
或:
char a[7]={‘S’,‘T’,‘R’,‘I’,‘N’,‘G’,’\0’};
或用指针:
char* a = “STRING”;注:先创建字符串数组,再赋值,会出现错误:
char s[20];
s =“123456”; ×
正确方法是:strcpy(s,“123456”); -
用String类
在头文件中。
string s1;
string s2=“String”;
s2 = a; //可以
char s3[] = s2; //错误 -
字符串比较问题
=:赋值;
+:拼接;
==:判断是否相等;
<、>:按照ASCII码值比较; -
String类的成员函数:
函数名称 | 功能 |
---|---|
构造函数 | 产生或复制字符串 |
析构函数 | 销毁字符串 |
=,assign | 赋以新值 |
Swap | 交换两个字符串的内容 |
+ =,append( ),push_back() | 添加字符 |
insert () | 插入字符 |
erase() | 删除字符 |
clear () | 移除全部字符 |
resize () | 改变字符数量 |
replace() | 替换字符 |
+ | 串联字符串 |
==,! =,<,<=,>,>=,compare() | 比较字符串内容 |
size(),length() | 返回字符数量 |
max_size () | 返回字符的最大可能个数 |
empty () | 判断字符串是否为空 |
capacity () | 返回重新分配之前的字符容量 |
reserve() | 保留内存以存储一定数量的字符 |
[],at() | 存取单一字符 |
>>, | getline() 从 stream 中读取某值 |
<< | 将值写入 stream |
copy() | 将内容复制为一个 C - string |
c_str() | 将内容以 C - string 形式返回 |
data() | 将内容以字符数组形式返回 |
substr() | 返回子字符串 |
find() | 搜寻某子字符串或字符 |
begin( ),end() | 提供正向迭代器支持 |
rbegin(),rend() | 提供逆向迭代器支持 |
get_allocator() | 返回配置器 |