本文提供了全面的C++11语法教程,涵盖了新特性和改进、基本语法、控制结构等多个方面,旨在帮助读者掌握C++11的新特性并提高编程效率。文章详细介绍了C++11中的新数据类型、范围for循环、智能指针、lambda表达式等重要特性,并提供了示例代码和环境配置指南。
C++11概述
C++11简介
C++11 是 C++ 语言的一个重要版本,于 2011 年正式发布。它引入了许多新的特性和改进,旨在简化代码编写、提高性能并增强语言的功能性。C++11 为现代 C++ 程序设计奠定了基础,并在后续版本中继续得到了扩展。
新特性和改进
C++11 引入了多项新特性,这些特性极大地增强了语言的功能和表达能力。以下是一些主要的新特性和改进:
-
新的数据类型和字面量:
- 添加了
long long
类型和long double
类型。 - 引入了二进制、八进制和十六进制浮点数字面量。
- 添加了
-
范围 for 循环:
- 使用
for (auto &element : container)
方式遍历容器。
- 使用
-
初始化器列表和统一初始化:
- 使用
{}
括号进行初始化。 - 支持成员变量的自动初始化。
- 使用
-
智能指针和垃圾回收:
- 引入了
std::unique_ptr
,std::shared_ptr
,std::weak_ptr
等智能指针。 - 示例代码:
std::unique_ptr<int> unique_ptr(new int(10)); // 使用 unique_ptr std::shared_ptr<int> shared_ptr(new int(10)); // 使用 shared_ptr std::weak_ptr<int> weak_ptr(shared_ptr); // 使用 weak_ptr
- 引入了
-
lambda 表达式:
- 允许在代码中定义匿名函数,简化了事件处理和回调函数的编写。
- 示例代码:
auto lambda = [](int a, int b) { return a + b; }; int result = lambda(3, 4); // result = 7
-
decltype 关键字:
- 提供了一种获取表达式类型的方法。
- 示例代码:
int a = 10; decltype(a) b = 20; // b 是 int 类型
-
右值引用和移动语义:
- 引入
&&
符号表示右值引用。 - 支持资源转移,减少不必要的拷贝操作。
- 示例代码:
std::string str("hello"); std::string move_str = std::move(str); // 移动 str 的资源
- 引入
-
类型推导 auto 关键字:
- 编译器可以根据初始化表达式自动推断变量类型。
- 示例代码:
auto num = 10; // num 是 int 类型 auto pi = 3.14; // pi 是 double 类型
-
强类型枚举和联合:
enum class
用于定义强类型枚举。union
支持结构化数据共享内存。- 示例代码:
enum class Color { Red, Green, Blue }; union U { int i; float f; };
-
模板的改进:
- 添加了
decltype
和auto
支持模板推导。 - 引入
constexpr
关键字,支持编译时常量表达式。
- 添加了
-
多重继承和虚继承:
- 支持多重继承和虚继承,增强了类的灵活性。
-
函数特化和模板元编程:
- 支持函数模板特化。
- 引入了
constexpr
用于模板元编程。
- 协变返回类型:
- 允许返回子类对象。
安装和环境配置
要开始使用 C++11,需要确保您的开发环境支持 C++11 标准。以下是一些常用的工具和配置方法:
-
安装编译器:
- Visual Studio:确保使用 Visual Studio 2015 或更高版本。
- GCC:确保安装了 4.8.0 或更高版本。
- Clang:确保安装了 3.3 或更高版本。
- 配置编译器:
- 在 Visual Studio 中,项目属性中设置“C++ 语言标准”为“C++11 (/std:c++11)”。
- 在命令行编译器(如 GCC 或 Clang)中,使用
-std=c++11
或-std=c++14
参数。
下面是一个简单的示例,展示如何在命令行中配置 GCC 编译器以支持 C++11:
g++ -std=c++11 main.cpp -o main
基本语法
变量和数据类型
C++ 中的变量是用来存储数据的容器。每个变量都有一个特定的数据类型,决定了可以存储的数据类型和大小。以下是一些常见的数据类型及其示例:
-
基本数据类型:
- 整型:
int
,short
,long
,long long
- 浮点型:
float
,double
,long double
- 布尔型:
bool
- 字符型:
char
- 整型:
- 自定义类型:
- 结构体(struct)
- 联合体(union)
- 枚举(enum)
示例代码:
int a = 10; // 整型变量
float b = 3.14; // 浮点型变量
char c = 'A'; // 字符型变量
bool d = true; // 布尔型变量
常量和字面量
常量是不可改变的变量,其值一旦初始化就不能再修改。字面量是直接写在代码中的数值。C++11 引入了一些新的字面量,使得代码更具可读性。
-
常量定义:
- 使用
const
关键字定义常量。
- 使用
- 字面量类型:
- 整型字面量:
10
,0x10
(十六进制) - 浮点型字面量:
3.14f
,3.14L
(长双精度) - 字符型字面量:
'A'
- 布尔型字面量:
true
,false
- 整型字面量:
示例代码:
const int MAX_SIZE = 100; // 常量整型
const double PI = 3.14159; // 常量浮点型
const char LETTER = 'A'; // 常量字符型
const bool IS_TRUE = true; // 常量布尔型
运算符和表达式
运算符是用于执行特定操作的符号。C++ 中的运算符可以分为以下几类:
- 算术运算符:
+
,-
,*
,/
,%
- 逻辑运算符:
&&
,||
,!
- 关系运算符:
==
,!=
,>
,<
,>=
,<=
- 位运算符:
&
,|
,^
,~
,<<
,>>
- 赋值运算符:
=
,+=
,-=
,*=
,/=
,%=
,&=
,|=
,^=
,<<=
,>>=
示例代码:
int a = 10;
int b = 5;
int sum = a + b; // 加法运算
int diff = a - b; // 减法运算
int prod = a * b; // 乘法运算
int quot = a / b; // 除法运算
int mod = a % b; // 求余运算
bool isGreater = a > b; // 关系运算
控制结构
条件语句(if, switch)
条件语句用于根据条件来执行不同的代码块。C++ 中主要有 if
和 switch
两种条件结构。
-
if 语句:
- 基本形式:
if (condition) { ... }
- 带 else 的形式:
if (condition) { ... } else { ... }
- 带 else if 的形式:
if (condition1) { ... } else if (condition2) { ... } else { ... }
- 基本形式:
- switch 语句:
- 基本形式:
switch (expression) { case value1: ... break; case value2: ... break; default: ... }
- 基本形式:
示例代码:
int num = 10;
if (num > 5) {
std::cout << "num is greater than 5";
} else {
std::cout << "num is less than or equal to 5";
}
char letter = 'A';
switch (letter) {
case 'A':
std::cout << "Letter is A";
break;
case 'B':
std::cout << "Letter is B";
break;
default:
std::cout << "Letter is not A or B";
}
循环语句(for, while, do-while)
循环语句用于重复执行一段代码,直到满足某个条件为止。C++ 中主要有三种循环结构:for
、while
和 do-while
。
-
for 循环:
- 基本形式:
for (init; condition; increment) { ... }
- 基本形式:
-
while 循环:
- 基本形式:
while (condition) { ... }
- 基本形式:
- do-while 循环:
- 基本形式:
do { ... } while (condition);
- 基本形式:
示例代码:
for (int i = 0; i < 5; i++) {
std::cout << i << " ";
}
std::cout << std::endl;
int j = 0;
while (j < 5) {
std::cout << j << " ";
j++;
}
std::cout << std::endl;
int k = 0;
do {
std::cout << k << " ";
k++;
} while (k < 5);
std::cout << std::endl;
跳转语句(break, continue, goto)
跳转语句用于控制循环和条件分支的流程。C++ 中主要有 break
、continue
和 goto
三种跳转语句。
-
break:
- 用于提前结束循环或 switch 语句。
-
continue:
- 用于跳过当前循环中的剩余代码并进入下一次循环。
- goto:
- 用于无条件跳转到程序中的标签处。
示例代码:
for (int i = 0; i < 10; i++) {
if (i == 5) {
break;
}
std::cout << i << " ";
}
std::cout << std::endl;
for (int j = 0; j < 10; j++) {
if (j % 2 == 0) {
continue;
}
std::cout << j << " ";
}
std::cout << std::endl;
int k = 0;
label:
std::cout << k << " ";
k++;
if (k < 5) {
goto label;
}
std::cout << std::endl;
函数
函数定义和调用
函数是执行特定任务的代码块,函数定义包括函数名、参数列表和返回类型。函数调用则用于执行函数中的代码。
-
函数定义:
- 基本形式:
return_type function_name(parameters) { ... }
- 基本形式:
- 函数调用:
- 基本形式:
function_name(args)
- 基本形式:
示例代码:
int add(int a, int b) {
return a + b;
}
int result = add(3, 4); // result = 7
std::cout << "Result: " << result << std::endl;
参数传递
C++ 支持多种参数传递方式,包括值传递和引用传递。
-
值传递:
- 参数值被复制到函数内部。
-
示例代码:
void printValue(int value) { std::cout << "Value: " << value << std::endl; } int num = 10; printValue(num); // 输出 "Value: 10"
-
引用传递:
- 参数值在函数内部直接引用。
-
示例代码:
void printReference(int &ref) { std::cout << "Reference: " << ref << std::endl; } int num = 10; printReference(num); // 输出 "Reference: 10"
返回值类型
函数可以返回指定类型的值,返回类型决定了函数的输出。
示例代码:
int getNumber() {
return 10;
}
int result = getNumber(); // result = 10
std::cout << "Result: " << result << std::endl;
递归函数
递归函数是一种函数,它在执行过程中调用自身。递归函数通常用于解决可以分解为相同类型子问题的问题。
示例代码:
int factorial(int n) {
if (n == 0) {
return 1;
}
return n * factorial(n - 1);
}
int result = factorial(5); // result = 120
std::cout << "Factorial: " << result << std::endl;
标准库简介
STL容器(vector, list, map)
C++ 标准模板库(STL)提供了多种容器,用于存储和管理数据。以下是一些常用的容器:
-
vector
- 动态数组。
- 示例代码:
std::vector<int> vec = {1, 2, 3, 4, 5}; for (int i : vec) { std::cout << i << " "; } std::cout << std::endl;
-
list
- 双向链表。
- 示例代码:
std::list<int> list = {1, 2, 3, 4, 5}; for (int i : list) { std::cout << i << " "; } std::cout << std::endl;
- map
- 关联容器,基于键值对。
- 示例代码:
std::map<int, std::string> map = {{1, "one"}, {2, "two"}, {3, "three"}}; for (const auto &pair : map) { std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl; }
常用算法(sort, find, copy)
STL 提供了许多算法,用于处理和操作容器中的数据。
-
sort
- 对容器中的元素进行排序。
- 示例代码:
std::vector<int> vec = {5, 3, 1, 2, 4}; std::sort(vec.begin(), vec.end()); for (int i : vec) { std::cout << i << " "; } std::cout << std::endl;
-
find
- 在容器中查找特定元素。
- 示例代码:
std::vector<int> vec = {5, 3, 1, 2, 4}; auto it = std::find(vec.begin(), vec.end(), 3); if (it != vec.end()) { std::cout << "Found element: " << *it << std::endl; }
- copy
- 将容器中的元素复制到另一个容器。
- 示例代码:
std::vector<int> vec = {1, 2, 3, 4, 5}; std::vector<int> copyVec; copyVec.resize(vec.size()); std::copy(vec.begin(), vec.end(), copyVec.begin()); for (int i : copyVec) { std::cout << i << " "; } std::cout << std::endl;
字符串处理和输入输出流
C++ 标准库提供了强大的字符串处理和输入输出操作功能。
-
字符串处理
- 使用
std::string
类。 - 示例代码:
std::string str = "Hello, World!"; std::cout << str << std::endl;
- 使用
- 输入输出流
- 使用
std::cin
和std::cout
进行输入输出操作。 - 示例代码:
int num; std::cout << "Enter a number: "; std::cin >> num; std::cout << "You entered: " << num << std::endl;
- 使用