1.C++与C区别
<1>.c++是在C的基础上扩充了很多的内容,更加强大;
<2>c++是完全兼容C,只要合法的C程序在C++中也是合法的;
<3>.C面向过程的结构化程序设计语言;结构体:--》面向对象的编程,实现过程比较复杂!
.C++面向对象的编程语言:更多采用面向对象编程,更符合我们自然界的发展规律!
C++面向对象更注重结果:对象+对象(数据属性+对数据的操作)
C更注重过程:数据属性+对数据的操作。
2.命名空间
什么是命名空间?格式是什么样子?
定义: namespace 命名空间的名字
{
变量; 函数;
};
访问: 命名空间名字::变量/函数名();
或者使用 using namespace 名字;
- 引用类型
目的:弱化指针,因为引用可以实现和指针一样的效果;使用方便!
减少临时空间的分配;定义指针需要分配内存空间,而定义一个引用是不需要的!
什么是引用:其实就是给已经有的变量起个别名!它和变量指的是同一块内存空间!
定义格式:
Int a=10; int &b = a;
面试题目:引用和指针的区别?
- 引用一定要进行初始化;指针可以不初始化;
- 引用只能初始化一次;指针是可以改变指向;使用引用比指针安全
- 指针需要开空间,引用不需要
函数重载
什么是函数重载:函数名相同,功能相似、函数的参数不同、与返回值无关(个数、类型、顺序)的一组函数互为重载!
函数调用的原理:函数名其实就是函数在内存中的地址
函数重载的原理:
G++编译之后,会对函数名进行重名名,不同的函数名对应的函数在内存中的地址就是不一样的,调用的时候自然就执行不同的函数!
面向对象编程中类和对象
C++中的结构体与C中结构体的区别:
<1>.C结构体中不能有函数,而C++结构体中可以有函数;
<2>.C中空结构体占的内存大小是0;c++中空结构体占的内存大小是1!
把属性和行为整合在一起来描述一类事物的自定义的数据类型,在c++中把这种数据类型称为类!
C++中的结构体和C++中类的区别?
- 定义变量时初始化的方式不一样
- 结构体变量通过.可以直接访问数据成员;得出结构体中成员都是public权限
类类型的变量通过.方式获取数据成员:提示是private,没法访问;得到类中成员默认是private权限
- C++的类有访问成员的限定符:public、private、protected
public: 共有的,在类的内部、类的外部都可以访问
private和protected:在类的外部是不可以访问的;只能在类的内部可以访问
什么是类内:{} 范围之内的,都是类内
什么是类外:{} 范围之外的,都是类外
类这个类型定义出来的变量,不叫变量,叫做对象!
对象:使用这个自定义的类数据类型定义出来的变量;
类和对象是什么样子的关系:
电脑===== 我的电脑
总结:类是对象的抽象;对象是类的具体实例!
- 封装
面向对象编程的特性: 抽象、封装、继承、多态
抽象:就是根据多个对象观察他们共同的属性和行为,提取出来
封装:把提取出来的共性给整合在一起,得到一个整体;并且要对外提供一些接口供我们外部调用!
空调 ===》教室的空调
总结封装:把属性和行为整合起来,外壳用类这个自定义的数据类型封装起来,该隐藏的隐藏起来,该暴露的暴露出来!
哪些是该隐藏的? 一般属性都是隐藏起来的 private、protected
哪些是该暴露的? 行为都是暴露出来 public
定义一个数据类型,是不占内存空间的,但是它本身是有大小的;sizeof
只有在定义变量的时候,才会分配内存空间!!!
类和对象在内存中的关系:所有的这个类的对象共用一份成员函数;这个类的所有的对象都拥有一份自己的数据成员。创建对象的时候,其实是给数据成员分配内存空间的!
类的所有的成员函数都有一个隐藏的参数,是这个类类型的指针,用来保存调用这个成员函数对象的地址!
总结:
不管在类内部还是类的外部,访问成员都需要有对象!
如果是普通的对象,访问:对象名.成员;
如果是指针类型的对象,访问:指针对象->成员!
哪个对象调用 成员函数,this指的就是哪个对象的地址!
- 构造函数
本身:是函数
作用:对数据成员进行初始化;
什么时候谁来调用这个构造函数:创建这个对象的时候就已经调用了,系统帮你去调用的!当我们自己没有定义构造函数的时候,系统会有一个默认的构造函数(无参数函数体为空)!
类的所有的成员函数都有一个隐藏的参数,就是这个this; 类名 * const this;
构造函数格式:函数名和类名是一样的,没有函数类型,参数不定==(构造会有重载)!
默认构造函数:系统提供的
自己定义的,无参数
自己定义的,所有的参数都有默认值。
但是在一个类中,默认构造只能有一个!!!
- 析构函数
本质:函数
作用:做清理工作,回收对象所占的内存空间,如果我们在构造函数中有在堆区分配过内存空间,在析构中要记得去做释放!
什么时候谁来调用: 在对象生命周期结束的时候,系统自动来调用!析构函数如果我们自己不定义,系统提供!析构函数定义格式:无函数类型 无参 函数名:~类名(){}
拷贝构造:深拷贝和浅拷贝
什么时候执行拷贝构造:用已经存在的对象去初始化一个正在新创建的对象的时候,会去执行拷贝构造!我们自己没有定义,系统提供;如果我们自己定义了,系统不提供!
拷贝构造的格式:
函数名和类名一样,有参数并且这个参数是当前这个类类型的引用。
什么时候需要进行深拷贝?什么时候需要浅拷贝呢?
如果有在构造函数中使用new分配空间的,如有进行对象的拷贝,就需要进行深拷贝!
系统给我们提供的拷贝构造是浅拷贝构造;需要进行深拷贝,拷贝构造函数一定要自己去写!
- static修饰类的成员
static作用:
static修饰全局变量:限制了全局变量的作用域
static修饰局部变量:延长了局部变量的生命周期
static修饰函数:和修饰全局变量是一样的效果!
特点:存储在静态区
-
- static修饰类的数据成员
static修饰数据成员:类内声明,类外定义
结论:类的静态的数据成员属于类,但是不属于具体的某一个对象,但是所有的对象都可以访问。
类的静态的数据成员在编译的时候就已经给分配了内存空间!在创建对象的时候,不会再给静态的数据成员分配内存空间了!
类的静态数据成员访问:
<1>.通过对象名.变量名;
<2>.通过类::变量名; 放在public区域即可!
作用:实现数据的共享!!!
应用:例如实现ID自增等!
-
- static修饰类的成员函数
和类的静态数成员访问方式是一样的;也是可以通过对象和类名的方式去访问;
作用:实现方法的共享!
结论:静态的成员函数中只能访问类的静态成员
非静态的成员函数是可以访问类的静
- const修饰类的成员
const 只读
const int a = 10;
const int *p = &a; *p的值不能修改
int *const p=&a; p的值不能修改
2-1、const修饰类的数据成员
Const修饰数据成员:这个成员变量就不可修改!
3、mutable修饰符
mutable修饰符出现解决的问题: 当我们使用const修饰了类的成员函数,想去修改类的数据成员,就可以用mutable去修饰类的数据成员,可以实现成员值的修改!
- 友元
友元就是相当于朋友一样!
关键字:friend
解决的问题:
因为我们类的私有的数据成员在类的外部不能直接访问,需要在public区提供对应的接口函数;如果是偶尔要获取到类的数据成员的值,调用函数可行;如果是频繁的获取到对应的数据成员,就要频繁的调用函数;那调用函数需要进行出入栈,是需要开销的,这样子效率也比较低!
能否直接去访问呢?
- 类外的函数做友元
- 外部的类做友元
- 外部类的成员函数做友元