C++入门

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、宏是可以撤销的






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值