C++ Primer Summary 02

孤人 提交于 2020-03-30 16:12:29

标识符:变量名,即变量的标识符;C++中的标识符都是大小写敏感的。

初始化:复制初始化和直接初始化。直接初始化效率更高。

初始化不是赋值:初始化既创建变量又赋初始值,赋值则是擦除对象的当前值并用新值代替。

系统有时候会帮我们初始化变量,系统提供什么样的值取决于变量的类型以及定义的位置。

未初始化的变量引起运行问题:可能会导致程序错误执行和/或错误计算,问题出在未初始化的变量事实上都有一个值,编译器指定变量的内存地址,该地址原有数值依然存在。建议每个内置类型的对象都要初始化。

声明和定义:声明用于向程序表明变量的类型和名字。定义也是声明。但声明不是定义。可以使用extern声明变量。

extern int i;//declares but not define i

int i;//declares and define i

extern double i = 0;//definition

C++语言中,变量必须且仅能定义一次。

变量名相同,在局部作用域中局部变量会屏蔽全局变量。

函数外部的名字具有全局作用域。类作用域、命名空间作用域、语句作用域、局部作用域。

const限定符把一个对象转换成一个常量,定义const对象时必须初始化。

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

通过指定const变量为extern,就可以在整个程序钟访问const对象。

非const变量默认为extern。要使const变量能够在其他的文件钟访问,必须显式地指定它为extern。

引用是别名,只是对象的另一名字。作用在引用上的所有操作事实上都是作用在该引用绑定的对象上。在定义引用时必须进行初始化。当引用存在,不可能将引用绑定到另一个对象。

非const引用需要指向对象。

int &value = 0;//error

const int &value = 0;//true

typedef 可以用来定义类型的同义词 typedef double synonyms

有以下三种目的:

1、隐藏特定类型的实现,强调使用类型的目的

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

3、允许一种类型用于多个目的,同时使得每次使用该类型的目的明确

枚举 enumerator 指明这些值是相关联的;初始化或赋值只能通过其枚举成员或同一枚举类型的其他对象来进行;enum OpenModes {input, output, append}; 

类定义:花括号后必须要跟一个分号。操作和数据是类的一部分,也称为类的成员,操作称为成员函数,数据称为数据成员

定义变量和定义数据成员存在非常重要的区别:一般不能把类成员的初始化作为其定义的一部分。当定义数据成员时,只能指定该数据成员的名字和类型。类不是在类定义里定义数据成员时初始化数据成员,而是通过称为构造函数的特殊成员函数控制初始化。

一般类定义都会放入头文件。头文件包含的不仅仅是类定义。注意:这里是说类定义,而不是变量的定义!

头文件为相关声明提供了一个集中存放的位置。头文件一般包含类的定义、extern变量的声明和函数的声明。

类的成员函数可以使用类的任何成员,而不管其访问级别。不是类的组成部分的代码不能访问private成员。

默认情况下,struct的成员都是public,而class的成员为private。

C++支持所谓的分别编译(separate compilation)

任何使用XXX的源文件都必须包含XXX.h头文件

编译和链接:生成.o文件;链接

头文件用于声明而不是用于定义(不是包含类定义吗?)。定义只可以出现一次,而声明则可以出现多次。定义语句不应用放在头文件里,如:

extern int i = 0;//initializer,so it's a definition

double d;//no extern,so it's a definition

同一个程序中有两个以上文件含有上述任一个定义都会导致多重定义链接错误。

头文件包含在多个源文件中,所以不应该含有变量或函数的定义。(不是说类的定义!)

但可以定义类、值在编译时就已知道的const对象和inline函数。

常量表达式:编译器在编译时就能够计算出结果的整型表达式。整型字面值常量是常量表达式。

目的:为了能够让多个文件使用相同的常量值,一般把const变量定义在头文件中。

问题:可是,C++中的任何变量都只能定义一次,定义会分配存储空间。

解答:因为const对象默认为定义它的文件的局部变量,所以把它们的定义放在头文件中是合法的。

含义:当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样。

注意:如果const变量不是用常量表达式初始化,那么它就不应该在头文件中定义。相反,和其他的变量一样,该const变量应该在一个源文件中定义并初始化。

预处理器?#include指示是怎样工作的?

预处理器处理程序的源代码,在编译器之前运行。预处理器用指定的头文件的内容替代每个#include。

头文件经常需要其他头文件,设计头文件时,应使其可以多次包含在同一源文件中,必须保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义。使得头文件安全的通用做法,是使用预处理器定义头文件保护符。

预处理器变量的名字在程序中必须是唯一的。任何与预处理器变量相匹配的名字的使用都关联到该预处理器变量。预处理器变量疆场用全大写字母表示。预处理器变量有两种状态:已定义或未定义。预处理器设施的作用:预防多次包含同一头文件。

头文件应该含有保护符,即使这些头文件不会被其它头文件包含。#ifndef CLASSNAME #define CLASSNAME //Definition class #endif

心有多宽,舞台就有多宽广。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!