C++Builder环境
C++Builder环境下默认的命令行程序主函数是_tmain
#include <iostream>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
/*
_tmain 在<tchar.h> 中定义
_tmain()是宏定义,如果是UNICODE则他是wmain()否则他是main()
_tmain()是微软操作系统(windows)提供的对unicode字符集和ANSI字符集进行自动转换用的程序入口点函数。
函数签名为:
int _tmain(int argc, TCHAR *argv[])
当你程序当前的字符集为unicode时,int _tmain(int argc, TCHAR *argv[])会被翻译成
int wmain(int argc, wchar_t *argv[])
当你程序当前的字符集为ANSI时,int _tmain(int argc, TCHAR *argv[])会被翻译成
int main(int argc, char *argv[])
*/
{
}
第1章基本概念
C++11深刻地现代化了C++语言和我们使用这种语言的方式,以至于我们几乎可以将 C++11看成一种新的语言。使用 C+11及更新版本的功能进行编程称为“现代 C++”编程。
头文件包含源文件中使用的定义。
在 C+中,输入和输出是使用流来执行的。如果要输出消息,可以把消息写入输出流中;如果要输入数据,则从输入流读取。因此,流是数据源或数据接收器的一种抽象表示。在程序执行时,每个流都关联着某台设备,关联着数据源的流就是输入流,关联着数据目的地的流就是输出流。对数据源或数据接收器使用抽象表示的优点是,无论流代表什么设备,编程都是相同的。例如,从磁盘文件中读取数据的方式与从键盘上读取完全相同。在C++中,标准的输出流和输入流称为 cout和 cin,默认情况下,它们分别对应计算机的屏幕和键盘。
std::cout 中,<<是插入运算符,用于把数据传递到流中。提取运算符>>用于从流中读取数据。每个<<右边的所有内容都会传递到 cout 中。
把 endl写入std:cout,会在流中写入一个换行符,并刷新输出缓存。刷新输出缓存可确保输出立即显示出来。
return 语句会结束函数,把控制权返回给调用函数的地方。只有在 main()函数中,忽略return 才相当于返回 0,对于其他任何返回类型为 int 的函数,最好以一个显式的 return语句结束,否则编译器不知道任意函数在默认情况下应该返回哪个值。
命名空间(名称空间)
名称空间类似于姓氏,置于该名称空间中声明的所有名称的前面。
标准库中的名称都在 std 名称空间中定义,cout 和 endl是标准库中的名称,所以其全名是 std::cout 和 std::endl。其中的两个冒号有一个非常奇特的名称:作用域解析运算符,这里它用于分隔名称空间的名称std 和标准库中的名称(例如 cout和endl)。标准库中的几乎所有名称都有前缀 std。
名称空间的代码如下所示,花括号对中的所有内容都位于my space 名称空间中
namespace myspace{
//All names declared in here need to be prefixed with my space when they are reference from outside.
//For example,a min()function defined in here would be referred to outside this namespace as my space::min()
}
main0)函数不能定义在名称空间中,未在名称空间中定义的内容都存在于全局名称空间中,全局名称空间没有名称。
Unicode
- Unicode 中一最常用的编码是 UTF-8、UTF-16和UTF-32,它们都可以表示 Unicode 集合中的所有字符。它们之间的区别是如何表示给定字符的代码点,给定字符的代码值在这三种表示法中是相同的。下面是这些编码表字符的方式:
- UTF-8把字符表示为长度在1字节和4字节之间化的序列。ASCII字符集在 UTF-8中表示为单字节代码,其代码值与 ASCII相同。大多数网页都使用 UTF-8编码文本
- UTF-16 把字符表示为1个或2个16位的值。UTF-16包括了 UTF-8。因为一个 16 位值包含0代码段中的所有代码,所以 UTF-16 覆盖了多语言编程环境中的大多数情形。
- UTF-32 将所有字符表示为 32 位值。
- 存储 Unicode 字符有4个整数类型可用::char、wchar_t、char16_t和char32_t。
其他
- 建议不要用以下划线开头的名称。
- 类是定义数据类型的代码块。类的名称就是数据类型的名称。类类型的数据项称为对象。创建变量,以存储自定义数据类型的对象时,就要使用类类型名称。定义自己的数据类型,就可以根据具体的问题提出解决方案。例如,如果编写一个处理学生信息的程序,就可以定义 Sudent 类型。Sudent 类型可以包含学生的所有特征,例如年龄性别或学校记录–这些都是程序需要的。
- 有时程序需要几个类似的类或函数,其代码中只有所处理的数据类型有区别。编译器可以使用模板给特定的自定义类型自动生成类或函数的代码。编译器使用类模板会生成一个或多个类系列,使用函数模板会生成函数。每个模板都有名称,希望编译器创建模板的实例时,就会使用该名称。标准库大量使用了模板。
- 创建可执行文件:从 C++源代码中创建可执行的模块需要三个步骤。
- 第一步是预处理器处理所有的预处理指令。一般来说,它的关键任务之一是将所有
#include
头文件的完整内容复制到.cpp 文件中。 - 第二步是编译器把每个.cpp 文件转换为对象文件,其中包含了与文件内容对应的机器码。
- 第三步是链接程序把程序的对象文件合并到包含完整可执行程序的文件中。
- 编译器把每个源文件看作一个独立的实体,为每个.cpp 文件生成一个对象文件然后在链接步骤中,把程序的对象文件和必要的库函数组合到一个可执行文件中。
- 第一步是预处理器处理所有的预处理指令。一般来说,它的关键任务之一是将所有
// Exercise 1-1 Writing the line "Hello World" to the screen.
#include <iostream>
int main()
{
std::cout << "Hello World!你好,世界!" << std::endl;
}
// Exercise 1-2. Write your name and age on successive lines.
// There are several possibilities. You can do it in one statement for example.
// You could also output ‘\n’ to go to a new line.
#include <iostream>
int main()
{
std::cout << "Phil McCavity" << std::endl; // Name
std::cout << "Age: 88"
<< "\n"; // and age
}
第2章 基本数据类型
包含初始值的花括号称为初始化列表,这是 C+-+11 引入的语法,对初始化进行了标准化。
- 十进制整型字面量可以加后缀:U,L,LL(建议大写)
- 十六进制的整型字面量需要加前缀:0x或0X
- 八进制的整型字面量需要加前缀:0
- 二进制的整型字面量是在 C++14 中引入的,写为带有前缀 0b 或 0B 的一系列二进制数字(0 或 1)。二进制的整型字面量可以把L或LL作为后缀,表示其类型是long或long long;若把u或U作为后缀,则表示是不带符号的字面量。
十六进制的整型字面量主要用于定义位的特定模式。因为每个十六进制位都对应二进制值的4位,所以很容易把位的特定模式表达为十六进制的字面量。像素颜色的红、蓝、绿成分(RGB 值)常常表示为 32 位字的3个字节。白色可以指定为 0xFFFFFF,因为在白色中,上述三种颜色成分的强度都是最大值 255,即 0xFF。红色则是0xEF0000。
cin>>
运算符期望读取的值的类型由要存储该值的变量类型确定,所以需要输入不带符号的整数。>>
运算符会忽略空格,值后跟的第一个空格会终止该操作。这说明,不能使用>>
运算符从流中读取和存储空格,即使把空格存储在保存字符的变量中,也是如此。
op=赋值运算符
a op= b 等价于 a=a op (b), 其中括号很重要
#include <iostream>
int main()
{
int x { 0 };
int y { 10 };
std::cout << "x=" << x << ",y=" << y << std::endl;
x += y + 1;
std::cout << "x=" << x << ",y=" << y << std::endl;
}
/*
x=0,y=10
x=11,y=10
*/