本周的学习主要是5-7章
主要内容
第五章:循环与关系表达式
第六章:分支语句与逻辑运算符
第七章:函数-c++编程模块
这几章,主要还是一些编程的基础知识,五六章主要简单的看了,与C语言级其他编程语言的差别很小,重点是在看第七章,其中关于函数的部分有一些比较新的东西,还有一些以前的理解不够深刻的点,着重看了一下。
在C++11中,新增了一种循环,这种方式类似于perl中得数组foreach循环,python中也有类似的实现
这种方式简化了对于,数组,容器的循环任务,对其中的每个元素执行相同的操作,直到最后一个元素,退出循环。
例子:
1 #include<iostream>
2 using namespace std;
3 int main()
4 {
5 int arr[] = {1,2,3,4,5};
6 for (int x : arr)
7 cout << x*2 << endl;
8 return 0;
9 }
2 using namespace std;
3 int main()
4 {
5 int arr[] = {1,2,3,4,5};
6 for (int x : arr)
7 cout << x*2 << endl;
8 return 0;
9 }
如果要修改上面数组中得值,只需要将x换成&x作为引用即可
1 #include<iostream>
2 using namespace std;
3 int main()
4 {
5 int arr[] = {1,2,3,4,5};
6 for (int &x : arr)
7 x = x * x;
8 for (int x : arr)
9 cout << x << endl;
10 return 0;
11 }
2 using namespace std;
3 int main()
4 {
5 int arr[] = {1,2,3,4,5};
6 for (int &x : arr)
7 x = x * x;
8 for (int x : arr)
9 cout << x << endl;
10 return 0;
11 }
注:本特性始于C++11,需要在编译时候加上编译参数--std=c++11
2.数组与指针的区别
数组对应着一块内存区域,而指针是指向一块内存区域。其地址和容量在生命期里不会改变,只有数组的内容可以改变;而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
2.计算内存容量的区别。
用运算符sizeof可以计算出数组的容量(字节数),而用sizeof却无法计算指针所指内存的容量,用sizeof(p)得到的结果永远是4或者2(即指针变量所占内存单元的字节数,一般情况下指针变量占2个或4个字节的内存单元)。在进行参数传递时,数组会自动退化为同类型的指针。
在C++中,当(且仅当)用于函数头或函数原型中,int *arr和int arr[]才是相同的。
下面两个恒等式,无论arr是指针还是数组名,均成立:
arr[i]==*(arr+i);
&arr[i]==arr+i;
3.const指针,指向const的指针
这个是一个比较容易混淆的东西,在下面举例说明,不做过于详细的叙述了。
const指针:
int gorp = 16;
int chips = 12;
const int * p_snack = &gorp;
//p_snack的类型为const int * 也就是指向的地址内容是const,所以其指向地址得内容是不可修改的
*p_snack = 20; //不可以
p_snack = &chips; //可以
指向const的指针
int gorp = 16;
int chips = 12;
int * const p_snack = &gorp;
//p_snack的类型为int * const 也就是指向的地址是const,所以其指向地址是不可修改的
*p_snack = 20; //可以
p_snack = &chips; //不可以
4. 函数指针
函数指针是一个非常有用,并且有趣的内容,通过函数指针,我们可以创建公共的接口,然后用户通过传入自定义的函数,来实现其自定义的功能,非常适用于那些有共性,但是在不同情况下实现机制不同的程序。通过这一层的逻辑抽象,也可以将简化程序设计。
使用函数指针的方式:
定义一个正常的函数,然后用其原型抽象出函数指针,编写其他的被调程序
比如函数原型如下:
int sum(int );
声明指向函数的指针只需要将函数名置换为指针名就可以了,如上面的置换为
int (* p_sum)(int);
其中p_sum就是这类函数的指针
下面是一个函数指针的例子:
1 #include <iostream>
2 using namespace std;
3
4 int print_string(const char * str){
5 cout << str << endl;
6 return 0;
7 }
8 int print_string_2(const char * str){
9 cout << str << '\t' << str <<endl;
10 return 0;
11 }
12
13 int func(int (*f)(const char *), const char * st){
14 f(st);
15 return 0;
16 }
17
18 int main(int argc, const char * argv[])
19 {
20 func(print_string,"first one!!!");
21 func(print_string_2,"second !!!");
22 return 0;
2 using namespace std;
3
4 int print_string(const char * str){
5 cout << str << endl;
6 return 0;
7 }
8 int print_string_2(const char * str){
9 cout << str << '\t' << str <<endl;
10 return 0;
11 }
12
13 int func(int (*f)(const char *), const char * st){
14 f(st);
15 return 0;
16 }
17
18 int main(int argc, const char * argv[])
19 {
20 func(print_string,"first one!!!");
21 func(print_string_2,"second !!!");
22 return 0;
23 }
没有评论:
发表评论