本文深入介绍了C++11的基础语法,包括数据类型、变量声明、常量与字面量、运算符和表达式等,并通过控制流程语句、函数与模板、类与对象的详细讲解,进一步阐述了C++11的特性。文章还通过实战项目展示了如何应用C++11语法项目实战开发简单应用程序,涵盖图书管理系统的实现与优化。
C++11基础语法介绍
数据类型与变量声明
在C++中,变量是用来存储数据的容器,每个变量都有特定的数据类型,如整型、浮点型、布尔型等。C++11引入了一些新的数据类型和语法特性,使得变量声明更加简洁和灵活。
基本数据类型:
int
:整数类型double
:双精度浮点数类型float
:单精度浮点数类型char
:字符类型bool
:布尔类型,取值为true
或false
示例代码:
#include <iostream>
int main() {
int a = 10; // 整型变量
double b = 3.14; // 双精度浮点数
float c = 2.71f; // 单精度浮点数
char d = 'A'; // 字符变量
bool e = true; // 布尔变量
std::cout << "整型变量 a 的值为: " << a << std::endl;
std::cout << "双精度浮点数 b 的值为: " << b << std::endl;
std::cout << "单精度浮点数 c 的值为: " << c << std::endl;
std::cout << "字符变量 d 的值为: " << d << std::endl;
std::cout << "布尔变量 e 的值为: " << e << std::endl;
return 0;
}
C++11新特性:
long long
:长整型unsigned
:无符号整型
示例代码:
#include <iostream>
int main() {
long long f = 9223372036854775807LL; // 长整型变量
unsigned g = 42u; // 无符号整型变量
std::cout << "长整型变量 f 的值为: " << f << std::endl;
std::cout << "无符号整型变量 g 的值为: " << g << std::endl;
return 0;
}
常量与字面量
常量是指值在程序运行过程中不可改变的变量。在C++中,使用const
关键字来声明常量。字面量是直接写在代码中的常量值。
示例代码:
#include <iostream>
int main() {
const int PI = 3.14159; // 常量
const double MAX_VALUE = 1.79769e+308; // 双精度浮点常量
std::cout << "常量 PI 的值为: " << PI << std::endl;
std::cout << "常量 MAX_VALUE 的值为: " << MAX_VALUE << std::endl;
return 0;
}
C++11新特性:
constexpr
:允许在编译时常量表达式上进行计算- 指定类型字面量(如
10u
表示无符号整数)
示例代码:
#include <iostream>
int main() {
constexpr int X = 10; // constexpr常量
constexpr double Y = 3.14; // constexpr常量
std::cout << "constexpr常量 X 的值为: " << X << std::endl;
std::cout << "constexpr常量 Y 的值为: " << Y << std::endl;
return 0;
}
运算符与表达式
在C++中,运算符用于执行各种操作,如算术运算、逻辑运算、位运算等。C++11引入了一些新的运算符和表达式。
常见运算符:
- 算术运算符:
+
,-
,*
,/
,%
- 赋值运算符:
=
,+=
,-=
,*=
,/=
,%=
等 - 逻辑运算符:
&&
,||
,!
- 比较运算符:
==
,!=
,>
,<
,>=
,<=
示例代码:
#include <iostream>
int main() {
int a = 10;
int b = 5;
std::cout << "a + b 的结果为: " << (a + b) << std::endl;
std::cout << "a - b 的结果为: " << (a - b) << std::endl;
std::cout << "a * b 的结果为: " << (a * b) << std::endl;
std::cout << "a / b 的结果为: " << (a / b) << std::endl;
std::cout << "a % b 的结果为: " << (a % b) << std::endl;
a += 5; // 等价于 a = a + 5
std::cout << "a += 5 的结果为: " << a << std::endl;
return 0;
}
C++11新特性:
- 常量表达式运算符:
nullptr
- 引入了
auto
关键字,可以自动推断变量类型
示例代码:
#include <iostream>
int main() {
int a = 10;
int b = 5;
auto c = a + b; // 使用auto关键字自动推断类型
std::cout << "常量表达式运算符 nullptr 的值为: " << (nullptr) << std::endl;
std::cout << "自动推断的变量 c 的类型为: " << typeid(c).name() << std::endl;
std::cout << "自动推断的变量 c 的值为: " << c << std::endl;
return 0;
}
控制流程语句
条件语句(if, switch)
条件语句在C++中用于根据某个条件的结果来执行不同的代码块。常见的条件语句包括if
和switch
。
if语句:
#include <iostream>
int main() {
int a = 10;
if (a > 5) {
std::cout << "a > 5 的条件成立" << std::endl;
} else {
std::cout << "a <= 5 的条件成立" << std::endl;
}
return 0;
}
else if语句:
#include <iostream>
int main() {
int a = 10;
if (a > 15) {
std::cout << "a > 15 的条件成立" << std::endl;
} else if (a > 10) {
std::cout << "10 < a <= 15 的条件成立" << std::endl;
} else {
std::cout << "a <= 10 的条件成立" << std::endl;
}
return 0;
}
switch语句:
#include <iostream>
int main() {
int a = 1;
switch (a) {
case 1:
std::cout << "a 的值为 1" << std::endl;
break;
case 2:
std::cout << "a 的值为 2" << std::endl;
break;
default:
std::cout << "a 的值不在 1 和 2 之间" << std::endl;
}
return 0;
}
循环语句(for, while, do-while)
循环语句用于重复执行一段代码,直到满足某个条件为止。常见的循环语句包括for
、while
和do-while
。
for循环:
#include <iostream>
int main() {
for (int i = 0; i < 5; i++) {
std::cout << "i 的当前值为: " << i << std::endl;
}
return 0;
}
while循环:
#include <iostream>
int main() {
int i = 0;
while (i < 5) {
std::cout << "i 的当前值为: " << i << std::endl;
i++;
}
return 0;
}
do-while循环:
#include <iostream>
int main() {
int i = 0;
do {
std::cout << "i 的当前值为: " << i << std::endl;
i++;
} while (i < 5);
return 0;
}
函数与函数模板
函数定义与调用
函数是C++中可重用的一段代码,它接受参数,并返回一个值。使用void
关键字表示函数不返回任何值。
函数定义:
#include <iostream>
void printMessage() {
std::cout << "Hello, World!" << std::endl;
}
int main() {
printMessage(); // 调用函数
return 0;
}
带有参数的函数:
#include <iostream>
void printValue(int value) {
std::cout << "参数的值为: " << value << std::endl;
}
int main() {
printValue(10); // 调用函数,传递参数
return 0;
}
带返回值的函数:
#include <iostream>
int add(int a, int b) {
return a + b;
}
int main() {
int result = add(5, 3); // 调用函数,获取返回值
std::cout << "5 + 3 的结果为: " << result << std::endl;
return 0;
}
函数参数与返回值
函数参数是可以传递给函数的输入值,函数返回值是函数执行后返回的结果。可以指定参数的类型和返回值类型。
多个参数:
#include <iostream>
int multiply(int a, int b) {
return a * b;
}
int main() {
int result = multiply(5, 3); // 调用函数,传递多个参数
std::cout << "5 * 3 的结果为: " << result << std::endl;
return 0;
}
默认参数:
#include <iostream>
int add(int a, int b = 5) {
return a + b;
}
int main() {
int result1 = add(10); // 使用默认参数
int result2 = add(10, 20); // 使用指定参数
std::cout << "10 + 5 的结果为: " << result1 << std::endl;
std::cout << "10 + 20 的结果为: " << result2 << std::endl;
return 0;
}
函数重载与内联函数
函数重载是指具有相同名字但参数列表不同的多个函数。内联函数是为了提高函数的执行效率,建议在小型函数中使用。
函数重载:
#include <iostream>
void printMessage() {
std::cout << "Hello, World!" << std::endl;
}
void printMessage(int value) {
std::cout << "参数的值为: " << value << std::endl;
}
int main() {
printMessage(); // 调用无参版本
printMessage(10); // 调用带参数版本
return 0;
}
内联函数:
#include <iostream>
inline int add(int a, int b) {
return a + b;
}
int main() {
int result = add(5, 3); // 调用内联函数
std::cout << "5 + 3 的结果为: " << result << std::endl;
return 0;
}
函数模板与泛型编程
函数模板允许编写可以在多种数据类型上工作的通用函数。通过模板参数可以指定数据类型。
示例代码:
#include <iostream>
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
int resultInt = add(5, 3); // 整型参数
double resultDouble = add(5.5, 3.5); // 浮点型参数
std::cout << "5 + 3 的结果为: " << resultInt << std::endl;
std::cout << "5.5 + 3.5 的结果为: " << resultDouble << std::endl;
return 0;
}
类与对象
类的定义与实例化
类是面向对象编程的基础,用于封装数据和操作数据的函数。类的实例化是使用类来创建对象的过程。
类定义:
#include <iostream>
class Point {
public:
int x, y;
Point(int x, int y) : x(x), y(y) {}
void print() {
std::cout << "Point 的坐标为: (" << x << ", " << y << ")" << std::endl;
}
};
int main() {
Point p(10, 20); // 实例化 Point 类
p.print(); // 调用成员函数
return 0;
}
成员变量与成员函数
类中的成员变量用于存储数据,成员函数用于操作这些数据。通过类的实例来访问这些成员变量和成员函数。
成员变量和成员函数:
#include <iostream>
class Rectangle {
public:
int width, height;
Rectangle(int w, int h) : width(w), height(h) {}
int area() {
return width * height;
}
};
int main() {
Rectangle r(10, 5); // 实例化 Rectangle 类
std::cout << "矩形的面积为: " << r.area() << std::endl;
return 0;
}
构造函数与析构函数
构造函数在类对象创建时被调用,用于初始化对象的状态。析构函数在对象销毁时被调用,用于执行清理工作。
构造函数:
#include <iostream>
class Person {
public:
std::string name;
int age;
Person(std::string n, int a) : name(n), age(a) {}
void print() {
std::cout << "姓名: " << name << ", 年龄: " << age << std::endl;
}
};
int main() {
Person p("Alice", 25); // 调用构造函数
p.print();
return 0;
}
析构函数:
#include <iostream>
class Person {
public:
std::string name;
int age;
Person(std::string n, int a) : name(n), age(a) {}
~Person() {
std::cout << "析构函数被调用,销毁对象" << std::endl;
}
void print() {
std::cout << "姓名: " << name << ", 年龄: " << age << std::endl;
}
};
int main() {
{
Person p("Alice", 25); // 调用构造函数
p.print();
} // 析构函数在这里被调用
return 0;
}
静态成员与友元函数
静态成员是属于类而不是类的实例的数据成员,可以在不创建类的实例的情况下访问。友元函数可以在类外部访问类的私有成员。
静态成员:
#include <iostream>
class Counter {
public:
static int count;
Counter() {
count++;
}
~Counter() {
count--;
}
};
int Counter::count = 0; // 初始化静态成员
int main() {
Counter a, b, c;
std::cout << "当前对象数量: " << Counter::count << std::endl;
return 0;
}
友元函数:
#include <iostream>
class Rectangle {
public:
int width, height;
Rectangle(int w, int h) : width(w), height(h) {}
friend int area(Rectangle& r); // 声明友元函数
private:
int perimeter() {
return 2 * (width + height);
}
};
int area(Rectangle& r) {
return r.width * r.height;
}
int main() {
Rectangle r(10, 5);
std::cout << "矩形的面积为: " << area(r) << std::endl;
std::cout << "矩形的周长为: " << r.perimeter() << std::endl;
return 0;
}
C++11新特性应用
自动类型推断(auto关键字)
auto
关键字可以自动推断变量的类型,简化变量声明的过程。
示例代码:
#include <iostream>
int main() {
int a = 10;
auto b = a; // auto关键字自动推断类型
std::cout << "变量 b 的类型为: " << typeid(b).name() << std::endl;
std::cout << "变量 b 的值为: " << b << std::endl;
double c = 3.14;
auto d = c;
std::cout << "变量 d 的类型为: " << typeid(d).name() << std::endl;
std::cout << "变量 d 的值为: " << d << std::endl;
constexpr int X = 10; // constexpr常量
constexpr double Y = 3.14; // constexpr常量
std::cout << "constexpr常量 X 的值为: " << X << std::endl;
std::cout << "constexpr常量 Y 的值为: " << Y << std::endl;
return 0;
}
范围for循环
范围for循环用于遍历容器中的元素,简化了遍历操作。
示例代码:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (auto num : numbers) {
std::cout << "当前值: " << num << std::endl;
}
return 0;
}
智能指针(unique_ptr, shared_ptr)
智能指针用于自动管理内存,避免内存泄漏。unique_ptr
和shared_ptr
是两种常见的智能指针类型。
unique_ptr:
#include <iostream>
#include <memory>
int main() {
std::unique_ptr<int> p1 = std::make_unique<int>(10); // 创建 unique_ptr
std::cout << "p1 的值为: " << *p1 << std::endl;
// 无法复制 unique_ptr
// std::unique_ptr<int> p2 = p1;
// 无法赋值 unique_ptr
// *p1 = 20;
return 0;
}
shared_ptr:
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> p1 = std::make_shared<int>(10); // 创建 shared_ptr
std::cout << "p1 的值为: " << *p1 << std::endl;
std::shared_ptr<int> p2 = p1; // 复制 shared_ptr
std::cout << "p2 的值为: " << *p2 << std::endl;
p1.reset(); // 释放资源
// std::cout << "p1 的值为: " << *p1 << std::endl; // 会导致运行时错误
return 0;
}
实战项目:使用C++11完成简单应用
项目需求分析
假设我们需要开发一个简单的图书管理系统,可以进行图书的添加、删除、查询等操作。图书的基本信息包括书名、作者、出版年份等。
具体需求:
- 用户可以添加新书到系统中。
- 用户可以删除已存在的书。
- 用户可以根据书名查询书籍信息。
- 提供基本的界面展示和交互。
设计与实现
我们可以设计一个Book
类来表示图书,并设计一个BookManager
类来管理图书的添加、删除和查询操作。
Book 类定义:
#include <string>
class Book {
public:
std::string title;
std::string author;
int publicationYear;
Book(std::string t, std::string a, int y) : title(t), author(a), publicationYear(y) {}
void print() {
std::cout << "书名: " << title << ", 作者: " << author << ", 出版年份: " << publicationYear << std::endl;
}
};
BookManager 类定义:
#include <vector>
#include <iostream>
#include <string>
class BookManager {
public:
void addBook(const Book& book) {
books.push_back(book);
}
void removeBook(const std::string& title) {
for (auto it = books.begin(); it != books.end(); ++it) {
if (it->title == title) {
books.erase(it);
return;
}
}
std::cout << "未找到书名: " << title << std::endl;
}
void searchBook(const std::string& title) {
bool found = false;
for (const auto& book : books) {
if (book.title == title) {
book.print();
found = true;
}
}
if (!found) {
std::cout << "未找到书名: " << title << std::endl;
}
}
private:
std::vector<Book> books;
};
主程序:
#include <iostream>
#include <string>
#include "BookManager.h"
int main() {
BookManager manager;
Book book1("C++ Primer", "Stanley B. Lippman", 2012);
Book book2("Effective Modern C++", "Scott Meyers", 2014);
Book book3("The C++ Programming Language", "Bjarne Stroustrup", 2013);
manager.addBook(book1);
manager.addBook(book2);
manager.addBook(book3);
manager.searchBook("C++ Primer");
manager.searchBook("Effective Modern C++");
manager.searchBook("Clean Code");
manager.removeBook("Effective Modern C++");
manager.searchBook("Effective Modern C++");
return 0;
}
代码调试与优化
通过添加调试信息和优化代码结构,可以提高代码的可读性和维护性。
调试信息:
#include <iostream>
#include <string>
#include "BookManager.h"
int main() {
BookManager manager;
Book book1("C++ Primer", "Stanley B. Lippman", 2012);
Book book2("Effective Modern C++", "Scott Meyers", 2014);
Book book3("The C++ Programming Language", "Bjarne Stroustrup", 2013);
std::cout << "添加图书: " << std::endl;
manager.addBook(book1);
manager.addBook(book2);
manager.addBook(book3);
std::cout << "\n查询图书: " << std::endl;
manager.searchBook("C++ Primer");
manager.searchBook("Effective Modern C++");
manager.searchBook("Clean Code");
std::cout << "\n删除图书: " << std::endl;
manager.removeBook("Effective Modern C++");
manager.searchBook("Effective Modern C++");
return 0;
}
项目总结与改进
通过这个项目,我们掌握了如何使用C++11的语法特性开发简单的应用程序。在实际开发中,可以进一步优化代码结构,增加异常处理和日志记录等功能,提高系统的健壮性和易维护性。
具体代码示例:
#include <iostream>
#include <string>
#include "BookManager.h"
int main() {
BookManager manager;
Book book1("C++ Primer", "Stanley B. Lippman", 2012);
Book book2("Effective Modern C++", "Scott Meyers", 2014);
Book book3("The C++ Programming Language", "Bjarne Stroustrup", 2013);
try {
std::cout << "添加图书: " << std::endl;
manager.addBook(book1);
manager.addBook(book2);
manager.addBook(book3);
} catch (std::exception& e) {
std::cerr << "发生错误: " << e.what() << std::endl;
}
std::cout << "\n查询图书: " << std::endl;
try {
manager.searchBook("C++ Primer");
manager.searchBook("Effective Modern C++");
manager.searchBook("Clean Code");
} catch (std::exception& e) {
std::cerr << "发生错误: " << e.what() << std::endl;
}
std::cout << "\n删除图书: " << std::endl;
try {
manager.removeBook("Effective Modern C++");
manager.searchBook("Effective Modern C++");
} catch (std::exception& e) {
std::cerr << "发生错误: " << e.what() << std::endl;
}
return 0;
}
改进方向:
- 增加异常处理,确保程序的稳定性。
- 增加输入验证,防止无效输入。
- 使用日志记录功能,便于调试和跟踪问题。
- 优化数据存储结构,提高查询效率。
- 增加用户界面,提供更友好的交互体验。
以上是使用C++11语法完成一个简单图书管理系统的案例,希望能够帮助读者了解如何使用C++11的新特性开发实际应用。