【写在前面】
基础语言的复习需要在短时间内迅速完成,对C++语言有了解的人可以简单复习,本篇基础篇会慢慢更新。先更新我认为一些比较重要的规则和一些容易错误的知识点。C++语言颗粒密度很细,想要一次性全部记忆很难,我们先对基础的语言有个了解,后续可以根据这个提纲再看C++ Primer!
- 一类
- 1 类的定义
- 2 类和strcut的区别
- 3 构造函数和析构函数
- 4 拷贝函数:深拷贝和浅拷贝
- 5 静态成员和静态成员函数
- 6 this指针
- 7 友元函数
- 8 继承的各种方式
C++语言的特性是面向对象编程,学习好C++后续转java也会比较简单~C++主要的特点有封装 继承 多态 。这种特性让整个语言变得非常灵活,也会大大减少重复编程的工作量。
1 类的定义1.1 类的定义
c++认为万事万物均有其对象,任何对象均有其属性。人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌… 车也可以作为对象,属性有轮胎、方向盘、车灯…,行为有载人、放音乐、放空调…
具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类
1.2 类的使用
class 类名{
public:
privata:
定义成员函数
};
1.3 类的封装,例子如下:
1.4 封装属性权限
2 类和strcut的区别可以将类和属性放在不同的权限下:
public:类内可以访问,类外可以访问;
privat:类内可以访问,类外不可以访问;
Procted: 类内可以访问,类外不可以访问;
类中默认是私有成员!
3 构造函数和析构函数Struct 和class的区别:
struct的默认权限时公开,而class的默认权限时私有
成员属性设置:在c++面向对象编程的过程中,我们可以把成员变量的属性设置为私有,这样类外不可以访问,类内访问,可以有效保证数据的安全性;可以控制数据的读写效果
c++利用构造函数进行对象的初始化,利用析构函数清理对象中的数据
构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数
> tips:建议使用构造函数时,直接使用初始化列表值得方式,而不是先初始化再赋值。主要原因是:1 一些数据成员必须初始化(比如引用或者常量); 2 初始化效率会比先初始化再赋值要更高。
错误得方式:
正确得方式:
构造函数语法:
类名::类名(){ }
1 构造函数名要与类名一致;
2构造函数没有返回值也不写void ;
3 构造函数有参数,可以发送重载;
4 构造函数无需手动调用,编译器会调用,并且只调用一次
析构函数语法: ~类名(){}
1析构函数,没有返回值也不写void;
2函数名称与类名相同,在名称前加上符号 ~ ;
3析构函数不可以有参数,因此不可以发生重载;
4程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次
>
4 拷贝函数:深拷贝和浅拷贝构造函数根据参数可以分为有参构造和无参构造;根据类型可以分为普通构造和拷贝构造
构造函数在初始化的时候是按照类中定义的变量顺序去初始化的,和构造函数中初始化的顺序无关,所以如果说使用不同的值去初始化变量的时候要考虑顺序问题。看看下面的例子有什么错误并修改奥~~~
初始化的时候应该先初始化rem,此时base还没有初始化,会造成错误
> 1 什么是拷贝构造函数
前面我们知道构造函数的作用是为了初始化类的成员变量,在创建对象的时候会自动调用构造函数。构造函数可以分为拷贝构造和默认构造。
在理解之前,我们先了解赋值和初始化的区别,赋值时先初始化对象再赋值,这个过程叫做赋值。而初始化是定义的时候直接赋值。我们的拷贝构造函数可以理解为初始化的过程,就是有自己定义的显示的初始化参数。
> 2 浅拷贝
浅拷贝,打个比方来说,你的浅拷贝对象就是你的影子,你的一举一动都会影响你影子的一举一动,你挂了你的影子也没有了。
官方来解释:浅拷贝只是拷贝指向对象的指针,并没有开辟一个新的内存空间。所以深浅拷贝的区别主要是在存在指针 数组 等。
> 3 深拷贝
深拷贝相当于你是个人,给你做了一个克隆人,你和克隆人分别属于独立的个体,不会互相影响。
官方解释来说:深拷贝开辟了新的内存空间,使得新的对象的指针和指针指向的内容都拷贝了一遍,不会出现析构函数 一个指针 多次释放的错误
> 4 深浅拷贝的使用场景
使用场景:主要是存在指针 数组 的时候需要自己重写拷贝构造函数,防止出现析构导致内存泄漏崩溃的问题
1 什么是静态成员和静态成员函数
静态成员就是在成员变量或者成员函数前加上static
静态成员分为:静态成员变量和静态成员函数
2 静态成员和静态成员函数的作用
6 this指针静态成员: 所有对象共享同一份内存,在类内声明,类外初始化,编译阶段分配内存。
>(!!!共享统一内存这个很重要)
静态成员函数:所有对象共享一个函数,静态成员函数只能访问静态成员变量
通过上面的特性,我们了解到静态成员变量共享内存,静态成员函数只能够访问静态成员变量。那么=在c++中,成员变量和成员函数是分开存储的,而只有非静态的成员变量会占据对象的空间。
静态成员变量不占据对象空间,所有函数共享一个实例!这个特性在我们学习只能智能指针和STL 的时候经常有用到!!C++真的很灵活,而且非常有语言的魅力~
3 访问机制
静态成员变量 不占用对象内存 共享一个内存 实例共享
静态成员函数只能够访问静态成员变量,静态成员函数也是所有对象共享一份实例!
1 this指针
c++的静态成员函数不占用对象空间,所有对象共享一份实例;那是如何区别呢?
实际上,就是根据this指针;所有的非静态成员函数都有this指针;
this指针指向被调用对象的成员函数,this指针不需要定义是,直接使用就可以
2 this指针的作用
3 关于const修饰:
7 友元函数1 常函数常对象语法:
常函数:返回值类型 函数对象名(参数) const-----常函数
常函数在没有加mutable时:成员函数内不可以修改成员变量属性,但是可以读取成员变量
在常函数中,本身this指针的指向是不可更改,常函数中,this指针所指向的对象的数值也是不可更改的
2 常对象:const 对象名—常对象
常对象只能访问常函数
1 友元的目的
前面的学习我们知道类的私有成员除了类内可以访问,类外的对象是不能够访问的。假如我们希望访问私有成员或者私有成员函数的话,我们要将访问那个人当成我们的朋友,这样就可以访问了。
友元的目的是让一个类或者一个函数访问类的私有成员。
2 友元的实现方式
1 全局函数做友元
2 类作为友元
3 其他类中的成员函数作为友元
继承:继承是为了减少代码量,子类会继承基类的所有成员函数和成员变量,公有继承会保持原有属性不变
1 继承的方式
继承的方式有公有继承,私有继承,保护继承
公共继承:
public:继承—继承所有的成员变量和函数
对 public成员:可以访问,类内类外均可访问
对 protected成员:可以访问,类内可访问,类外不允许访问
对 private成员:不可访问
procted继承:
1 会将公有属性的对象变为protected权限—类内访问,类外不可访问
2 protected权限仍为protected权限—类内访问
3 private权限对象和函数均不可访问
private继承:
1 所有成员变量均是私有属性,故而均不可以访问,类内类外都不可以访问
关于继承中同名成员处理方式:(非静态成员和静态成员访问的方式是一样的)
1 访问子类成员:直接访问即可
2 访问父类成员:需要添加作用域访问
2 继承之后关于构造函数和析构函数的调用
1 继承中构造函数和析构函数调用顺序:调用父类构造函数;调用其他成员的构造函数;
调用子类构造函数;析构调用顺序相反。(相反的有底层原因大家可以想想:就是咱们函数都是在栈中进行,那栈是先进后出的,故而析构函数调用顺序是相反的,这就是为什么说咱们得学习底层 学习数据结构的问题。)
2 子类默认调用父类的默认构造函数。因此父类须提供默认构造函数,否则子类须利用初始化列表方法显式调用父类的其他构造函数
3 父类中的构造函数(默认、有参、拷贝)、析构及赋值运算符函数不会被子类继承



