呵呵,要重新拾起C++啦。也在这个过程中深入了解一种语言的定义吧。希望能够通过这本书,把c++真正熟悉起来。这段日子对Steve Jobs的stay hungry, stay foolish有了一种更深的理解。现在我要从基础开始!
变量和基本类型中需要注意的点:
1. 反斜杠("\")的使用
处理长字符有一个更基本的方法(不常用),这个方法依赖于很少使用的程序格式化特性:在一行的末尾加一反斜杠可以将此行和下一行当作同一行处理。如:
std::cou\
t << "Hi” << st\
d::endl;
等价于
std::cout<<"Hi"<<std::endl;
但是必须注意的是,反斜杠符号必须是该行的尾字符——不允许后面有注释或空格。
2. 初始化和赋值是不同的操作。(有关这一点,我现在也没有看到更多的解释,但希望强化这个问题的概念,书的后面应该会解释的)。
3. 定义和声明的区别(这个在C专家编程里面也有提到)
定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。
声明用于向程序表明变量的类型和名字(所以定义也是一个声明),可以通过使用extern关键字声明变量而不定义它。
4. 引用(&)
引用只是它绑定的对象的另一个名字,作用在引用上的所有操作都是事实上作用在该引用绑定的对象上。
const引用是 指向const对象的引用。(这一点在C专家编程中,有过与指针相关的论述)
const int ival = 1023;
const int& refval = ival; //valid
int& refval2 = ival; //error
试想,如果最后一条语句可以使用的话,原先作为不可修改的变量ival现在岂不是可以通过refval2进行修改了?所以最后一条语句不合法。
另外,const引用可以初始化为不同类型的对象或初始化为右值,如:
int i=42;
const int &r = 42;
const int &r2 = i+2;
double dval = 3.14;
const int &ri = dval;
//编译器会把这些最后两句代码转换成:
int temp = dval; //先转型
const int& ri = temp;
如果ri不是const,那么可以给ri赋一新值,这样做不会修改dval(因为实际上ri指向的是temp),而是修改了temp,期望对ri的赋值会修改dval的程序员会发现dval并没有被修改。
因此,非const引用只能绑定到与该引用同类型的对象,而const引用则可以绑定到不同但相关的类型的对象或绑定到右值。
5. c++中的struct和class
c++中,用class和struct关键字定义的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员了private。
(现在我有个问题就是,struct中也可以定义方法吗?希望后续的阅读能够找到答案)
6. const对象默认为文件的局部变量
2.4中的第2点我不是很确定。按照书中的说法,非const变量默认为extern,要使const变量能够在其他的文件中访问,必须显式地指定它为extern。(先记在这里了)
7. 头文件用于声明而不是用于定义
//下面的语句都是定义,所以不应该放在头文件里
extern int ival = 10; //已经初始化,所以是定义
double fica_rate; //没有extern,所以是一个定义
因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。
对于头文件不应该含有定义这一规则,有三个例外,头文件可以定义类、值在编译时就已经知道的const对象和inline函数,这是因为编译器需要它们的定义(不只是声明)来产生代码。例如:为了产生能够定义或使用类的对象的代码,编译器需要知道组成该类型的数据成员。同样还需要知道能够在这些对象上执行的操作。类定义提供所需要的信息。
8. 定义在头文件中的const对象
前面说过const变量默认时是定义该变量的文件的局部变量,“正如我们现在所看到的,这样设置默认情况的原因在于允许 const变量定义在头文件中”。(似乎正回答了我前面提到的问题。。。)
下面有一段推理,“一般来说,常量表达式是编译器在编译时就能够计算出结果的表达式。当const整型变量通过常量表达式自我初始化时,这个const整型变量就可能是常量表达式。而const变量要成为常量表达式,初始化式必须为编译器可见。为了能够让多个文件使用相同的常量值,const变量和它的初始化式必须是每个文件可见的。而要使初始化式可见,一般都把这样的const变量定义在头文件中。”
这种行为有一个很重要的含义:当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样。
9. 头文件保护符(header guard)
头文件经常#include其他头文件,例如我们自定义的类self的头文件可能会包含string头文件,而使用该自定义的类的文件main.c也可能会包含string头文件。这种情况下,main.c不会也不应该知道self头文件中包含了string头文件。因此,设计头文件时,应使其可以多次包含在同一个源文件中,我们必须保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义。使得头文件安全的通知做法,是使用预处理器定义头文件保护符。
#ifndef SELF_H
#define SELF_H
//here goes the definition
...
#endif
为了保证头文件在给定的资源中只处理过一次,我们首先检测#ifndef。第一次处理头文件时,测试会成功,因为SELF_H还未定义。下一条语句定义了SELF_H,那样的话,如果我们编译的文件恰好又一次包含了该头文件,#ifndef指示会发现SELF_H已经定义,并且忽略该头文件的剩余部分。
分享到:
相关推荐
根据提供的信息,我们可以推断出这是一段与C++编程语言相关的教材内容。尽管原文包含大量乱码,...通过本书的学习,读者将能够掌握C++的基本概念、程序结构、类型、函数定义等重要知识点,并能够编写出功能完善的程序。
1. **基础语法**:C++的基础语法包括变量、数据类型、运算符、流程控制(如if语句、循环)、函数等。这部分内容是所有编程语言学习的起点,也是理解C++后续特性的基础。 2. **面向对象编程**:C++的核心在于其面向...
1. **基本语法**:C++的基础始于变量、数据类型、常量和运算符。书中会详细讲解如何声明和初始化变量,以及如何使用各种数据类型,如整型、浮点型、字符型等。同时,读者还会了解到C++中的流程控制语句,如if-else、...
5. 变量和基本类型 C++语言支持多种基本类型,包括bool、char、wchar_t、char16_t、char32_t、short、int、long、long long、float、double和long double等。变量是程序的基本组成部分,变量的定义包括基本形式、...
《C++ Primer(中文版第4版)》是学习C++编程的重要参考资料,它由Lippman、Lajoie和 Moo三位资深C++专家撰写,深入浅出地介绍了C++语言的基本概念和技术。这本书旨在帮助读者理解C++的核心特性,并掌握如何有效地使用...
1.1 C++的发展和主要特点 1.2 第一个C++程序以及C++程序开发过程 1.3 C++在非面向对象方面的常用新特性 1.4 程序陷阱 1.5 补充:变量的定义、数据类型、函数等
- **变量与数据类型**:介绍如何声明和使用变量,了解基本数据类型(如 int、float、char)以及复合数据类型(如数组、结构体)。 - **控制结构**:讲解条件语句(if-else)、循环语句(for、while)等基础知识,...
C++是一种通用的、面向对象的编程语言,由Bjarne Stroustrup在C语言的基础上发展而来,它既具有静态类型的强类型系统,又支持过程化编程和面向对象编程。 在C++编程中,了解基本语法是入门的第一步。这包括变量定义...
- **语法基础**:介绍C++的基本语法,如变量、数据类型、控制结构等。 - **面向对象编程**:讲解类、对象、继承、多态等概念,以及它们在游戏开发中的应用。 - **内存管理**:探讨C++中的内存分配和释放机制,以及...
1. **编写 InstallShield 脚本**:InstallShield 脚本语言结合了 Pascal、VB 和 C++ 的特点,支持基于事件的编程。例如,你可以: - **OnBegin**:在安装开始前,用于执行环境检查或初始化任务。 - **...
1. **基本数据类型**:包括整型(int)、字符型(char)、浮点型(float和double)以及布尔型(_Bool)。理解它们的存储大小、取值范围和使用场景是编程的基础。 2. **变量与常量**:理解变量的声明、初始化和赋值...