2013年11月13日星期三

Learning C++ Primer Plus chapter 5 - 7

本周的学习主要是5-7章
主要内容
第五章:循环与关系表达式
第六章:分支语句与逻辑运算符
第七章:函数-c++编程模块

这几章,主要还是一些编程的基础知识,五六章主要简单的看了,与C语言级其他编程语言的差别很小,重点是在看第七章,其中关于函数的部分有一些比较新的东西,还有一些以前的理解不够深刻的点,着重看了一下。




1.基于范围的for循环( P152)
在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 }
如果要修改上面数组中得值,只需要将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 }

注:本特性始于C++11,需要在编译时候加上编译参数--std=c++11


2.数组与指针的区别

1.两者在含义上的区别。 
数组对应着一块内存区域,而指针是指向一块内存区域。其地址和容量在生命期里不会改变,只有数组的内容可以改变;而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。 

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;
 23 }  




没有评论:

发表评论