第一章
1.5.2 初识成员函数 成员函数是定义为类的一部分的函数,有时也被称为方法。 使用点运算符,表达我们需要xx的对象的xx成员。点运算符只能用于类类型的对象。 ()运算符——调用运算符,起到调用函数的效果。 ::运算符——作用域运算符。其用处之一是访问命名空间中的名字。 <<运算符:输出运算符。cout << “hello” << endl; >>运算符:输入运算符。cin >> i >> j >> endl;
第二章
C++最重要的语法特征应该就是类,通常被称为“类类型(class type)”。 由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值,实际上是由常量字符构成的数组。编译器在每个字符串的结尾处添加一个空字符 ’\0’。 何为对象 通常情况下,对象是指一块能存储数据并具有某种类型的内存空间。 分离式编译 为了支持分离式编译,C++语言将声明和定义区分开来。声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。定义负责创建与名字关联的实体。 声明一个变量,在变量名前添加关键字extern。 变量只能被定义一次,但是可以被多次声明。
变量命名规范:用户自定义的类名一般以大写字母开头。
2.3 复合类型
- 引用
引用为对象起了另外一个名字,引用类型引用另外一种类型。通过将声明符携程&d的形式来定义引用类型,其中d是声明的变量名。引用必须初始化! 引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字。引用本身不是一个对象,所以不能定义引用的引用。 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起。引用的类型都要和与之绑定的对象严格匹配。 - 指针
指针也实现了对其它对象的间接访问,然而指针与引用相比又有许多不同点。1、指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。2、指针无须在定义时赋初值。和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。 指针存放某个对象的地址,要想获取该地址,需要使用取地址符(操作符&) !因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。 指针的类型和它所指向的对象严格匹配。 如果指针指向了一个对象,则允许使用解引用符(操作符*)来访问该对象。 解引用操作仅适用于确实指向了某个对象的有效指针。 空指针赋值在C++11中使用nullptr void* 指针,是一种特殊的指针类型,可以存放任意对象的地址。利用void* 指针能做的事情比较有限:和别的指针比较、作为函数的输入输出、或者赋给另外一个void* 指针。不能直接操作void* 指针所指向的对象,因为我们并不知道这个对象是什么类型,也就无法确定能在这个对象上做哪些操作。 指向指针的指针 指针是内存中的对象,像其他对象一样也有自己的地址,因此允许把指针的地址再放到另一个指针当中。 通过*的个数可以区分指针的级别。**表示指针的指针,***表示指向指针的指针的指针。 指向指针的引用 引用本身不是一个对象,因此不能定义指向引用的指针。而指针是对象,所以存在对指针的引用。
int i = 1;
int *p;
int *&r = p;
r = &i;
*r = 10;
理解r的类型是什么,最简单的办法是从右到左阅读r的定义。离变量名最近的符号(此例中是&r的符号&)对变量的类型有最直接的影响,因此r是一个引用。 2.4 const关键字 定义一种变量,它的值不能被改变。使用变量的好处是当我们觉得值不再合适时,很容易对其进行调整。另一方面,也防止程序一不小心改变了这个值。 const对象一旦创建后其值就不能再改变,所以const对象必须初始化。 与非const类型所能参与的操作相比,const类型的对象能完成其中大部分,但也不是所有的操作都适合。主要的限制就是只能在const类型的对象上执行不改变其内容的操作,例如参与算术运算等。 如果利用一个对象去初始化另外一个对象,则它们是不是const都无关紧要。 默认状态下,const对象仅在文件内有效。 只在一个文件中定义const,而在其他多个文件中声明并使用它,解决的办法是添加extern关键字。 const的引用 常量引用是对const的引用,与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象。 指针和const 类似于常量引用,指向常量的指针 不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针。 TIP:所谓指向常量的指针或引用,不过是指针或引用“自以为是”罢了,它们觉得自己指向了常量,所以自觉地不去改变所指对象的值。 常量指针必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的地址)就不能再改变了。把*放在const关键字之前用以说明指针是一个常量,即不变的是指针本身的值而非指向的那个值。 指针本身是一个常量并不意味着不能通过指针修改其所指对象的值,完全取决于所指对象的类型。 顶层const 用名词顶层const表示指针本身是个常量,而用名词底层const表示指针所指的对象是一个常量。顶层const可以表示任意的对象是常量,底层const则与指针和引用等复合类型的基本类型部分有关。 in *const p = &err; 表示指针是个常量,指针的指向不变 const int * p = &err; 表示指针指向的值是个常量,指针可以改变指向,不能改变err的值。 常量表达式 常量表达式是指值不会改变并在编译过程就能得到计算结果的表达式。 C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。 auto类型说明符 auto让编译器通过初始值来推断变量的类型。auto定义的变量必须有初始值。 decltype类型指示符 它的作用是选择并返回操作数的数据类型。 自定义数据类型 类数据成员 类体定义类的成员,我们的类只有数据成员。类的数据成员定义了类的对象的具体内容,每个对象有自己的一份数据成员拷贝。修改一个对象的数据成员,不会影响其他的对象。 类通常被定义在头文件中。 预处理器 确保头文件多次包含仍能安全工作的常用技术的预处理器。 C++用到的一项预处理功能是头文件保护符,头文件保护符依赖于预处理变量。预处理变量有两种状态:已定义和未定义。#define 指令把一个名字设定为预处理变量,另外两个指令则分别检查某个指定的预处理变量是否已经定义:#ifdef当且仅当变量已定义时为真,#ifndef当且仅当变量未定义时为真。一旦检查结果为真,则执行后续操作直到遇到#endif指令为止。 warning:预处理变量无视C++语言中关于作用域的规则。
|