C++入门
一、命名空间
1、命名空间的定义:namespace 命名空间的名称 {} 里面可以是 变量、函数、宏定义
2、将全局空间进行划分,全局空间也被成为默认命名空间,命名空间也可以相互嵌套
例如:
namespace Name1
{
int a;
int add(int a, int b)
{
return a + b;
}
#define PI 3.14
// 命名空间的嵌套
namespace Name1_1
{
}
}
3、命名空间的使用:
3.1使用域解析符来引用命名空间里面的内容
3.2使用using关键字:将命名空间1打开,后面直接使用Name1中的内容,不再加域解析符
using namespace Name1;
a = 10;
这里要注意的是:后面但凡没有指明具体命名空间的变量、函数,默认使用Name1中的
当然也可以只开启部分内容 using Name2::c 后面但凡没有明确指明具体命名空间的c,默认使用Name2中的c
4、命名空间之间命名的冲突:
使用域解析符解决冲突; 全局的变量使用默认命名空间的域解析符 ::a = 20;
二:C++标准库和std命名空间
C++ 是在C语言的基础上开发的,早期的 C++ 还不完善,不支持命名空间,没有自己的编译器,
而是将 C++ 代码翻译成C代码,再通过C编译器完成编译。这个时候的 C++ 仍然在使用C语言的库,
stdio.h、stdlib.h、string.h 等头文件依然有效;此外 C++ 也开发了一些新的库,增加了自己的头文件,
例如:
iostream.h:用于控制台输入输出头文件。
fstream.h:用于文件操作的头文件。
complex.h:用于复数计算的头文件。
后来 C++ 引入了命名空间的概念,计划重新编写库,将类、函数、宏等都统一纳入一个命名空间,
这个命名空间的名字就是std。std 是 standard 的缩写,意思是“标准命名空间”。
但是这时已经有很多用老式 C++ 开发的程序了,它们的代码中并没有使用命名空间,直接修改原来的库
会带来一个很严重的后果:程序员会因为不愿花费大量时间修改老式代码而极力反抗,拒绝使用新标准的 C++ 代码。
C++ 开发人员想了一个好办法,保留原来的库和头文件,它们在 C++ 中可以继续使用,然后再把原来的库复制一份,
在此基础上稍加修改,把类、函数、宏等纳入命名空间 std 下,就成了新版 C++ 标准库。这样共存在了两份功能相似的库,
使用了老式 C++ 的程序可以继续使用原来的库,新开发的程序可以使用新版的 C++ 库。
C:去掉.h前面加C stdio.h => cstdio
C++:去掉.h iostream.h => iostream
三:实用性
C++变量可以在任意位置 最小化变量的使用范围 在用的时候再去定义变量,而不是一开始就定义好
四:寄存器变量(register关键字)
1、C++不允许全局变量重复定义
2、如果对一个寄存器变量进行取地址操作 register声明将无效
五:结构体加强
1、在C语言中结构体只是一种数据的结合,而不是一种新的数据类型,所以在定义结构体变量前加上struct关键字
2、C++认为结构体是一种新的数据类型,可以用来定义变量
int main5_1()
{
// C语言中 结构体只是一种数据的集合,而不是一种新的数据类型,
// 所以在定义结构体变量前加struct关键字
struct Student stu = {10, "小明"};
// C++中认为 结构体是一种新的数据类型,可以用来定义变量
Student stu2 = {20, "小红"};
cout << "age = " << stu2.age << ", name = " << stu2.name << endl;
return 0;
}
六:C语言有一些不好的使用方式
1、函数可以没有返回值
2、函数没有参数的时候,调用可以填任意一个参数
3、函数参数可以没有类型
// 可以没有返回值
f(int a)
{
printf ("a = %d\n", a);
}
// 函数没有参数的时候,调用可以填任意个参数
void f1()
{
printf ("hello\n");
}
// 参数可以没有类型
void f2(a)
{
printf ("a = %d\n", a);
}
int main()
{
// f(10);
// f1(1,2,3,4,5,6);
// f2(111);
return 0;
}
七:bool类型
C:值只有2种,一个是真值为1,一个是假值为0
C++:0表示假, 所有非0都为真
判断真假:
bool b;
// 判断是否为真
if (b)
{
}
// 判断是否为假
if (!b)
{
}
// 浮点型数据涉及数据精度的问题
float f = 1.2f;
if (f - 0.0000001 < 0 && f+0.0000001 > 0)
{
}
九:三目运算符
1、C++中的三目运算符可以当左值使用 C语言返回的是数据的值,不能当左值使用 C++返回的是变量本身(a > b?a:b) = 90;
2、在C语言中让三目运算符当左值使用可以通过返回变量地址实现 *(a > b? &a :&b) = 90;
3、三目运算符当左值使用的时候表达式不能包含常量
十:const
C++ const 修饰的是一个常量,常量的值会被放到 符号表 中去, 不能通过变量名修改内存中的值
C语言:可以通过其他方式修改
C++:如果对const修饰的变量进行取地址操作,则编译器会在内存中为这个变量 分配空间 ,但是这个空间是不使用的
int *p =(int *)&a;
*p = 20;
C: a = 20;
C++: a = 10;
C++ :取地址a是并不是符号表中的a,而是内存中的a,因此p与a地址相同,但输出a是符号表中的
在C++中建议使用const代替宏常量:
1、宏常量不会做类型检查,在预处理期间进行完全替换
const常量是在编译的时候进行处理, 会做类型检测
2、宏常量不会做作用域检查,const常量会有作用域检查
3、宏常量的作用域是从它定义的位置开始一直到文件结束
4、宏是可以撤销的