CPP笔记
开始细学CPP了,把之前本科毕设的捡起来,这次要学的更细。
CPP和C区别
面向对象特性,引用,STL,模板,C++11后的一系列东西。
引用
引用是变量的一个别名。
1 | int i; |
&读做引用,对r操作和对i操作结果相同。
引用替代指针能使C++程序更容易阅读和维护。
引用用作函数参数
1 | void swap(int& x, int& y) |
原理和指针差不多,本质都是根据传入的内存地址访存。
引用用作函数返回值
1 | double& setValues(int i) { |
返回的ref可以用在表达式左部。
用指针的话要写成这样
1 | double *setValues_PTR(int i) |
两者都是根据指针实现的
类
关键字class开头,后面跟类的名称
1 | class Box |
内部可以定义函数,内部的定义的函数是内联的,
类访问修饰符public、private、protected,默认privite。
public是公有,外部也能访问。
private是受保护成员,类的外部不可访问,只有类和友元函数可以访问。
protected类似受保护成员,但是在派生类可以访问。
继承时也可以加关键字。
- public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private
- protected 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:protected, protected, private
- private 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:private, private, private
构造+析构
构造:在创建类的时候执行,函数名称和类名完全相同,并且无返回值。
析构:类名的函数前面加了~,资源释放的时候执行,delete或者主函数返回后操作系统释放资源。
深浅拷贝
浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
默认拷贝是浅拷贝
1 | Stu stu1(70,80,90); |
这样进行的是浅拷贝,释放空间的时候会释放同一个区域两次,然后触发异常。
拷贝构造函数定义:
1 | Stu::Stu(const Stu &obj){ |
就不会报错。
友元函数
friend关键字
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
this指针
类中使用,指向自己的地址
C++类内存空间
子类父类同名
子类会隐藏父类中的变量,要访问的话要用作用域符号::
重载
命名重复情况
虚函数
函数重载
同一个函数明,函数参数不同可以调用不同的函数,不能仅通过返回值实现。
1 | class printData |
运算符重载
重载内置运算符
1 | Box operator+(const Box& b) |
多数运算符都可以重载,以下不可重载:
- .
- ->
- ::
- sizeof
- ?:
- #
多态
当类之间存在层次结构,并且类之间通过继承关联时就会用到多态.
调用成员函数时根据成员函数类型执行不同的函数
虚函数
A的B的父类,A中func()定义为虚函数,func(int)不定义为虚函数。
1 | class A |
定义A类型指针指向开辟的B类区域。func()函数在基类A中定义为虚函数,调用时执行B的函数,其余两种执行的A中的。
定义B类型的指向开辟的B类区域,执行就是B中的函数,调用A中同名需要增加域操作指定。
不使用虚函数的话s->func()
不会调用B中函数,因为会静态链接好,
纯虚函数
为了在派生类中重新定义该函数,基类中没什么意义的时候用到。
1 | virtual int area() = 0; |
告诉编译器函数没有主体。
有纯虚函数的类不难直接初始化,必须派生使用。
模板
函数模板一般类型
1 | template <typename type> ret-type func-name(parameter list) |
<>里面放指定类型,用type占位,调用的时候指定类型,可以实现类型的传递。
类模板类似。
1 | template <class type> class class-name { |
具体实例
1 | #include <iostream> |
STL
容器
用来管理某一类对象的集合。
vector
vector是将元素放到动态数组中加以管理的容器。vector容器可以随机存取元素,也就是说支持[]运算符和at方式存取。
vector在尾部添加或者移除元素非常快,在中间操作非常耗时,因为它需要移动元素。
基本用法
- front()返回头部元素的引用,可以当左值
- back()返回尾部元素的引用,可以当左值
- push_back()添加元素,只能尾部添加
- pop_back()移除元素,只能在尾部移除
1 | #include <iostream> |
list
queue
set
map
算法
作用于算法
迭代器
cmake
string类
- 本文作者: Zheng Yuchen
- 本文链接: https://zycccccc.top/2022/08/17/cpp/cpp笔记/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!