C++primer 笔记第二章

C++定义了一组表示整数、浮点数、单个字符和布尔值的算术类型(arithmetic type),另外还定义了一种成为void的特殊类型。

表示整数、字符和布尔值的算术类型成为整型(integral type)。

C++ 内置类型与其在计算机存储器中的表示方式紧密相关。计算机以序列存储数据,每一位存储0或者1.

让存储具有结构的基本方法是用块(chunk)处理存储。大部分计算机都使用特定位数的块来处理存储,块的位数一般是2的幂。大多数计算机将存储器中的每一个字节和一个称为地址的数关联起来。要让指向某个字节的地址具有意义,必须要知道存储在改地址的值的类型。

像C语言一样C++被设计成允许程序在必要时直接处理硬件(?是不是和上次碰到asm文件有一定的联系),因此整型被定义成满足各种各样硬件的特性。

C++是一门静态类型语言,在编译时会做类型检查。在大多数语言中没对象的类型限制了对象可以执行的操作,如果某种类型不支持某种操作,那么这种类型的对象也就不能执行该操作。在C++中,操作是否合法是在编译时检查的。当编写表达式时,编译器检查表达式中的对象是否按该对象的类型定义的方式使用。如果不是的话,那么编译器会提示错误。而不产生可执行文件。P39

什么是变量?变来那个提供了程序可以操作的有名字的存储区。C++中的每一个变量都有特定的类型,该类型决定了变量的内存大小和布局、能够存储于该内存中的值的取值范围以及可应用在该变量上的操作集。

左值:(lvalue)左值可以出现在赋值语句的左边或者右边。

右值:(rvalue)只能出现在赋值的邮编,不能出现在赋值语句的左边。

=操作符(等号操作符)读取右操作数并写到左操作数。

C++程序员常把变量称为“变量”或者“对象(object)”

一般而言,术语“对象”,就是内存中具有类型的区域。本书遵循更为通用的用法,即“对象”是内存中具有类型的区域。我们可以自由使用对象描述程序中可操作的大部分数据,而不管这些数据是内置类型还是类类型。

变量名:即变量的标识符。

变量定义指定了变量的类型和标识符,也可以为对象提供初始值。C++指定了两种初始化变量的形式:复制初始化(copy initialization)和直接初始化(direct-initialization)。复制初始化语法用等号(=),直接初始化则是把初始化式放在括号内。例如:

int ival(1024);(直接初始化语法更灵活且效率更高

int ival=1024;

虽然现在还没有涉及,但是在C++中理解“初始化不是赋值”是十分必要的。初始化是指创建变量并赋值,而赋值则是擦除对象当前值并用新值代替。(初始化的重要性 accelerated C++ 中好像也有涉及,需要回去查书)

 初始化内置类型的对象只有一种方法:提供一个值,并把这个值复制到新定义的对象中。对内置类型来讲,复制初始化和直接初始化几乎没有差别。对类类型来讲,有些初始化仅能够用直接初始化来完成。

 

每个类都会定义一个或几个特殊的成员函数来告诉我们如何初始化类类型的变来那个。定义如何进行初始化的成员函数称为构造函数(constructor)。

以string类为例:

string类定义了几个构造函数,让我们可以用不同的方式来初始化string对象。其中一种初始化string对象的方式是作为字符串字面值的副本:

#include <string>

std::string titleA="C++ Primer";

std::string titleB(C++ primer);

本例中,两种初始化方式都可以使用,两种定义都创建了一个string对象,其初始值都是制定的字符串字面值的副本。

也可以通过一个计数器和一个字符初始化string对象。这样创建的对象包含重复多次的制定字符,重复次数由制定计数器制定:

std::string all_nines(10,'9');//all_nines="9999999999";

 

3.初始化多个变量

当一个定义中定义了两个以上变来那个的时候,每个变来那个都可以有自己的初始化式子。对象的名字立即变成可见,所以可以用同一个定义中前面已经定义变量的值去初始化后面的变量。已初始化和未初始化变量可以在同一个定义中定义。两种形式的文法都可以互相混合。

例如: double salary=9999.99 , wage(salary+0.01);

2.3.4 变量初始化规则

当定义没有初始化式的变来那个时,系统有时会帮我们初始化变量。这是,系统提供什么样的值取决于变量的类型,也取决于变量定义的位置。

1.内置类型变量的初始化

内置类型变来那个是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体里定义的内置类型不进行自动初始化。除了用作赋值操作符的左操作数,未初始化变量用作任何其他用途都是没有定义的。未初始化变量引起的错误难以发现。永远不要依赖未定义行为。(尤其是指针)

建议每个内置类型的对象都要初始化。虽然这样做并不总是必须的,但是会更加容易和安全,除非你确定初始化式不会带来风险。

2.3.5 声明和定义

为了让多个文件访问相同的变量,C++区分了声明和定义。

变量的定义(definition)用于为变量分配存储空间,还可以为变量制定初始值。在一个程序中变量有且只有一个定义。

声明(declaration)用于向程序表明变来那个的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern。

例如: extern int i;

extern 声明不是定义,也不分配内存空间。事实上,它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。http://www.cnblogs.com/GavinDai/archive/2011/10/24/2222735.html

如果声明有初始化式,那么他可以被当作是定义,即使声明标记为extern;

只有当extern声明位于函数外部时,才可以含有初始化式。

 

2.3.6名字的作用域

用来区分名字的不同意义的上下文被称为作用域(scope)。作用域是程序的一段区域。一个名称可以和不同作用域中的不同实体相关联。

C++中,大多数的作用域都是用花括号来界定的。一般来说,名字从其声明点开始直到其声明坐在的作用域结束处都是可见的。

定义在所有函数外部的名字具有全局作用域(global scope)。

C++ 中作用域可以嵌套。

名字还可以在内部作用域中重新定义。理解和名字相关联的实体需要明白定义名字的作用域。

2.3.7 在变量使用出定义变量

通常把一个对象定义在它首次使用的地方,可以提高程序的可读性。

2.4 const限定符

定义一个变来那个来代表一个常数的方法存在一个严重的问题,即变量是可以修改的。const限定符提供了一个解决办法,它把一个对象转换成一个常量。

因为常量在定以后就不能被修改,所以定义时必须初始化。

 

2.const对象默认为文件的局部变量

在全局作用域里定义const变量时,他在整个程序中都可以访问。我们可以把一个非cosnt变量定义在一个文件中,假设已经做了合适的声明,就可以在另外的文件中使用这个变量。

//file_1.cc
int counter;//defibition
//file_2.cc
extern int counter;//uses counter from file_1

 

与其他变量不同,除非特别说明,在全局作用域声明的const变来那个是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。 

 关于extern 别人的思考,借鉴一下:

http://www.th7.cn/Program/cp/201308/145066.shtml

 

 2.5 引用

引用(reference)就是对象的另一个名字。在实际程序中,引用主要是用作函数的形式参数

引用时一种复合类型(compound type),通过在变量名前添加“&”符号来定义。复合类型是指用其他类型定义的类型。引用必须用与该引用同类型的对象初始化。

1.引用是别名

因为引用指示它绑定的独享的另一个名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上。

3.const 引用

const int ival=1024;
const int &refval=ival;//OK:both reference and object are const
int &ref2=ival;//error:nonconst references to a const object

 

 属术语;const 引用是指向const的引用

 

2.6 typedef 名字

 typedef通常被用于以下三种目的:

1.为了隐藏特定类型的实现,强调使用类型的目的。

2.简化复杂的类型定义,使其更容易理解。

3.允许一种类型用于多个目的,同事是的每次使用该类型的目的明确。

2.7 枚举

枚举igongle一种方法不但定义了整数常量集,而且还把他们集合成组。默认的,第一个枚举成员赋值为0,后面的每个枚举成员赋的值都比前一个大1.

 

 2.8类 类型

1.从操作开始设计类

每个类都定义了一个接口(interface)和一个实现(implementation)。接口由使用该类的代码需要执行的操作组成。实现一般包括该类所需要的数据。实现包含定义该类需要但又不供一般性使用的函数。

定义类时,通常先定义该类的接口,即该类所提供的操作。通过这些操作,可以决定该类完成其功能所需要的数据,以及是否需要定义一些函数来支持该类的实现。

类定义以为关键字class开始 其后是该类的名字标示符。类体位于花括号里面。花括号后面必须跟一个分号

4.访问标号

访问标号(private, public)负责控制使用该类的代码是否可以使用给定的成员。类的成员函数可以使用类的任何成员,不管其访问级别

5.struct 关键字

C++支持另一个关键字struct ,它也可以定义类类型。struct关键字是从C语言中集成来的。(这个是以前容易混淆的感念,因为先学的C)

使用class还是struct关键字来定义类,仅仅影响默认的出事访问级别。如果使用class来定义类,那么定义在第一个访问标号钱的任何成员都隐式的制定为private;如果使用struct,那么这些成员都是public。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值