Coursera Cpp程序设计 week 1
这里开始总结下北大郭炜老师的C++课程,课程地址如下,在两个地方分别开课,但是内容基本一致,这里会按照coursera上的内容按周进行总结回顾,以下是第一周的内容。
课程地址:
coursera:C++程序设计
https://www.coursera.org/learn/cpp-chengxu-sheji
中国大学MOOC:程序设计与算法(三)C++面向对象程序设计
从C到C++
函数指针
定义形式 :
类型名 (* 指针变量名)(参数类型1, 参数类型2,…);
例如: int (*pf)(int ,char);
表示pf是一个函数指针,它所指向的函数,返回值类型应是int, 该函数应有两个参数,第一个是int 类型,第二个是char类型。
看一个具体例子
#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函数如下
int main(int argc, char * argv[])
{
……
}
argc: 代表启动程序时,命令行参数的个数。 C/C++语言规定,可 执行程序程序本身的文件名,也算一个命令行参数,因此, argc的值 至少是1。
argv: 指针数组,其中的每个元素都是一个char* 类型的指针,该 指针指向一个字符串,这个字符串里就存放着命令行参数。 例如, argv[0]指向的字符串就是第一个命令行参数,即可执行程序 的文件名, argv[1]指向第二个命令行参数, argv[2]指向第三个命令 行参数……。
如果用命令行运行程序,利用cmd切换到程序所在目录,然后使用如下方式运行程序即可。
程序名 参数1 参数2...
引用
下面的写法定义了一个引用,并将其初始化为引用某个变量。
类型名 & 引用名 = 某变量名;
int n = 4;
int & r = n; // r引用了 n, r的类型是 int &
某个变量的引用, 等价于这个变量,相当于该变量的一个别名。
- 定义引用时一定要将其初始化成引用某个变量。
- 初始化后,它就一直引用该变量,不会再引用别的变量了。
- 引用只能引用变量,不能引用常量和表达式。
定义引用时,前面加const关键字,即为“常引用” ,但是不能通过常引用去修改其引用的内容。
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。比如:
int * pn;
pn = new int;
* pn = 5;
第二种用法,分配一个数组:
P = new T[N];
T :任意类型名
P :类型为T * 的指针
N :要分配的数组元素的个数,可以是整型表达式
动态分配出一片大小为 sizeof(T)*N字节的内存空间,并 且将该内存空间的起始地址赋值给P。
int * pn;
int i = 5;
pn = new int[i * 20];
pn[0] = 20;
pn[100] = 30; //编译没问题。运行时导致数组越界
用delete运算符释放动态分配的内存
用“new”动态分配的内存空间,一定要用 “delete”运算符进行释放:
delete 指针; //该指针必须指向new出来的空间
int * p = new int;
* p = 5;
delete p;
delete p; //导致异常, 一片空间不能被delete多次
删除动态分配的数组方法如下:
delete [ ] 指针; //该指针必须指向new出来的数组
int * p = new int[20];
p[0] = 1;
delete [ ] p;
内联函数
内联函数是为了减少函数调用的开销,方法如下
inline int Max(int a,int b)
{
if( a > b) return a;
return b;
}
这一讲还介绍了面向对象程序设计,但是相对比较简单,这里就不总结了。