C++ Primer Plus读书笔记04

2012-02-25

1、char ch;   cin>>ch;        //一次一个字符,忽略空格

       cin.get(ch);          //不忽略

2、 ctrl+z模拟EOF,读到文件为,则cin.eof()==cin.fail()==true

int count=0;    char ch;

cin.get(ch);

while(cin.fail()==false){       cout<<ch;      count++;              cin.get(ch);}//可一行一行读入,输入ctrl+z结束

3 cin.get(ch)返回cin对象,但istream类中提供了可将istream对象转换为bool值的函数,

       当cin出现在if,while语句中时,该函数被调用,如果最后一次读取成功,值为true;

       ∴while(cin.get(ch))(cout<<ch;         ++count;)      //与上一句效果一样

4 逻辑运算符<关系运算符,所以if(a>30 && a<80)

  关系运算符<算术运算符,所以if(x+4 > y-1)

5、#include<cctype>包含常见字符函数,如isalpha()是字母,ispunct()是标点…

6 条件运算符,c++中唯一一个需要3个操作数的操作符

       if a>b c=a  else c=b          可以替换为c=a>b?a:b;

7      int m; cin>>m;若读入不合法数据(如string),程序将拒绝继续读取输入

修正办法:S1 重置cin以接受新的输入 S2删除错误输入 S3重新输入

eg

 

while(!(cin>>m))           //cin>>m,不合法时返回false

{

        cin.clear();     //重置cin

           while(cin.get()!=’\n’)    continue;       //删除这一行的错误输入

}

 

2012-02-29

1、对数组名用sizeof得到数组长度 int a[10];       sizeof(a)==40

        int sum(int arr[])   //sizeof(arr)==4 函数参数里的数组实质上是指针

2、当且仅当用于函数头或函数原型是,int *arr与int arr[]的含义才相同

arr[i]==*(arr+i);

3、int fun(const int a[])      //可实现保护数组内容,拒绝修改的功能

4、const使用

 

int a=5;

int *p=&a

常规变量地址赋给常规指针

const int *q=&a;

常规变量地址赋给const指针

const int a=5;

const int *q=&a;

const变量地址赋给const指针

只此三种

int a=5;

const int *p=&a;    p指向const int, ∴*p的值为const,对p而言,a是常量,所以*p不可修改,即*p=10错,cin>>*p错

但a实际上是变量,例如a=20(间接修改*p的值)

或者可将新地址赋予p,例如int b=20;   p=&b; 正确,但*p=b依然不对

 

int * const p=&a

则P只能指向a,但允许用P修改a的值

例如,*p=20正确(则a的值变为20),但p=&b错

1、 int findTimes(const char*str,char ch) //查找ch在str中出现了几次

{

int count=0;

while(*str)

{      if(*str==ch)           count++;

       str++;

}

return count

}

6、函数指针  double (*pf) (int)

       声明了一个函数指针,对应函数参数为int,返回值为double

       eg.double func(int) ;   pf=func();     //则以后可以用pf来取代func

       func(5)==pf(5)==(*pf)(5);

7      普通函数:保存地址→跳转到函数部分执行→返回原地址继续执行

内联:将函数相应代码展开,不需跳转,占更多内存;内联函数不能递归

8 C语言通过#define来提供宏 如#define S(X) x*x      尽可能用内联替代宏

9、引用:必须在声明时初始化 int & a; a=b //错误

       若int fun(int a),则fun(x+1),fun(5),fun(a[3])等调用均合法

       若int fun(int &a),则fun(x+1)会出错

∴用const修饰带引用的参数,如int fun(const int &a),当实参不匹配时(如fun(x+1)),C++在必要时生成临时变量,相当于按值传

10、在结构中使用引用       如struct student{…}

       const student & use (student & input)

{ return input }//返回结构的引用,比返回结构效率更高

eg:Student test=use(input)

返回引用:input的内容直接赋给test

返回结构:input被复制到一个临时存储单元中,然后将该单元内容复制给test

错误示例 const string & func(string input)

{ string temp=input;            return temp;}//返回一个引用,此语句指向一个函数内声明的变量,在遇到}时temp不再存在

∴在main中调用str=func(input)时崩溃,程序试图医用已经释放的内存

原文地址:https://www.cnblogs.com/yangtianxing/p/2435011.html