Post

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) 编译

  1. 设置文件 main.c++,
1
2
3
4
5
6
#include <iostream>
int main()
{
    std::cout << "Hello World!\n";
    return 0;
}
  1. Debug -> Start Without Debugging (或按下 ctrl + F5) :
  2. 完成以上操作后,你可以看到以下输出

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 进行代码优化。
-oFILE 生成指定的输出文件。用在生成可执行文件时。
-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 格式还未出台之前的风格。
  • using namespace std;
    • 告诉编译器使用 std 命名空间
    • 有些名字容易冲突,所以会使用命名空间的方式进行区分,具体来说就是加个前缀。
      • 如 C++ 标准库里面定义了 vector 容器,自己也写了个 vector 类,这样名字就冲突了。
      • 于是标准库里的名字都加上 std:: 的前缀,必须用 std::vector 来引用。
      • 同理,自己的类也可以加个自定义的前缀。
    • 但是经常写全名会很繁琐,所以在没有冲突的情况下可以写一句 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++ 中,Manpowermanpower 是两个不同的标识符。

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.