有时候怀疑真是怀疑自己走的路究竟是不是正确的。作为一个土生土长数学系学生,却对数学毫无兴趣,没事的时候就喜欢躲在图书馆看看有关计算机的书。有时候期末考试时候会挂个一两门的数学专业课,有时候真希望数学课本上这一个个繁琐的证明是用代码写的。自己差点儿丢掉了本专业的一切。去全身心投入到计算机这一庞大而繁琐的学问中去。

真心不知道2年之后自己毕业,自己的结果究竟是什么样的。自己如今唯一能做而又不让自己懊悔的我想就是尽可能的多学两门语言与多看几本计算机上的名著了。有时候真的不确定自己会坚持到什么地步,是一直的走下去,还是。

。。哎,先不纠结了,默默的坚持下去吧,坚持自己喜欢的东西。假设自己一直在数学的道路走下去的话。可能会生不如死。。

3.1 数组的替代品  模板类array

vector类的功能比数组强大,可是付出的代价是效率稍低。假设您须要长度固定的数组,使用数组是最佳的选择。但代价是不那么方便和安全。

有鉴于此。C++新增了模板类array。

与数组一样array对象的长度也是固定的。也使用栈。而不是自由存储区,因此效率与数组同样

#include<array>
...
using namespace std;
array<int,5>ai;
array<double,4>ad={1.2,2.1,3.43.4.3};
//推而广之
array<typename,n_element>array;

3.2 比較数组、vector对象和array对象

以下来看一个简单的演示样例

#include<iostream>
#include<vector>
#include<array>
int main()
{
using namespace std;
double a1[4]={1.2,2.4,3.6,4.8}; vector<double>a2(4);
a[0]=1/3;
a[1]=2/3;
a[3]=3/4'
a[4]=4/5; array<double,4>a3={3.14,2.72,1.62,1.41};
array<double,4>a4;
a4=a3;//能够直接复制,差别于数组 cout<<"a1[2]:"<<a1[2]<<"at"<<&a1[2]<<endl;
cout<<"a2[2]:"<<a2[2]<<"at"<<&a2[2]<<endl;
cout<<"a3[2]:"<<a3[2]<<"at"<<&a3[2]<<endl;
cout<<"a4[2]:"<<a4[2]<<"at"<<&a4[2]<<endl;
return 0;
}

首先。注意到不管是数组还是vector对象和array对象,都能够使用标准数组表示法来訪问各个元素。其次从地址可知,array对象和数组存储在同样的内存区域(栈)中,而vector则存储在还有一个区域中。自由存储区或堆中。第三,注意到能够将array对象赋给还有一个array对象;而对于数组,必须逐个复制元素。

3.3 副作用和顺序点

首先副作用指的是计算表达式时对某些东西进行了改动。顺序点是程序运行的一个点。在这里。进去下一步之前将确保对全部的副作用进行评估。在C++中,语句中的分号就是一个顺序点,这意味着程序在处理下一个语句之前,赋值运算符、递增运算符和递减运算符运行的全部改动都必须完毕。另外不论什么完整的表达式末尾都是一个顺序点。

什么是一个完整的表达式呢?他是这种:不是还有一个更大表达式的子表达式。以下来通过两个样例来加深一下理解

while(guests++<10)
cout<<guests<<endl;
//在这里表达式guests++<10是一个完整的表达式,由于它是while循环的測试条件,因此该表达式末尾是一个顺序点 y=(4+x++)+(6+x++);
//表达式4+x++不是一个完整的表达式,因此不能保证计算子表达式4+x++后立马添加。在这里整条赋值语句才是一个完整的表达式。并且分号表示了顺序点,所以在这里仅仅保证在运行下一条语句之前才会将X添加两次。

3.4 递增/递减和指针

当我们同一时候将*与++同一时候用于指针时将有这种疑问:将什么解引用,将什么递增。

这取决与优先级和运算符的位置。前缀递增、前缀递减和解除引用运算符的优先级同样。后缀递增与后缀递减的优先级同样,但比前缀运算符的优先级高,这两个运算符从左到右的方式进行结合。

  • 前缀运算符从右向左结合规则意味着*++p的含义例如以下:先将++应用于pt,然后将*用于被递增后的pt。

    还有一方面,++*p意味着先去得pt指向的值。然后将这个值加一。

  • 接下来请看以下的组合(*pt)++。圆括号指出首先对指针解除引用。然后再将这个值递增。

  • 最后再看下这个组合。x=*pt++;后缀运算符++的优先级更高,这意味着将运算符用于pt,而不是*pt。

3.5 复合语句(语句块)

语句块就是用一对花括号括起来的一条复合语句。他被视作一条语句。从而满足句法的要求。比方for循环:

for(int i=1;i<=5;i++)
{
cout<<"Value"<<i<<":";
cin>>number;
sum+=number;
}

复合语句另一条有趣的性质。假设在语句块中定义一个新的变量,则仅当程序运行该语句块时,该变量才存在。运行完语句块后该变量将被释放。假设在一个语句块中声明一个变量,而在外部语句中也有一个这种变量,情况将怎样呢?在声明位置到内部语句结束的范围内,新变量将隐藏旧变量;然后旧变量再次可见。例如以下例所看到的:

#include<iostream>
int main()
{
using namespace std;
int x=20;
{
cout<<x<<endl;
int x=100;
cout<<x<<endl;//use new x
}
cout<<x;// use original x
return 0;
}

3.6 C-风格字符串与string类字符串的比較

首先讨论下C-风格字符串。

因为C++将C-风格字符串视为地址。因此假设以关系运算符来比較它们将无法得到惬意的结果。相反,应使用C-风格字符串库中的strcmp()函数。该函数接受两个字符串地址作为參数,这意味着參数能够是指针、字符串或是数组名。

以下着重介绍一下string类字符串的比較。

它的比較比較简单。由于类设计可以让您使用关系运算符进行比較。这之所以可行是由于类函数重载了这些运算符。来看例如以下样例:

#include<iostream>
#include<string>
int main()
{
using namespace std;
string word="?ate";
for(char ch='a';word!="mate";ch++)
{
cout<<word<<endl;
word[0]=ch;//用数组的方法来提取当中的字符
}
cout<<"After loop ends,words is"<<wrd<<endl;
return 0;
}
  • string类重载运算符!=的方式能够让您在下述条件下使用它:至少有一个操作数为string类对象,还有一个操作数能够是string类,也能够是C-风格字符串。
  • string类的设计能够将其作为一个实体,也能够将其作为一个聚合对象。从而用数组的方法来提取当中的字符。

3.7 等待一段时间 :完毕延时的循环

有时候延时一段时间非常实用。比方,读者可能遇到这种程序。它在屏幕上显示一条消息,而还没来得及阅读,又出现了其它的内容。C++库中有一个函数有助于完毕这种操作。这个函数名为clock。返回程序開始运行后所用的系统时间。这有两个复杂的问题:clock()返回的不一定是秒;其次该函数的返回类型可能不确定。

为解决这种问题,在头文件ctime提供了这种解决方式。首先它定义了一个符号常量--CLOCK PER SEC。该常量等于每秒钟包括系统时间的单位数。因此将系统时间除以这个数能够得到秒数。

或者将这个数乘上CLOCK PER SEC。能够得到以系统时间为单位的单位时间。其次。ctime将clock_t作为clock()返回类型的别名。例如以下程序演示了怎样使用clock()函数和ctime头文件来创建延时循环:

#include <iostream>
#include <ctime> using namespace std; int main()
{
cout<<"Enter the delay time,in seconds:";
float seconds;
cin>>seconds;
clock_t delay=seconds*<strong>CLOCKS_PER_SEC</strong>;
cout<<"starting\a\n";
clock_t start=clock();
while(clock()-start<delay)
;
cout<<"Done\a\n";
return 0;
}

3.8 类型别名

以下简要介绍一下类型别名。C++为类型创建别名有两种方式。

一种是使用预处理器:

#define BYTE char

这样,预处理器将在编译程序编译程序是用char来替换BYTE,从而使BYTE成为char的别名。

另外一种方法使用keywordtypedef来创建别名。完毕上述的代码能够

typedef char BYTE;

typedef typeName aliaName//通用格式

普通情况下最好使用typedef来声明一系列的变量。而在使用#define时可能会遇到一些问题。注意,typedef不会创建新类型,而仅仅是为已有的类型创建一个别名,在有些情况下,在定义一些变量时会更简便。

C++ Primer Plus的若干收获--(三)的更多相关文章

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

    哎,真是不想吐槽考驾照的艰辛历程了.跑到大西郊,顶着大太阳,一天就能摸上个十几分钟二十分钟的车,简直不要太坑爹,这两天真是做的我屁股疼的不行. .. 今天果断不去了.仅仅可惜我的大阿根廷啊,坚持到最后 ...

  2. C++ Primer Plus的若干收获--(九)

    这篇博文我接着上一篇来写,相同讲一些关于类的一些基础知识. 本篇将会继续使用上篇的股票类STock,这里给出接口 ifndef STOCKOO_H_ #define STOCKOO_H_ #inclu ...

  3. C++ Primer Plus的若干收获--(十一)

    本篇主要讲了转换函数的利与弊以及简要介绍流与iostream文件 因为在本篇仍然要使用上篇的Stonewt类,这里首先给出其代码 <span style="font-size:18px ...

  4. 学习C++ Primer 的个人理解(三)

    第三章,主要内容是字符串和数组.感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想. 在我看来,这种内容的难度并不大. 对于编程来说,最重要的应该是思想,类似vec ...

  5. C++ Primer Plus学习:第三章

    C++入门第三章:处理数据 面向对象编程(OOP)的本质是设计并扩展自己的数据类型. 内置的C++数据类型分为基本类型和复合类型. 基本类型分为整数和浮点数. 复合类型分为数组.字符串.指针和结构. ...

  6. 《C++ Primer》读书笔记 第三章

    1.注意:头文件不应包含using声明.因为头文件的内容会拷贝到所有引用他的文件中去,对于某些程序来说,由于不经意间包含了一些名字,可能会产生名字冲突.2.string类型的读入:用cin读入stri ...

  7. C++primer 阅读点滴记录(三)

    14章 操作符重载和转换 重载操作符是具有特殊名称的函数:保留字operator后接需要定义的操作符符号. 1.重载的操作符名: + – * / % ^ & | ~ ! , = <  & ...

  8. C primer plus 读书笔记第三章

    本章的标题是数据和C,主要内容是介绍数据类型中的整数类型和浮点数类型. 本章的第一段代码 #include <stdio.h> int main(void) { float weight; ...

  9. C Primer Plus学习笔记(三)- 字符串和格式化输入/输出

    从一个简单的例子开始 #include <stdio.h> int main() { char name[10]; printf("Input Your Name:\n" ...

随机推荐

  1. UVALive 6663 Count the Regions 离散+bfs染色_(:зゝ∠)_

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=4675">点击打开链接 gg.. ...

  2. jQuery插件 -- Cookie插件

    Cookie是站点设计者放置在client的小文本文件.Cookie能为用户提供非常多的使得,比如购物站点存储用户以前浏览过的产品列表.或者门户站点记住用户喜欢选择浏览哪类新闻. 在用户同意的情况下. ...

  3. dns tunnel C&C

    通过DNS控制主机以及执行命令 我的ubuntu 安装过程 1854 mkdir dns_tunnel_tool 1855 cd dns_tunnel_tool/ 1856 ls 1857 git c ...

  4. SQL 数据库性能优化

    http://blog.csdn.net/yzllz001/article/details/54848513 1.  减少数据访问(减少磁盘访问) 2.  返回更少数据(减少网络传输或磁盘访问) 3. ...

  5. BZOJ 3796 后缀数组+KMP

    思路: 写得我头脑发蒙,,, 旁边还有俩唱歌的 抓狂 (感谢lh大爷查错) 首先 1.w是s1的子串 2.w是s2的子串 这两步很好办啊~ 后缀数组一下O(n)就可以搞 重点是 这个:3.s3不是w的 ...

  6. javascript中缓存

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 利用 js 获取地址栏参数

    1.aspx页面,进行页面跳转 window.location.href = "ProviderInfo.aspx?ProviderID="+ProviderID; 2.Provi ...

  8. Photoshop保存文件时的选项

    以 JPEG 格式存储 您可以使用"存储为"命令以 JPEG (*.jpg) 格式存储 CMYK.RGB 和灰度图像.JPEG 通过有选择地扔掉数据来压缩文件大小.也可以使用&qu ...

  9. asp访问数据库原理以及代码

    ActiveX Data Objects (ADO) 是一项容易使用并且可扩展的将数据库访问添加到 Web 页的技术.可以使用 ADO 去编写紧凑简明的脚本以便连接到 Open Database Co ...

  10. Hacking PHP

    0X01 SQL注入 这里主要是PHP的防范注入的几个配置,注入手法不再赘述 magic_quotes_gpc 对 $_GET $_POST $_COOKIE 变量中的 ' " \ 空字符( ...