让我们来看一看C++ 二.对象的定义、初始化和赋值

  距离写完第一篇已经过了好几个月,一直想写,不知道从哪里下笔。

  第一篇被很多网站爬了去,其实我并不排斥被爬,因为这不是什么盈利性的文章,只是希望诸位能最后署上一个Xstsow的名字。

 

  回归正题,我在第一章中讲到了main是一个主函数,int是主函数的数据类型,在开始下面的内容之前,还是很有必要把数据类型重新或者说更详细地介绍一遍。

  数据类型包括一个集合和一系列运算,不同的数据类型对应的集合也不尽相同,比如int对应的就是-2^(32-1) ~ 2^(32-1) -1 之间的整数,对应的运算也就是加减乘除等我们常见不常见的运算了。

  不同的数据类型对应着不同的数据结构,这是因为,数据的储存需要占据一定的空间。计算机储存是用二进制来储存的,而且计算机只是一个跟着使用者走的东西,你给他开多大空间,他就用多大空间。这样,一些人们就定义了各式各样的数据类型,有的数据类型对应整数,有的对应实数(浮点数),还有对应字符(char),有的对应true和false(布尔型),诸如此类,而每一种数据的储存方式是一样的,都是储存在一个固定大小的二进制空间里,如果二进制空间大小仅1位,那么他只能表示0、1,也就是可以表示两个不同数据,如果有2位,就能表示1、2、3、4,4个不同数据。在实际储存中,还要涉及一些更高深的东西,在这一章里,我不再赘述。

 

  我在上一章放了一个附录,附录里有一系列的数据类型,我再把它重新召唤出来一次。

  大召唤术!!!!!!

  哈啊!!!!!!

 

C++基本数据类型

  类型+含义+最小存储空间(按2进制储存)如下:

  bool 布尔型

  char 字符型 8位

  wchar_t 宽字符型 16位

  short 短整型 16位

  unsigned short 无符号短整型 16位(无符号类型无法表示负数,但是正数的表示范围会大一倍)

  long 长整形 32位

  unsigned long 无符号长整型 32位

  long long 双长型 64位

  unsigned long long 无符号双长型 64为

  float 单精度浮点型 6为有效数字(浮点数可理解做小数)

  double 双精度浮点型 10位有效数字

  long double 扩展精度浮点型 10位有效数字

 

  注意我用蓝色表示并加粗的地方,最小储存空间的意思是,下面类型对应的储存空间大小最小是这么小,但是部分数据类型可以更大。在C++标准中,部分数据范围是有明确限制的,而有些只有一个大体范围要求。我们之前使用的int并没有出现在表中,它的储存空间通常被认为是32位,但在某些情况下会变成16位。

 

  假设,我们需要让一个人输入两个小于maxint的数字,然后颠倒顺序输出,那么我们需要两个变量:int a, int b。

  他们在程序中的定义方式可以为int a; int b;(分行也可以) 或者 int a, b;

  第一个与第二个的区别在于,第一个用;把两个语句分开了,所以b定义时必须重新声明是int类型。而第二个是用,来分割两个变量,依旧是一个语句,所以不需要额外声明了。也就是说,如果我们想定义多个同类型的变量时,我们既可以分开定义,又可以用,把他们放在同一个语句中来定义,这种定义方式对于最基本的数据类型都是实用的,你可以定义一个 double a, b 也可以定义 char a, b。

  

  对于变量的定义既可以定义在函数外边 像是

int a, b;
int main() {
    return 0;
}

  又可以定义在函数(未必是主函数)里面

int main() {
    int a, b;
    return 0;
}

  在函数外面定义的,我们称之为全局变量,他可以在任何一个函数中使用,在函数内部定义的,我们称之为局部变量,他只能在该函数内部使用。一个全局变量通常会被自动初始化为0,而局部变量,就要靠我们自己初始化了。

 

  那么,问题来了,如何进行初始化。

  依旧提供两个方法,第一个是定义完一个变量后,单开一个语句进行初始化 int a; a = 0;

  第二个办法是一边定义一边初始化, int a = 0;

  两种都是正确的,而且适用于所有基本类型,但是第二种有一个要注意的问题。

  int a, b = 0; 只有b被初始化为0,如果想把两个都初始化,那么要这么写 int a = 0, b = 0;

  给数据进行初始化是一个好习惯,但是并不是所有数据都需要初始化,比如一个需要读入的数据就是明显不需要初始化的。

 

  初始化还有一个办法,我们称之为“构造函数语法(constructor syntax)”

    int a(0);

  然后你就发现程序员变态的地方了,初始化就初始化,还非得弄两种办法,而且第二种还起一个这么高端的名字,这样真的好吗?

  其实用 = 进行初始化是沿袭的c的语言习惯,如果一个类型并非是内置的基本类型,或者这个变量其实包含着不只一个数据,那么这种办法就不怎么实用了。

    string s = "World"

  这当然没问题,但是如果我们要给标准库里的复数(complex number)赋值,那就没这么简单了。复数需要两部分,实部和虚部,他确实可以表示为Ni+m,但在程序中,我们更青睐于分别记录他的实部和虚部。

  

#include<complex>
complex<double> a(0, 7);

   那个尖括号看起来很碍眼,但是他很重要,他说明了complex是一个模板类(template class),这个模板可以对很多数据类型都适用,但是在正式使用时,我们必须指定他的类型,<double>表示这个complex是double类的。

  复数必须用浮点数来表示,但并不限制是哪一种浮点数,于是我们采取了double。

  在后面开始讲STL的时候,大家便会接触到很多样式的模板类,到时便能理解他的用法。

 

  再谈一谈char(字符)和bool(布尔)两种数据,char表示字符,在程序里我们通常用单括号把字符括起来,比如'r',为什么要这么做那,举一个例子。

    char r = 'r';

    char a = r;

  这两句里有两种r一种是有单引号的,一种是没有的,没单引号的表示变量,有单引号的表示字符,如果我们不进行这样的区分,那么在执行下面char a = r的时候,a到底是应该等于r这个变量还是等于r这个字符那?为了解决这个问题,我们通常用单引号括起字符来。

  还有一种叫做string(字符串)的数据类型,顾名思义,他就是把一堆字符串起来,而他的赋值和字符有不同,那就是字符串通常要用双引号括起来,而不是单引号。

  char表示的字符中还有一些奇葩的东西,他们就是转义字符(eacape sequence),他们用来表示一些没法直接表示的东西,比如

    '\n'  换行符

    '\t'  制表符

    '\''  单引号

    '\0' 空字符

    '\"'  双引号

    '\\'  反斜线。

  然后如果你要输出换行,你就要这样 cout << '\n';

  然后是bool型,布尔型对应的值有两种,true和false,true表示真,false表示假,到目前为止,他还派不上什么用场,但在第四章,我会详细介绍他。

 

  最后是讲一个叫做常量(const)的东西,常量相对于变量,他的值在一开始就被设定出来了,而且永远不会改变。他的定义方式是

    const int a = 100;

  在定义完了常亮a之后,就不能再修改a的值了,也就是不能再为a执行赋值语句。

 

  

posted @ 2015-02-06 10:20  Xstsow  阅读(379)  评论(0编辑  收藏  举报