码迷,mamicode.com
首页 > 编程语言 > 详细

C++ Primer Plus的若干收获--(二)

时间:2014-07-17 16:02:03      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:des   style   color   使用   strong   os   

哎,真是不想吐槽考驾照的艰辛历程了。跑到大西郊,顶着大太阳,一天就能摸上个十几分钟二十分钟的车,简直不要太坑爹,这两天真是做的我屁股疼的不行。。。今天果断不去了。只可惜我的大阿根廷啊,坚持到最后功亏一篑惜败于德国,枉我四点自然醒起来看了接下来的比赛。不能不佩服诺伊尔,拉姆,博阿滕组成的后防线,让阿根廷整场没有几个有威胁的射门。祝贺我大克洛泽在职业生涯暮年能将大力神杯捧入怀中。。。拜拜   巴西世界杯,拜拜  阿根廷,拜拜,    梅西!


2.1  字符串常量

将字符数组初始化为字符串的工作看上去冗长乏味--使用大量的单引号,且必须记住加上空字符。不必担心,有一种更好的。将数组初始化为字符串的方法---只需要使用一个用引号括起来的字符串即可,这种字符串被称为字符串常量,如:

<span style="font-size:14px;">char dog[8]={'b','e','a','u','x',' ','i'};//not  a string
char cat[8]={'f','a','t','e','s','s','a','\0'};//a  string

char bird[11]="Mr.Cheeps";
char fish[]="Bubbles";

</span>

有时候字符串很长,无法放在一行。C++允许将两个引号括起来的字符串常量合并为一个。事实上,任何两个有空白(空格,制表符和换行符)分隔的字符串常量都将自动拼接成一个。因此,可有如下的语句:

<span style="font-size:14px;">cout<<"I'd give my right arm to be" "a great violinist.\n"
cout<<"I'd give my right arm to be a great violinist.\n";
cout<<"I'd give my right arm to" </span>
<span style="font-size:14px;">"be a great violinist.\n";</span>


2.2 字符串的读入  cin与getline的讨论

  • 首先来看cin是如何完成字符串的输入呢?由于不能通过键盘输入空字符,因此cin需要用别的方法来知道字符串的结尾位置。cin使用(空格、制表符和换行符)来确定字符串的结束位置,这意味着cin在读取字符串的时候只能读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾处添加空字符。
  • 显然每次读取一个单词通常不是好的选择,此时我们需要采用面向行而不是面向单词的方法。此时,istream类提供一些面向行的成员函数:getline()与get()。这两个函数都读取一行输入,知道到达换行符。但是二者的区别在于getline()将丢弃换行符,而get()将保留换行符在输入队列中。
  • 下面先介绍getline()函数,它读取正行并通过回车键出入换行符来确定输入队尾。要调用这种方法可采用cin.get()。该函数有两个参数,第一个参数用来存储行的数组名称,第二个参数是要读取的字符数。例如
  • cin.getline(name,20);
  • 接下来我们来看另一种方法。istream类有另一个名为get()的成员函数。该函数有几种变体。其中一种的工作方式与getline()类似,它们接受的参数相同,但是区别在于它不在丢弃换行符,而是将它保留在输入队列中
    <span style="font-size:14px;">cin.get(name,ArtSize);
    cin.get(dessert,ArtSize);//此时dessert只会读入一个换行符而显示为空</span>
  • 为了解决这个问题,get()函数提供了另一种变体,用它来解决换行符,为读取下一行做准备
    <span style="font-size:14px;">cin.get(name,ArtSize);
    cin.get();
    cin.get(dessert,ArtSize);//ok</span>
  • 最后一种使用该函数的方法时将其拼接起来。之所以可以这样做的原因是cin.get(...)会返回一个cin对象,该对象随后被用来调用cin函数。
    <span style="font-size:14px;">cin.get(name,ArtSize).get();
    cin.getline(name1,ArtSize).getline(name2,ArtSize);</span>
下面给出一个比较容易错的例子,给与一下小的提醒。

<span style="font-size:14px;">#include<iostream>
int main()
{  
	using namespace std;
	cout<<"What year was your house built?\n";
	int year;
	cin>>year;
	cout<<"What is its street address?\n";
	char address(80)
	cin.getline(address,80);//此时会读入回车
	cout<<"Year built:"<<year<<endl;
	cout<<"Done!\n";
	return 0;
}</span>


2.3 再谈getline

下面是一行输入到读取的代码:

<span style="font-size:14px;">cin.getline(charr,20);</span>
这种句点表示法表明,函数getline()是istream类的一个类方法。下面是另外一行代码:
<span style="font-size:14px;">getline(cin.str);</span>

这里没有使用句点表示法,这表明这种方法不是类方法。它将cin作为参数,支出到哪里去查找输入,其次他也没有指出字符串的长度参数。那么为何一个getline函数是istream的类方法,而另一个不是呢?在引入string类之前很久,c++就有istream类。因此istream类在这几的时候考虑到了其他基本类型而并没有考虑到string这种类型。所以在istream类中有处理double int和其他类型的类方法,而没有处理string的类方法。

2.4 枚举类型

C++的enum工具提供了另一种创建符号常量的方式,这种方式可以替代const。它还允许定义新类型,但必须按严格的限制进行。请看下面语句:

<span style="font-size:14px;">enum spectrum{red,orand,yellow,green,blue,violet,indigo};</span>
该语句完成了:让spectrum成为了一个新类型,它成为枚举类型;其次将red,orange,yellow等作为符号常量,它们对应整数值0~7.这些常量叫做枚举量,在默认情况下,将整数值给予枚举量,第一个枚举量的值为0,第二个为1,依次类推。枚举变量具有下面的性质。
<span style="font-size:14px;">spectrum band;
band=blue;//valid
band=2000;//invalid,2000 not an enumerator
//对于枚举,只定义了赋值运算符,具体地说没有为其定义算数运算:
band=orange;//valid
++band;//error
band=orange+red;//error
//枚举类型可被提升为整形,但是int类型不能自动转换为枚举类型
int color=blue;//valid,spectrum type promoted to int
band=3;//error
color=3+red;//red converted to int</span>

正如你看到那样,枚举的规则相当的严格。实际上,枚举更常常被用来定义相关的符号常量,而不是新类型。如果打算只使用常量。而不创建枚举类型的变量,则可以省略枚举类型的名称。如:

<span style="font-size:14px;">enum{red,orange,yellow...};</span>


2.5 在使用new与delete可能会遇到的相关问题

我们知道,当需要内存时,我们可以使用new来请求,当使用完内存时,我们使用delete运算符来将其归还给内存池。在使用new与delete时,我们应当遵循以下规则:

  • 不要使用delete来释放不是new分配的内存
  • 不要使用delete来释放同一块内存
  • 如果使用new【】为数组分配内存时。应使用delete【】来释放
  • 如果使用new为一个实体分配内存时,则应使用delete(没有括号)来释放
  • 对空指针应用delete是安全的

下面简要介绍一下内存泄露或内存被耗尽:计算机可能由于没有足够的内存而无法满足new请求。在这种情况下,new通常会引发异常,该异常会在以后讲解。在C++中,值为零的指针被称为空指针。C++确保空指针不会指向有效的数据,因此它常备用来表示运算符或函数失败。被泄露的内存将在程序的整个生命周期都不可使用;这些内存被分配出去但是无法使用。极端情况下是,内存泄露非常严重,以至于应用程序所用的内存被耗光,出现内存耗尽的错误,导致程序崩溃


2.6 自动存储、静态存储与动态存储

  • 自动存储     在函数内部第一的常规变量使用自动存储空间被称为自动变量,这意味着他们在所属的函数被调用时自动产生,在该函数结束时消亡。实际上自动变量是一个局部变量,其作用域包含他的代码块。代码块是包含在花括号内的一段代码。自动变量常存储在栈中。这意味着在执行代码块时,其中的变量将依次加入到栈中,而在离开代码块时,将按相反的顺序释放这些变量。
  • 静态存储      静态存储是整个程序执行区间都存在的存储方式。是变量成为静态变量的方式有两种:一种是在函数的外面定义了它,另一种则是使用关键字static
    <span style="font-size:14px;">static double fee=56.50;</span>

  • 动态存储      new与delete运算符提供了一种比自动变量和静态变量更灵活的方法。他们管理了一个内存池,这在C++中被称为自由存储空间或堆。该内存池通用于静态变量和自动变量的内存是分开的。因此数据的生命周期完全不受程序或函数生存时间控制。与常规变量相比,使用它们可以让程序员对程序如何使用内存有更大的控制权。

C++ Primer Plus的若干收获--(二),布布扣,bubuko.com

C++ Primer Plus的若干收获--(二)

标签:des   style   color   使用   strong   os   

原文地址:http://blog.csdn.net/yzu_120702117/article/details/37757441

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!