C++day01复习
一C++与C的重要区别
1、C++是完全兼容C的所有内容
2、支持面向对象的编程思想
3、支持运算符重载,函数重载的编译时的多态机制
4、泛型编程,模板
5、支持异常处理
6、类型检查更严格
二、C++与C数据类型的不同
1、结构的不同
a、不再需要使用typedef关键字,结构设计好后,定义结构变量时不再需要struct关键字
b、结构体中的成员可以有函数,结构变量、结构指针使用.或者->来访问成员函数,在结构的成员函数中可以直接访问成员变量,
不再需要.或者->
c、C++结构中有一些隐藏的成员函数(构造、析构、拷贝构造、赋值)
d、可以继承其它结构,也可以被其它结构继承
e、可以给成员设置访问属性
public 公开的(默认)
protected 保护的
private 私有的
2、联合的不同
a、不再需要使用typedef关键字,联合设计好后,定义联合变量时不再需要union关键字
b、联合中的成员可以有函数,联合变量、联合指针使用.或者->来访问成员函数,在联合的成员函数中可以直接访问成员变量,
不再需要.或者->
c、C++联合中有一些隐藏的成员函数(构造、析构、拷贝构造、赋值)
d、可以给成员设置访问属性
public 公开的(默认)
protected 保护的
private 私有的
3、枚举的不同
a、不再需要使用typedef关键字,枚举设计好后,定义枚举变量时不再需要enum关键字
b、是一种独立的数据类型,不能与整形进行隐式转换了
4、bool类型不同
a、C++中有真正的布尔类型,bool 是C++中的关键字,不再需要包含stdbool.h头文件了。
b、bool、true、false都是C++中的关键字,而C语言中不是
c、true、false在C++中是1个字节,而C语言中是4字节
注意:无论是C还C++的bool类型变量,只能存储 0|1
5、字符串的不同
a、C++中的字符串被封装了string类,但可以与C语言的字符串进行转换
b、string类是被封装在string头文件中,但是已经被包含在iostream头文件中,属于std名字空间
c、使用string字符串,可以以运算符的方式操作,C语言中的string.h系统函数也可以继续使用
= strcpy
+= strcat
== strcmp
size() strlen
6、void 不同*
在C语言中,void* 可以与任意类型的指针进行转换
而在C++中,void* 不可以自动转换为其它类型的指针,如果要赋值给其它类型的指针,则必须使用强制类型转换,为了提高指针的安全性
其它类型的指针可以直接转换为void类型的指针,C++中之所以保留该功能,是因为C语言标准库、系统接口中采用了大量的void作为函数的参数,如果不保留该功能,C++在调用这些函数时会非常麻烦,因此保留。
三、名字空间
C++中设计了一种对命名空间进行逻辑划分成单元的技术就叫做名字空间,它是一种解决命名冲突的机制。
namespace xxx{
变量;
函数;
结构、联合、枚举;
类;
}
定义的名字空间就形成一个封闭的作用域
3、如何使用
a、直接导入
using namespace xxx;
这样可以直接使用该名字空间中的所有内容,虽然很方便,但是不推荐这样用
b、域限定符
xxx::标识符
4、名字空间合并
名字空间可以多次定义,不同位置的相同名字的名字空间会自动合并
a.cpp
namespace n{
xxx;
}
b.cpp
namespace n{
yyy;
}
main.cpp
using namespace n;
//会把a.cpp中的xxx和b.cpp中的yyy等标识符全部导入到main.cpp中
5、声明和定义可以分开
a.h
namespace n1{
extern int num;
}
a.cpp
int n1::num;
注意:在定义时需要使用域限定符
6、匿名空间
所有的全局标识符都归属于一个名字空间,如果没有指定,则默认属于匿名空间,匿名名字空间中的成员可以通过 ::成员名 来访问
例如:局部变量把同名的全局变量屏蔽后,可以使用 ::变量名 指定使用全局变量
7、名字空间可以嵌套
namespace n1{
int num = 1;
namespace n2{
int num = 2;
namespace n3{
int num = 3;
}
}
}
采用逐层分解的方式使用
n1::n2::n3::num;
也可以导入指定层的名字空间
using namespace n1::n2;
8、给名字空间取别名
namespace n123 = n1::n2::n3;
四、 C++的堆内存管理
1、C++中有专门管理堆内存的语句,而C语言只能使用标准库中提供的函数
new 分配内存 相当于C语言中的malloc
delete 释放内存 相当于C语言中的free
2、new分配内存时允许对内存进行初始化
int* p = new int(val);
3、new/delete 与 malloc/free 不要混用
int* p = new int;
free§; //虽然语法允许,但是不要这样用
使用new分配内存时会自动调用类型的构造函数,而delete会自动调用类型的析构函数,但是malloc/free做不到
4、数组的分配和释放
new 类型[个数] 分配一块连续的多个类型相同的内存,相当于calloc
相当于在堆内存中分配了一个组数,并且会自动调用多次构造函数
delete[] 专门用于释放new []所申请的内存,并且会自动调用多次析构函数
注意:new/delete malloc/free new[]/delete[] 不能混用
使用new[]为结构、联合、类申请到的内存的前面4个字节记录了申请的次数,这样可以让编译器应该调用多少次构造、析构函数
5、重复释放
delete可以释放空指针,但别的不能重复释放,这一点与free一致
6、内存分配失败
malloc分配失败返回NULL
new 分配失败会抛出一个异常 std::bad_alloc
7、new和malloc的返回
new 返回一个有类型的指针
malloc 返回一个void*类型的指针
熟练掌握: malloc/free 与 new/delete 的区别?
身份: 函数 运算符/关键字
返回值: void* 带类型的指针
参数: 字符个数(手动计算) 类型(自动计算)
失败: NULL 抛异常std::bad_alloc
构造\析构: 不调用 自动调用
初始化: 不能初始化 可以初始化为指定的值
头文件: 包含头文件 直接使用