Lazy loaded image
C++ 基础语法
字数 5787阅读时长 15 分钟
2025-11-29
2025-12-2
password
comment
type
status
date
slug
summary
tags
category
icon

C++ 基础语法

C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。接下来,让我们简要了解一下类、对象、方法和实例变量的概念。
  • 对象 — 对象具有状态和行为。例如:一只狗的状态包括颜色、名称、品种,行为包括摇尾巴、叫唤、吃东西。对象是类的实例。
  • 类 — 类可以定义为描述对象行为和状态的模板或蓝图。
  • 方法 — 方法表示一种行为。一个类可以包含多个方法,用于编写逻辑、操作数据和执行各种动作。
  • 实例变量 — 每个对象都有其独特的实例变量。对象的状态由这些实例变量的值决定。

C++ 程序结构

让我们看一段简单的 C++ 代码,可以输出单词Hello World
接下来,我们来了解一下上面这段程序:
  • C++ 语言定义了一些头文件,这些头文件包含了程序中必需的或有用的信息。上面这段程序中,包含了头文件 <iostream>
  • 下一行 using namespace std; 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。
  • 下一行 // main() 是程序开始执行的地方 是一个单行注释。单行注释以 // 开头,在行末结束。
  • 下一行 int main() 是主函数,程序从这里开始执行。
  • 下一行 cout << "Hello World"; 会在屏幕上显示消息 "Hello World"
  • 下一行 return 0; 终止 main() 函数,并向调用进程返回值 0

编译与执行 C++ 程序

接下来,让我们共同了解如何把源代码保存在一个文件中,以及如何编译并运行它。下面是简单的步骤:
  • 打开一个文本编辑器,添加上述代码。
  • 保存文件为 hello.cpp。
  • 打开命令提示符,进入到保存文件所在的目录。
  • 键入 'g++ hello.cpp',键入回车,编译代码。如果代码中没有错误,命令提示符会跳到下一行,并生成 a.out 可执行文件。
  • 现在,键入 ' a.out' 来运行程序。
  • 我们可以看到屏幕上显示 ' Hello World '。
请确保路径中已包含 g++ 编译器,并确保在包含源文件 hello.cpp 的目录中运行它。
我们也可以使用 makefile 等其他编译器来编译 C/C++ 程序。

C++ 中的分号与语句块

在 C++ 中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。
例如,下面是三个不同的语句:
语句块是一组使用大括号括起来的按逻辑连接的语句。例如:
C++ 不以行末作为结束符的标识,因此,我们可以在一行上放置多个语句。例如:
以上代码等同于:

C++ 中的标识符

C++ 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母 A-Za-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
C++ 标识符内不允许出现标点字符,比如 @&%。C++ 是区分大小写的编程语言。因此,在 C++ 中,Manpower 和 manpower 是两个不同的标识符。
下面列出几个有效的标识符:

C++ 中的保留字(关键字)

下表列出了 C++ 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。
保留字1(a-e)
保留字2(e-n)
保留字3(n-t)
保留字4(t-w)
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
 
下面,我们对所有保留字进行详细介绍。
注:以下内容选自CSDN
1. asm
asm (指令字符串):允许在 C++ 程序中嵌入汇编代码。
2. auto
auto(自动,automatic)是存储类型标识符,表明变量"自动"具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。
3. bool
bool(布尔)类型,C++ 中的基本数据结构,其值可选为 true(真)或者 false(假)。C++ 中的 bool 类型可以和 int 混用,具体来说就是 0 代表 false,非 0 代表 truebool 类型常用于条件判断和函数返回值。
4. break
break(中断、跳出),用在 switch 语句或者循环语句中。程序遇到 break 后,即跳过该程序段,继续后面的语句执行。
5. case
用于 switch 语句中,用于判断不同的条件类型。
6. catch
catchtry 语句一起用于异常处理。
7. char
char(字符,character)类型,C++ 中的基本数据结构,其值一般为 0~255 的 int。这 256 个字符对应着 256 个 ASCII 码。char 类型的数据需要用单引号 ' 括起来。
8.class
class(类)是 C++ 面向对象设计的基础。使用 class 关键字声明一个类。
9. const
const(常量的,constant)所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非 const 函数。在函数的声明与定义时都要加上 const,放在函数参数列表的最后一个括号后。在 C++ 中,用 const 声明一个变量,意味着该变量就是一个带类型的常量,可以代替 #define,且比 #define 多一个类型信息,且它执行内链接,可放在头文件中声明;但在C语言中,其声明则必须放在源文件(即 .C 文件)中,在C语言中 const 声明一个变量,除了不能改变其值外,它仍是一具变量。如:
10. const_cast
用法:
该运算符用来修改类型的 constvolatile 属性。除了 constvolatile 修饰之外, type_idexpression 的类型是一样的。常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
11. continue
continue(继续)关键字用于循环结构。它使程序跳过代码段后部的部分,与 break 不同的是,continue 不是进入代码段后的部分执行,而是重新开始新的循环。因而它是"继续循环"之意,不是 break(跳出)。
12. default
default(默认、缺省)用于 switch 语句。当 switch 所有的 case 都不满足时,将进入 default 执行。default 只能放在 switch 语句所有的 case 之后,并且是可选的。
13. delete
delete(删除)释放程序动态申请的内存空间。delete 后面通常是一个指针或者数组 [],并且只能 delete 通过 new 关键字申请的指针,否则会发生段错误。
14. do
do-while是一类循环结构。与while循环不同,do-while循环保证至少要进入循环体一次。
15. double
double(双精度)类型,C++ 中的基本数据结构,以双精度形式存储一个浮点数。
16. dynamic_cast
dynamic_cast(动态转换),允许在运行时刻进行类型转换,从而使程序能够在一个类层次结构安全地转换类型。dynamic_cast 提供了两种转换方式,把基类指针转换成派生类指针,或者把指向基类的左值转换成派生类的引用。
17. else
else 紧跟在 if 后面,用于对 if 不成立的情况的选择。
18. enum
enum(枚举)类型,给出一系列固定的值,只能在这里面进行选择一个。
19. explicit
explicit(显式的)的作用是"禁止单参数构造函数"被用于自动型别转换,其中比较典型的例子就是容器类型。在这种类型的构造函数中你可以将初始长度作为参数传递给构造函数。
20. export
为了访问其他编译单元(如另一代码文件)中的变量或对象,对普通类型(包括基本数据类、结构和类),可以利用关键字 extern,来使用这些变量或对象时;但是对模板类型,则必须在定义这些模板类对象和模板函数时,使用标准 C++ 新增加的关键字 export(导出)。
21. extern
extern(外部的)声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。在文件内声明一个变量或函数默认为可被外部使用。在 C++ 中,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。目前仅支持C转换标记,来支持C语言编译器链接。使用这种情况有两种形式:
22. false
false(假的),C++ 的基本数据结构 bool 类型的值之一。等同于 int0 值。
23. float
float(浮点数),C++ 中的基本数据结构,精度小于 double
24. for
for 是 C++ 中的循环结构之一。
25. friend
friend(友元)声明友元关系。友元可以访问与其有 friend 关系的类中的 private/protected 成员,通过友元直接访问类中的 private/protected 成员的主要目的是提高效率。友元包括友元函数和友元类。
26. goto
goto(转到),用于无条件跳转到某一标号处开始执行。
27. if
if(如果),C++ 中的条件语句之一,可以根据后面的 bool 类型的值选择进入一个分支执行。
28. inline
inline(内联)函数的定义将在编译时在调用处展开。inline 函数一般由短小的语句组成,可以提高程序效率。
29. int
int(整型,integer),C++ 中的基本数据结构,用于表示整数,精度小于 long
30. long
long(长整型,long integer),C++ 中的基本数据结构,用于表示长整数。
31. mutable
mutable(易变的)是 C++ 中一个不常用的关键字。只能用于类的非静态和非常量数据成员。由于一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化。如果一个类的成员函数被声明为 const 类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员。但是有些时候需要在该类函数中对类的数据成员进行赋值,这个时候就需要用到 mutable 关键字。
32. namespace
namespace(命名空间)用于在逻辑上组织类,是一种比类大的结构。
33. new
new(新建)用于新建一个对象。new 运算符总是返回一个指针。由 new 创建
34. operator
operator(操作符)用于操作符重载。这是 C++ 中的一种特殊的函数。
35. private
private(私有的),C++ 中的访问控制符。被标明为 private 的字段只能在本类以及友元中访问。
36. protected
protected(受保护的),C++ 中的访问控制符。被标明为 protected 的字段只能在本类以及其继承类和友元中访问。
37. public
public(公有的),C++ 中的访问控制符。被标明为 public 的字段可以在任何类
38.register
register(寄存器)声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器中;但对 32 位编译器不起作用,当 global optimizations(全局优化)开的时候,它会做出选择是否放在自己的寄存器中;不过其它与 register 关键字有关的其它符号都对32位编译器有效。
39. reinterpret_cast
用法:
type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
40. return
return(返回)用于在函数中返回值。程序在执行到 return 语句后立即返回,return 后面的语句无法执行到。
41. short
short(短整型,short integer),C++ 中的基本数据结构,用于表示整数,精度小于 int
42. signed
signed(有符号),表明该类型是有符号数,和 unsigned 相反。数字类型(整型和浮点型)都可以用 signed 修饰。但默认就是 signed,所以一般不会显式使用。
43. sizeof
由于 C++ 每种类型的大小都是由编译器自行决定的,为了增加可移植性,可以用 sizeof 运算符获得该数据类型占用的字节数。
44. static
static(静态的)静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为 0,使用时可改变其值。静态变量或静态函数,只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。因此也称为"文件作用域"。在 C++ 类的成员变量被声明为 static(称为静态成员变量),意味着它被该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。类的静态成员变量必须在声明它的文件范围内进行初始化才能使用,private 类型的也不例外。
45. static_cast
用法:
该运算符把 expression 转换为 type-id 类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
  • ① 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
  • ② 用于基本数据类型之间的转换,如把 int 转换成 char,把 int 转换成 enum。这种转换的安全性也要开发人员来保证。
  • ③ 把空指针转换成目标类型的空指针。
  • ④ 把任何类型的表达式转换成void类?
注意 static_cast 不能转换掉 expressionconstvolitale或者 __unaligned 属性。
46. struct
struct(结构)类型,类似于 class 关键字,与C语言兼容(class 关键字是不与C语言兼容的),可以实现面向对象程序设计。
47. switch
switch(转换)类似于 if-else-if 语句,是一种多分枝语句。它提供了一种简洁的书写,并且能够生成效率更好的代码。但是,switch 后面的判断只能是 intchar 也可以,但 char 本质上也是一种 int 类型)。switch 语句最后的 default 分支是可选的。
48. template
template(模板),C++ 中泛型机制的实现。
49. this
this 返回调用者本身的指针。
50. throw
throw(抛出)用于实现 C++ 的异常处理机制,可以通过 throw 关键字"抛出"一个异常。
51. true
true(真的),C++ 的基本数据结构 bool 类型的值之一。等同于 int 的非 0 值。
52. try
try(尝试)用于实现 C++ 的异常处理机制。可以在 try 中调用可能抛出异常的函数,然后在 try 后面的 catch 中捕获并进行处理。
53. typedef
typedef(类型定义,type define),其格式为:
类型说明定义了一个数据类型的新名字而不是定义一种新的数据类型。定义名表示这个类型的新名字。
54. typeid
指出指针或引用指向的对象的实际派生类型。
55. typename
typename(类型名字)关键字告诉编译器把一个特殊的名字解释成一个类型。在下列情况下必须对一个 name 使用 typename 关键字:
  • 1. 一个唯一的name(可以作为类型理解),它嵌套在另一个类型中的。
  • 2. 依赖于一个模板参数,也就是说:模板参数在某种程度上包含这个name。当模板参数使编译器在指认一个类型时产生了误解。
56. union
union(联合),类似于 enum。不同的是 enum 实质上是 int 类型的,而 union 可以用于所有类型,并且其占用空间是随着实际类型大小变化的。
57. unsigned
unsigned(无符号),表明该类型是无符号数,和 signed 相反。
58. using
表明使用 namespace
59. virtual
virtual(虚的),C++ 中用来实现多态机制。
60. void
void(空的),可以作为函数返回值,表明不返回任何数据;可以作为参数,表明没有参数传入(C++中不是必须的);可以作为指针使用。
61. volatile
volatile(不稳定的)限定一个对象可被外部进程(操作系统、硬件或并发线程等)改变,声明时的语法如下:
这样的声明是不能达到最高效的,因为它们的值随时会改变,系统在需要时会经常读写这个对象的值。因此常用于像中断处理程序之类的异步进程进行内存单元访问。
62. wchar_t
wchar_t 是宽字符类型,每个 wchar_t 类型占 2 个字节,16 位宽。汉字的表示就要用到 wchar_t

三字符组

三字符组就是用于表示另一个字符的三个字符序列,又称为三字符序列。三字符序列总是以两个问号开头。
三字符序列不太常见,但 C++ 标准允许把某些字符指定为三字符序列。以前为了表示键盘上没有的字符,这是必不可少的一种方法。
三字符序列可以出现在任何地方,包括字符串、字符序列、注释和预处理指令。
下面列出了最常用的三字符序列:
三字符组
替换
??=
#
??/
\
??'
^
??(
[
??)
]
??!
|
??<
{
??>
}
??-
~
如果希望在源程序中有两个连续的问号,且不希望被预处理器替换,这种情况出现在字符常量、字符串字面值或者是程序注释中,可选办法是用字符串的自动连接:"...?""?..."或者转义序列:"...?\?..."
从Microsoft Visual C++ 2010版开始,该编译器默认不再自动替换三字符组。如果需要使用三字符组替换(如为了兼容古老的软件代码),需要设置编译器命令行选项/Zc:trigraphs
g++ 仍默认支持三字符组,但会给出编译警告。

C++ 中的空格

只包含空格的行,被称为空白行,可能带有注释,C++ 编译器会完全忽略它。
在 C++ 中,空格用于描述空白符、制表符、换行符和注释。空格分隔语句的各个部分,让编译器能识别语句中的某个元素(比如 int)在哪里结束,下一个元素在哪里开始。因此,在下面的语句中:
在这里,intage 之间必须至少有一个空格字符(通常是一个空白符),这样编译器才能够区分它们。另一方面,在下面的语句中:
fruit=,或者 =apples 之间的空格字符不是必需的,但是为了增强可读性,我们可以根据需要适当增加一些空格。
上一篇
《工程基础》授课教师名单
下一篇
C++ 中的注释

评论
Loading...