- c++是c的增强版,是几乎完全兼容C的
- C++在c的基础上增加了很多新的内容
- 编程思想发生了转变,c面向过程,c++是面向过程+面向对象
- 命名空间
为了解决命名冲突的问题
定义:
Namespace 命名空间名
{
变量名;
函数名;
类型名;
....
};
访问方式:
- 命名空间名::变量名
- Using namespace 命名空间名;
“::”是作用域运算符
引用
目的:
- 弱化指针,原本需要指针的地方现在用引用也可以达到相同的作用,更方便
- 减少临时空间的产生
引用:其实就是变量的别名
定义:数据类型 &引用名=变量名;
Int a=10;
Int &b=a;
Ps:
- 访问引用就是在访问变量
- 引用不会开辟空间
- 引用必须被初始化
Const:只读 修饰的引用:
- 防止实参被修改
- 可以是常量的别名
Const int &a=100;
相当于#define a 100
函数重载:功能类似,函数名相同,参数不同,与返回值无关,这样的函数就互为重载
函数重载的原理:
g++在编译的时候会对函数名结合参数和个数进行重命名,所以在函数调用时是按照重命名之后的函数名进行调用的
默认参数:
函数在声明时形参可以有默认值,如果函数在调用时传参了就使用传进来的值,否则就使用默认值,注意:默认值必须依次从右向左
C++如何调用c库的函数
如果是g++就打印g++,如果是gcc就打印gcc?
- g++中定义了_cplusplus这个宏,而gcc没有
- Sizeof(字符常量)的结果不一样
g++(1) gcc(4)
extern “C” :告诉g++,以下函数是外部的c库的函数,不需要重命名
类和对象
回忆结构体的作用:描述一类事物的属性的自定义的数据类型
笔试题:c的结构体和c++的结构体的区别?
- c 的结构体中不能有函数,但c++可以
- c中空结构体内存大小为0,但c++为1
类:描述一类事物的属性和行为的自定义的数据类型
C++中结构体和类的区别?
结构体的默认访问限定符是public ,而类是private
访问限定符:
Public修饰的成员既可以在类内被访问,也可以在类外被访问
private和protected修饰的成员只能在类内被访问
定义数据类型不会分配空间,是抽象的,对象是具体的实体(定义变量会分配空间)
所以:用类的数据类型定义变量的过程叫实例化对象
封装
C++三大特性:封装,继承,多态
考点:你对封装怎么理解?
封装就是把一类事物的属性和行为这种自定义的数据类型包起来,把需要隐藏的隐藏起来,把可以暴露的暴露出来,这就叫封装
This指针
谁正在调用成员函数,谁就是当前类对象
Public:成员在类外和类内都可以被访问
类内:在成员函数中可以直接被访问
类外:必须要先有对象,然后通过对象进行访问
不管在类外还是类内,访问成员必须要有对象,通过对象.成员或者指针->成员的方式进行访问
- 构造函数和析构函数
构造函数:给成员变量初始化的
谁调用:系统自动调用
实例化对象时调用
构造函数的定义:
- 函数名和类型相同
- 无返回值
- 参数不限制(构造函数可以有多个,可以重载)
深拷贝和浅拷贝
拷贝构造函数的参数必须是对象的引用
什么时候需要自己定义拷贝构造函数?
构造函数中有New
static修饰成员变量:
- 必须在类内声明在类外定义
原因:static修饰的变量在编译阶段就会开辟空间,而类在编译解决没有空间,成员变量又是类的一部分,有矛盾,而声明不分配空间,定义才分配空间
- 先于对象而存在,一个类只有一份,所有对象共享,不占某个对象的内存空间大小
- 在类外可以直接通过类名加作用域的方式进行访问
Const:只读
Const修饰的成员变量,不能作为左值,只能使用初始化列表的方式进行初始化
初始化列表的顺序不能决定初始化的顺序
初始化的顺序只与声明顺序有关
所以顺序依旧是a,b
const修饰的成员函数:
- const修饰的成员函数中不能修改任何成员变量的值
- Const看似在修饰成员函数,实则是在修饰这个成员函数的第一个形参this
- 不能修改成员变量的值
Mutable:
打破了封装
私有的或者受保护的成员只能在类内被访问不能在类外被访问,如果确实是需要访问私有的成员,就需要留公有的接口来访问。