C++
[toc]
C++
C++ basic
- 一种中级语言,
- 由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。
- C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。
- C++ 可运行于多种平台上,如 Windows、MAC 操作系统以及 UNIX 的各种版本。
面向对象程序设计
C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性:
- 封装
- 抽象
- 继承
- 多态
标准库
标准的 C++ 由三个重要部分组成:
核心语言
: 提供了所有构件块,包括变量、数据类型和常量,等等。C++ 标准库
: 提供了大量的函数,用于操作文件、字符串等。标准模板库(STL)
: 提供了大量的方法,用于操作数据结构等。
C++ 环境设置
本地环境设置
设置 C++ 语言环境需要确保两款可用的软件,文本编辑器和 C++ 编译器。
文本编辑器
- 用于输入程序。
- 文本编辑器包括 Windows Notepad、OS Edit command、Brief、Epsilon、EMACS 和 vim/vi。
- Notepad 通常用于 Windows 操作系统上
- vim/vi 可用于 Windows 和 Linux/UNIX 操作系统上。
通过编辑器创建的文件通常称为源文件
- 源文件包含程序源代码。
- C++ 程序的源文件通常使用扩展名
.c++
、.cp
或.c
。
C++ 编译器
源文件中的源代码需要”编译”转为机器语言,这样 CPU 可以按给定指令执行程序。
C++ 编译器
用于把源代码编译成最终的可执行程序。- 大多数的 C++ 编译器并不在乎源文件的扩展名,如果未指定扩展名,则默认使用
.c++
。 - 最常用的是 GNU 的 gcc C/C++ 编译器,
- 如果使用的是 HP 或 Solaris,则可以使用各自操作系统上的编译器。
GNU 的 C/C++ 编译器
UNIX/Linux
1
2
3
4
5
6
7
8
- 检查是否安装
$ g++ -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr .......
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
使用 Visual Studio (Graphical Interface) 编译
- 设置文件 main.c++,
1
2
3
4
5
6
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
return 0;
}
- Debug -> Start Without Debugging (或按下 ctrl + F5) :
- 完成以上操作后,你可以看到以下输出
g++ 应用说明
程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 用 gcc 来编译链接 C++ 程序
$ gcc main.c++ -lstdc++ -o main
// helloworld.c++ 程序的代码:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
// .c++文件放在桌面
$ cd Desktop
$ g++ helloworld.c++
// 未指定exe文件名,默认 a.out。
// 运行程序
$ ./a.out
Hello, world!
// 使用 -o 选项指定可执行程序的文件名
$ g++ helloworld.c++ -o helloworld
$ ./helloworld
Hello, world!
// 多个 C++ 代码文件,runoob1.c++、runoob2.c++ 生成一个 runoob 可执行文件。
$ g++ runoob1.c++ runoob2.c++ -o runoob
// g++ 有些系统默认是使用 C++98,我们可以指定使用 C++11 来编译 main.c++ 文件:
$ g++ -g -Wall -std=c++11 main.c++
g++ 常用命令选项
选项 | 解释 |
---|---|
-ansi | 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。 |
-c | 只编译并生成目标文件。 |
-DMACRO | 以字符串”1”定义 MACRO 宏。 |
-DMACRO=DEFN | 以字符串”DEFN”定义 MACRO 宏。 |
-E | 只运行 C 预编译器。 |
-g | 生成调试信息。GNU 调试器可利用该信息。 |
-IDIRECTORY | 指定额外的头文件搜索路径DIRECTORY。 |
-LDIRECTORY | 指定额外的函数库搜索路径DIRECTORY。 |
-lLIBRARY | 连接时搜索指定的函数库LIBRARY。 |
-m486 | 针对 486 进行代码优化。 |
-o | FILE 生成指定的输出文件。用在生成可执行文件时。 |
-O0 | 不进行优化处理。 |
-O | 或 -O1 优化生成代码。 |
-O2 | 进一步优化。 |
-O3 | 比 -O2 更进一步优化,包括 inline 函数。 |
-shared | 生成共享目标文件。通常用在建立共享库时。 |
-static | 禁止使用共享连接。 |
-UMACRO | 取消对 MACRO 宏的定义。 |
-w | 不生成任何警告信息。 |
-Wall | 生成所有警告信息。 |
C++ 基本语法
C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。
对象
- 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。类
- 类可以定义为描述对象行为/状态的模板/蓝图。方法
- 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。即时变量
- 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。
C++ 程序结构
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
// main() 是程序开始执行的地方
int main()
{
cout << "Hello World"; // 输出 Hello World
return 0;
}
#include <iostream> 头文件
- C++ 语言定义了一些
头文件
,这些头文件包含了程序中必需的或有用的信息 - 上面这段程序中,包含了头文件
<iostream>
。 - 较新的软件则会提示:
无法打开源文件"iostream.h"
。- 因为现在新的软件都是采用标准 C 格式,而 iostream.h 是 VC6.0 使用的风格,也就是标准 C 格式还未出台之前的风格。
- C++ 语言定义了一些
using namespace std
;- 告诉编译器使用
std
命名空间
。 - 有些名字容易冲突,所以会使用命名空间的方式进行区分,具体来说就是加个前缀。
- 如 C++ 标准库里面定义了
vector 容器
,自己也写了个vector 类
,这样名字就冲突了。 - 于是标准库里的名字都加上
std::
的前缀,必须用std::vector
来引用。 - 同理,自己的类也可以加个自定义的前缀。
- 如 C++ 标准库里面定义了
- 但是经常写全名会很繁琐,所以在没有冲突的情况下可以写一句
using namespace std;
,接下去的代码就可以不用写前缀直接写 vector 了。
- 告诉编译器使用
// main()
是程序开始执行的地方 是一个单行注释。单行注释以 // 开头,在行末结束。int main()
是主函数,程序从这里开始执行。cout << "Hello World";
会在屏幕上显示消息 “Hello World”。return 0
; 终止main( )函数
,并向调用进程返回值 0。
C++ 中的分号 & 语句块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 分号
// 语句结束符。每个语句必须以分号结束。表明一个逻辑实体的结束。
// 三个不同的语句:
x = y;
y = y+1;
add(x, y);
// 语句块
// 是一组使用大括号括起来的按逻辑连接的语句。
{
cout << "Hello World"; // 输出 Hello World
return 0;
}
// C++ 不以行末作为结束符的标识
// 因此可以在一行上放置多个语句。例如:
x = y;
y = y+1;
add(x, y);
// 等同于
x = y; y = y+1; add(x, y);
C++ 标识符
标识符
是用来标识变量、函数、类、模块,或任何其他用户自定义项目
的名称。
- 一个标识符以
字母 A-Z 或 a-z
或下划线 _
开始,后跟零个或多个字母、下划线和数字(0-9)
- 标识符内不允许出现标点字符,比如
@、& 和 %
。 - C++ 是区分大小写的编程语言。
- 在 C++ 中,
Manpower
和manpower
是两个不同的标识符。
- 在 C++ 中,
C/C++可使用 $
标识符:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// C/C++可使用 $ 标识符:
#include "stdio.h"
int main(){
int a$ = 0x99;
printf("%d\n", a$);
return 0;
}
// $ 可以放在前面:
#include "stdio.h"
int main(){
int $a=0x99;
printf("%d\n",$a);
return 0;
}
#include "stdio.h"
int main(){
int $8=0x99;
printf("%d\n", $8);
return 0;
}
main 前为什么加上数据类型 int main(){...}
- main 函数的返回值是返回给主调进程,使主调进程得知被调用程序的运行结果。
- 标准规范中规定 main 函数的返回值为 int,一般约定返回 0 值时代表程序运行无错误,其它值均为错误号,但该约定并非强制。
- 如果程序的运行结果不需要返回给主调进程,或程序开发人员确认该状态并不重要,比如所有出错信息均在程序中有明确提示的情况下,可以不写 main 函数的返回值。在一些检查不是很严格的编译器中,比如 VC, VS 等,void 类型的 main 是允许的。不过在一些检查严格的编译器下,比如 g++, 则要求 main 函数的返回值必须为 int 型。
- 在编程时,区分程序运行结果并以 int 型返回,是一个良好的编程习惯
int main()
和 int main(void)
区别?
int main(void)
指的是此函数的参数为空,不能传入参数,如果传入参数,就会出错。int main()
表示可以传入参数。
// - 这样是正确的
int main()
{
if (0) main(42);
}
// - 这样会出错
int main(void)
{
if (0) main(42);
}
- 在 C++ 中 int main() 和 int main(void) 是等效的,但在 C 中让括号空着代表编译器对是否接受参数保持沉默。
- 在 C 语言中 main() 省略返回类型也就相当说明返回类型为 int 型,不过这种用法在 C++ 中逐渐被淘汰。
- 虽然
void main()
在很多系统都适用,但他毕竟不是标准的,所以应该避免这种用法, 应该使用这种int main(void)
的写法比较妥当。
C++ 关键字
C++ 中的保留字不能作为常量名、变量名或其他标识符名称。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
asm else new this
auto enum operator throw
bool explicit private true
break export protected try
case extern public typedef
catch false register typeid
char float reinterpret_cast typename
class for return union
const friend short unsigned
const_cast goto signed using
continue if sizeof virtual
default inline static void
delete int static_cast volatile
do long struct wchar_t
double mutable switch while
dynamic_cast namespace template
三字符组
三字符组
- 用于表示另一个字符的三个字符序列,又称为
三字符序列
。 - 总是以两个问号开头。
- 不常见,但 C++ 标准允许把某些字符指定为三字符序列。
- 以前为了表示键盘上没有的字符,这是必不可少的一种方法。
- 可以出现在任何地方,包括字符串、字符序列、注释和预处理指令。
最常用的三字符序列:
三字符组 | 替换 |
---|---|
??= | # |
??/ | \ |
??’ | ^ |
??( | [ |
??) | ] |
??! | |
??< | { |
??> | } |
??- | ~ |
如果希望在源程序中有两个连续的问号,且不希望被预处理器替换,这种情况出现在字符常量、字符串字面值或者是程序注释中,
可选办法是用字符串的自动连接:
"...?""?..."
或者转义序列:"...?\?..."
。- 从Microsoft Visual C++ 2010版开始,该编译器默认不再自动替换三字符组。如果需要使用三字符组替换(如为了兼容古老的软件代码),需要设置编译器命令行选项/Zc:trigraphs
g++
仍默认支持三字符组,但会给出编译警告。
C++ 中的空格
只包含空格的行,被称为空白行
,可能带有注释,C++ 编译器会完全忽略它。
- 在 C++ 中,
空格
用于描述空白符、制表符、换行符和注释
。 空格
分隔语句的各个部分,让编译器能识别语句中的某个元素(比如 int)在哪里结束,下一个元素在哪里开始。
1
2
3
4
5
int age;
// int 和 age 之间必须至少有一个空格字符(一个空白符),这样编译器才能够区分它们。
fruit = Bigblueberrys + oranges;
// fruit 和 =,或者 = 和 Bigblueberrys 之间的空格字符不是必需的,但是为了增强可读性,可根据需要适当增加一些空格。
.
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.