Coursera Cpp程序设计 week 1

这里开始总结下北大郭炜老师的C++课程,课程地址如下,在两个地方分别开课,但是内容基本一致,这里会按照coursera上的内容按周进行总结回顾,以下是第一周的内容。

课程地址:

coursera:C++程序设计

https://www.coursera.org/learn/cpp-chengxu-sheji

中国大学MOOC:程序设计与算法(三)C++面向对象程序设计

程序设计与算法(三)C++面向对象程序设计

从C到C++

函数指针

定义形式 :

​ 类型名 (* 指针变量名)(参数类型1, 参数类型2,…);

​ 例如: int (*pf)(int ,char);

表示pf是一个函数指针,它所指向的函数,返回值类型应是int, 该函数应有两个参数,第一个是int 类型,第二个是char类型。

看一个具体例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
void PrintMin(int a,int b) {
if( a<b )
printf("%d",a);
else
printf("%d",b);
}

int main() {
void (* pf)(int ,int);
int x = 4, y = 5;
pf = PrintMin;
pf(x,y);
return 0;
}

命令行参数运行程序

标准的main函数如下

1
2
3
4
int main(int argc, char * argv[])
{
……
}

argc: 代表启动程序时,命令行参数的个数。 C/C++语言规定,可 执行程序程序本身的文件名,也算一个命令行参数,因此, argc的值 至少是1。

argv: 指针数组,其中的每个元素都是一个char* 类型的指针,该 指针指向一个字符串,这个字符串里就存放着命令行参数。 例如, argv[0]指向的字符串就是第一个命令行参数,即可执行程序 的文件名, argv[1]指向第二个命令行参数, argv[2]指向第三个命令 行参数……。

如果用命令行运行程序,利用cmd切换到程序所在目录,然后使用如下方式运行程序即可。

1
程序名 参数1 参数2...

引用

下面的写法定义了一个引用,并将其初始化为引用某个变量。

类型名 & 引用名 = 某变量名;

1
2
int n = 4;
int & r = n; // r引用了 n, r的类型是 int &

某个变量的引用, 等价于这个变量,相当于该变量的一个别名。

  • 定义引用时一定要将其初始化成引用某个变量。
  • 初始化后,它就一直引用该变量,不会再引用别的变量了。
  • 引用只能引用变量,不能引用常量和表达式。

定义引用时,前面加const关键字,即为“常引用” ,但是不能通过常引用去修改其引用的内容。

1
2
int n;
const int & r = n;

有一点要非常注意,就是const T & 和T & 是不同的类型!!!

T & 类型的引用或T类型的变量可以用来初始化 const T & 类型的引用。

const T 类型的常变量和const T & 类型的引用则 不能用来初始化T &类型的引用,除非进行强制类型转换。

动态分配内存

用new 运算符实现动态内存分配

第一种用法,分配一个变量:

P = new T;

T是任意类型名, P是类型为T * 的指针。 动态分配出一片大小为 sizeof(T)字节的内存空间,并且将该 内存空间的起始地址赋值给P。比如:

1
2
3
int * pn;
pn = new int;
* pn = 5;

第二种用法,分配一个数组:

P = new T[N];

T :任意类型名

P :类型为T * 的指针

N :要分配的数组元素的个数,可以是整型表达式

动态分配出一片大小为 sizeof(T)*N字节的内存空间,并 且将该内存空间的起始地址赋值给P。

1
2
3
4
5
int * pn;
int i = 5;
pn = new int[i * 20];
pn[0] = 20;
pn[100] = 30; //编译没问题。运行时导致数组越界
用delete运算符释放动态分配的内存

用“new”动态分配的内存空间,一定要用 “delete”运算符进行释放:

delete 指针; //该指针必须指向new出来的空间

1
2
3
4
int * p = new int;
* p = 5;
delete p;
delete p; //导致异常, 一片空间不能被delete多次

删除动态分配的数组方法如下:

delete [ ] 指针; //该指针必须指向new出来的数组

1
2
3
int * p = new int[20];
p[0] = 1;
delete [ ] p;

内联函数

内联函数是为了减少函数调用的开销,方法如下

1
2
3
4
5
inline int Max(int a,int b)
{
if( a > b) return a;
return b;
}

这一讲还介绍了面向对象程序设计,但是相对比较简单,这里就不总结了。