C++授课记录(一)

导语

本次授课内容如下:引用、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简单应用

  1. 栈stack<>
  2. 队列queue<>
  3. 哈希unordered_map<>
  4. 链表list<>
  5. 动态数组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

例子:

Wiki with Adjacent Letters

for(int i=0;i<strlen(str);i++)
	str[i]='a';

参考文献

  1. 《C++入门经典》
  2. c++ 左值引用与右值引用
  3. c++——左值、右值、左值引用、右值引用
  4. C++ static、const 和 static const 类型成员变量声明以及初始化
  5. C++11右值引用(一看即懂)
  6. c++深拷贝和浅拷贝
  7. C++深拷贝和浅拷贝(深复制和浅复制)完全攻略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值