C++程序设计 - Week 1 从C走进C++

来源:互联网 发布:网络推广人员提成方案 编辑:程序博客网 时间:2024/05/22 03:32

郭炜 blog 刘家瑛

《新标准C++程序设计教程》,郭炜,清华大学出版社,2012

http://www.cplusplus.com/

edX PekingX: 04831750.1x C++ 程序设计

Coursera C++程序设计

Coursera 程序设计与算法 Fundamentals of Programming and Algorithms

函数指针

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

int (*pf)(int, char);void qsort(void *base, int nelem, unsigned int width,         int (*pfCompare)(const void*, const void*));typedef int (*PTRFUN)(int, char);   PTRFUN pf; int result = (*pf)(n, str);typedef int (*FP_CALC)(int, int);FP_CALC calc_func(char op);//s_calc_func为函数,它的参数是 op,     //返回值为一个拥有两个int参数、返回类型为int的函数指针    int (*s_calc_func(char op)) (int , int);FP_CALC fp = calc_func(op);

对数组排序,需要知道:数组起始地址,数组元素的个数,每个元素的大小,元素谁在前谁在后的规则。

typedef函数指针用法

Question

《C陷阱和缺陷》地址0?

命令行参数

int main(int argc, char *argv[])

位运算

& | ^ ~ << >>

按位与:通常用来将某变量中的某些位清零且同时保留其他位不变,也可以用来获取某变量中的某一位。

按位或:通常用来将变量中的某些位置1且保留其他位不变。

按位异或:通常用来将某变量中的某些位取反且保留其他位不变。

a ^ b = c --> c ^ b = a, c ^ a = b

不通过临时变量,交换两个变量的值。(穷举法)

a = a ^ b;b = b ^ a;a = a ^ b;

按位非

左移运算符:左移n位,等于乘以2^n。

右移运算符:大多数C/C++编译器规定,如果原符号位为1,则右移时高位就补充1。

-25 >> 4 = -2-2 >> 4 = -118 >> 4 = 1(a >> n) & 1 // 0 <= n <=31(a & 1 << n)) >> n // 0 <= n < 31, 符号位的风险

原码, 反码, 补码 详解
Bit Twiddling Hacks 二进制运算的神奇应用
Google Code上面的一个基于浮点数标准的快速算法库,里面也用到了各种二进制运算

引用

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

某个变量的引用,等价于这个变量,相当于该变量的一个别名。定义引用时一定要将其初始化成引用某个变量。初始化后,它就一直引用该变量,不会再引用别的变量了。

引用只能引用变量,不能引用常量和表达式。

void swap(int *a, int *b); // Cswap(&n1, &n2);void swap(int &a, int &b); // C++swap(n1, n2);

引用作为函数的返回值(cin,运算符重载)

int n = 4;int &SetValue() { return n; }SetValue() = 40;cout << n;

常引用:不能通过常引用去修改其引用的内容。

const int &r = n;

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

const

1) 定义常量,便于类型检查

const int MAX_VAL = 23;

2) 定义常量指针,不可通过常量指针修改其指向的内容,但指向可以变化

const int *p = &n;

定义常量指针,不能把常量指针赋值给非常量指针,反过来可以

const int *p1;int *p2;p1 = p2; // okp2 = p1; // errorp2 = (int*) p1; // ok,强制类型转换

函数参数为常量指针时,可避免函数内部不小心改变参数指针所指地方的内容。

void MyPrint(const char *p);strcpy(p, "this"); // 编译出错,strcpy第一个参数char*,类型不匹配,故编译出错

3) 定义常引用,不能通过常引用修改其引用的变量。

非const变量默认为extern。要使const变量能够在其他的文件中访问,必须显式地指定它为extern。在全局作用域声明的const变量是定义该对象的文件的局部变量,此变量只存在于那个文件中,不能被其他文件访问。

int counter;extern int counter;extern const int bufsize = 10;extern const int bufsize;

C/C++中const关键字详解 应该还可以吧,内容有点多,还没看完
关于C++ const 的全面总结 貌似有错误,看评论

Question

const成员函数?

动态内存分配

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

分配一个变量

T *P = new T;p = new int;

分配一个数组

P = new T[N];

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

delete 指针;delete []p;

C++二维数组new小结(zz)

vector

vector<vector<int>> a(row,vector<int>(column));

内联函数、函数重载、函数缺省参数

内联函数

函数调用是有时间开销的。如果函数本身只有几条语句,执行非常快,而且函数被反复执行很多次,相比之下,调用函数所产生的这个开销就会显得比较大。

为了减少函数调用的开销,引入了内联函数机制。编译器处理对内联函数的调用语句时,是将整个函数的代码插入到调用语句处,而不会产生调用函数的语句。

inline int Max(int a, int b) {    if (a > b) return a;    return b;}k = Max(n1, n2);if (n1 > n2)    tmp = n1;else    tmp = n2;k = tmp;

可执行程序的体积会增大。

函数重载

一个或多个函数,名字相同,然而参数个数或参数类型不相同,这叫做函数的重载。

函数重载使得函数命名变得简单。

编译器根据调用语句中的实参的个数和类型判断应该调用哪个函数。

函数缺省参数

C++中,定义函数的时候可以让最右边的连续若干个参数有缺省值,那么调用函数的时候,若相应位置不写参数,参数就是缺省值。

函数参数可缺省的目的在于提高程序的可扩充性。

如果某个写好的函数要添加新的参数,而原先那些调用该函数的语句,未必需要使用新增的参数,那么为了避免对原先那些函数调用语句的修改,就可以使用缺省参数。

比如画圆,之后加入颜色支持。

void func(int x1, int x2 = 2, int x3 = 3) { }
0 0
原创粉丝点击