导语
本次授课内容如下:引用、static&const、深浅拷贝、STL简单应用、校内天梯赛选拔选讲、时间复杂度
辅助教材为《面向对象程序设计》
引用
在介绍引用之前,我们需要理解两个相关概念:左值与右值
通俗来讲,左值可取地址,有名,非临时,右值不可取地址,无名,临时
左值引用
左值引用可以以指针的用法来理解,在汇编层面,左值与指针的用法是一样的,这个就不用多介绍了,课堂上也应该进行过讲解
右值引用
右值引用在现阶段的学习中其实并不常用,在学习引用的过程中是一个较为繁琐且复杂的概念
我们都知道,对于一个左值引用,除非它为常值引用,否则是不允许赋值给它一个常数的,例如int& a=10是不可行的,但是右值引用便解决了这个问题,它支持下列的操作。右值引用只能赋予它右值,是不能赋值为左值的(如变量)
例
int && a = 10;
a = 100;
cout << a << endl;//100
更多的知识请参考文章后的资料,因为知识涉及较多,这里不展开讲述
static&const
const 定义的常量在超出其作用域之后其空间会被释放,而 static 定义的静态常量在函数执行后不会释放其存储空间。
static
static 表示的是静态的量,其概念类似不可改变的全局变量,类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中,也就是说所有类的对象公用一个static变量
对于一个static变量,是不能在类里初始化的,只能在类外初始化
例
class A{
public:
A();
private:
static int i;
};
A::i=20;
const
const大家应该很熟悉了,它和static较容易混淆,const的数据只在某个对象生存期内是常量,而对于整个类而言是可变的。因为类可以创建多个对象,不同的对象其 const 数据成员的值可以不同。所以不能在类的声明中初始化 const 数据成员,因为类的对象没被创建时,编译器不知道 const 数据成员的值是什么
const 数据成员的初始化只能在类的构造函数的初始化列表中进行,正好对于了不同的类对象都有自己的const量,但一旦赋值就不可更改
深浅拷贝
由于C++的内存管理机制,拷贝便成了一个很重要的问题,C++的内存管理继承了C,并没有Java那样健全的自动分配与回收机制,所以当我们进行赋值操作时需要考虑清楚,我们是否真正的完成了“复制”这一操作
首先,我们需要弄清楚,基本的复制操作是如何实现的,一个基本的复制代码如下
例
int a=1;
int b=a;
cout <<a<<" "<<b;
我们可以很简单的就知道a与b相等,在底层实现里,b的内存空间被a的二进制代码所覆盖,即b与a对应的内存的二进制代码相同
那么,如果a与b都是指针,会发生什么事情?请思考一下
如果对象中没有其他的资源(如:堆,文件,系统资源等),则深拷贝和浅拷贝是没有区别的
复制操作本质是内存间二进制代码的覆盖
STL简单应用
- 栈stack<>
- 队列queue<>
- 哈希unordered_map<>
- 链表list<>
- 动态数组vector<>
校内天梯赛选拔选讲
时间复杂度
竞赛中一般认为计算机速度为5*108次/s,若题目时间限制1s,则计算次数最多到108才可能完成题目。
-
O( n n n) 的算法能解决的数据范围在 n n n≤108
-
O( n l o g n nlogn nlogn) 的算法能解决的数据范围在 n n n≤106
-
O( n n n\sqrt n nn) 的算法能解决的数据范围在 n n n≤105
-
O ( n n n2) 的算法能解决的数据范围在 n n n ≤ 5000
-
O ( n n n3) 的算法能解决的数据范围在 n n n≤300
-
O(2n) 的算法能解决的数据范围在 n n n≤ 25
-
O( n ! n! n!) 的算法能解决的数据范围在 n n n≤11
例子:
for(int i=0;i<strlen(str);i++)
str[i]='a';