本文详细介绍了C++11语言的新特性和开发环境搭建方法,并提供了丰富的代码示例和实践案例。文章还涵盖了基础语法、面向对象编程以及标准库的使用,旨在帮助读者更好地理解和应用C++11工程实践资料。
C++11简介与环境搭建C++11是C++语言的重要版本之一,它引入了许多新的特性和改进,使得C++代码更加简洁、安全和高效。以下是一些主要的新特性:
自动类型推断:使用auto
关键字可以自动推断变量的类型。
auto x = 5; // x 的类型为 int auto y = 3.14; // y 的类型为 double
范围for循环:可以方便地遍历容器中的元素。
std::vector<int> vec = {1, 2, 3, 4, 5}; for (auto& elem : vec) { std::cout << elem << " "; }
Lambda表达式:支持匿名函数,可以方便地编写短小的函数。
auto lambda = [](int x) { return x * x; }; int result = lambda(5); // result 为 25
右值引用和移动语义:提高了资源管理的效率。
std::string str1 = "Hello"; std::string str2 = std::move(str1); // 移动 str1 的资源到 str2 std::cout << str1 << std::endl; // 输出为空
智能指针:提供了更安全的指针管理方式。
std::unique_ptr<int> ptr1(new int(10)); std::unique_ptr<int> ptr2 = std::move(ptr1);
类型别名:使用using
关键字定义别名,简化类型声明。
using FloatPair = std::pair<float, float>; FloatPair pair1(3.5f, 4.5f);
初始化列表:支持统一的初始化方式,包括直接列表初始化。
std::vector<int> vec = {1, 2, 3, 4, 5};
std::thread t1([]() { std::cout << "线程1" << std::endl; }); std::thread t2([]() { std::cout << "线程2" << std::endl; }); t1.join(); t2.join();
搭建C++开发环境通常需要以下几个步骤:
sudo apt-get update sudo apt-get install g++
常用的C++开发工具包括:
{ "version": "2.0.0", "tasks": [ { "label": "g++ build active file", "type": "shell", "command": "g++", "args": [ "-std=c++11", "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": "$gcc" } ] }基础语法与数据类型
在C++中,变量是用来存储数据的容器,而常量则是不可修改的值。以下是变量和常量的基本用法。
int main() { int age = 20; // 整型变量 double price = 19.99; // 浮点型变量 char grade = 'A'; // 字符变量 bool is_valid = true; // 布尔型变量 std::string name = "Alice"; // 字符串变量 return 0; }
const int MAX_SIZE = 100; // 常量整型 constexpr double PI = 3.14159; // 常量浮点型 const char* greeting = "Hello, World!"; // 指向常量的字符串指针
C++提供了多种基本数据类型,包括整型、浮点型、字符型等。数据类型之间可以进行转换。
int num = 123; double dnum = static_cast<double>(num); // 整型转浮点型 int new_num = static_cast<int>(dnum); // 浮点型转整型 char ch = 'A'; int ascii = static_cast<int>(ch); // 字符转整型
C++中常用的运算符包括算术运算符、关系运算符、逻辑运算符等。
int a = 10; int b = 5; int sum = a + b; // 加法 int diff = a - b; // 减法 int prod = a * b; // 乘法 int quo = a / b; // 除法 int rem = a % b; // 取余
int x = 10; int y = 20; bool result = x > y; // 大于 result = x < y; // 小于 result = x >= y; // 大于等于 result = x <= y; // 小于等于 result = x == y; // 等于 result = x != y; // 不等于
bool flag1 = true; bool flag2 = false; bool result = flag1 && flag2; // 逻辑与 result = flag1 || flag2; // 逻辑或 result = !flag1; // 逻辑非控制结构与函数
控制结构用于控制程序的执行流程,包括条件语句和循环结构。
int age = 20; if (age >= 18) { std::cout << "成年人" << std::endl; } else { std::cout << "未成年人" << std::endl; }
int num = 2; switch (num) { case 1: std::cout << "数字1" << std::endl; break; case 2: std::cout << "数字2" << std::endl; break; default: std::cout << "其他数字" << std::endl; }
int i = 0; while (i < 10) { std::cout << i << " "; i++; }
for (int i = 0; i < 10; i++) { std::cout << i << " "; }
int i = 0; do { std::cout << i << " "; i++; } while (i < 10);
函数是C++程序的基本构建块,用于封装可重用的代码。
int add(int a, int b) { return a + b; }
int result = add(5, 7); std::cout << "结果: " << result << std::endl;
参数传递可以是值传递、引用传递和指针传递。
void swap(int a, int b) { int temp = a; a = b; b = temp; }
void swap(int& a, int& b) { int temp = a; a = b; b = temp; }
void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; }
int get_value() { return 42; }面向对象编程基础
类是对象的蓝图,对象是类的实例。类通常包含数据成员和成员函数。
class Person { public: std::string name; int age; void display_info() { std::cout << "姓名: " << name << ", 年龄: " << age << std::endl; } };
int main() { Person p; p.name = "Alice"; p.age = 25; p.display_info(); return 0; }
成员函数用于操作数据成员,可以实现对象的功能。
class Rectangle { public: int width; int height; int area() { return width * height; } };
int main() { Rectangle r; r.width = 10; r.height = 20; std::cout << "面积: " << r.area() << std::endl; return 0; }
继承允许一个类继承另一个类的属性和方法,多态允许对象通过不同的方式表现。
class Animal { public: void speak() { std::cout << "动物发声" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "狗吠" << std::endl; } };
void make_speak(Animal& a) { a.speak(); } int main() { Animal a; Dog d; make_speak(a); // 输出: 动物发声 make_speak(d); // 输出: 狗吠 return 0; }标准库与容器
C++标准库提供了丰富的功能,包括容器、算法、迭代器等。
#include <iostream> #include <vector> #include <list> #include <map> #include <set> #include <queue> #include <stack> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; for (int i : vec) { std::cout << i << " "; } std::cout << std::endl; std::list<int> lst = {10, 20, 30, 40, 50}; for (int i : lst) { std::cout << i << " "; } std::cout << std::endl; std::map<int, std::string> m = {{1, "one"}, {2, "two"}, {3, "three"}}; for (auto& pair : m) { std::cout << pair.first << ": " << pair.second << std::endl; } std::set<int> s = {100, 200, 300, 400, 500}; for (int i : s) { std::cout << i << " "; } std::cout << std::endl; std::queue<int> q; q.push(1); q.push(2); q.push(3); while (!q.empty()) { std::cout << q.front() << " "; q.pop(); } std::cout << std::endl; std::stack<int> stk; stk.push(1); stk.push(2); stk.push(3); while (!stk.empty()) { std::cout << stk.top() << " "; stk.pop(); } std::cout << std::endl; return 0; }
容器提供了多种方法用于操作和管理数据。
std::vector<int> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.pop_back(); vec.insert(vec.begin(), 0); vec.erase(vec.begin() + 1);
std::list<int> lst; lst.push_back(1); lst.push_back(2); lst.push_back(3); lst.pop_back(); lst.insert(lst.begin(), 0); lst.erase(lst.begin() + 1);
std::map<int, std::string> m; m[1] = "one"; m[2] = "two"; m.erase(1);
std::set<int> s; s.insert(1); s.insert(2); s.insert(3); s.erase(1);
C++标准库提供了丰富的算法和迭代器,用于操作容器中的数据。
std::vector<int> vec = {1, 2, 3, 4, 5}; std::sort(vec.begin(), vec.end()); std::for_each(vec.begin(), vec.end(), [](int& i) { i *= 2; });
std::vector<int> vec = {1, 2, 3, 4, 5}; for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; }工程实践与案例分析
开发一个简单的C++项目通常包括以下几个步骤:
#include <iostream> #include <string> class Calculator { public: double add(double a, double b) { return a + b; } double subtract(double a, double b) { return a - b; } double multiply(double a, double b) { return a * b; } double divide(double a, double b) { if (b == 0) { std::cout << "除数不能为0" << std::endl; return 0; } return a / b; } }; int main() { Calculator calc; std::string operation; double num1, num2; while (true) { std::cout << "请输入操作符(+、-、*、/):"; std::cin >> operation; if (operation == "exit") break; std::cout << "请输入两个数字:"; std::cin >> num1 >> num2; if (operation == "+") { std::cout << "结果:" << calc.add(num1, num2) << std::endl; } else if (operation == "-") { std::cout << "结果:" << calc.subtract(num1, num2) << std::endl; } else if (operation == "*") { std::cout << "结果:" << calc.multiply(num1, num2) << std::endl; } else if (operation == "/") { std::cout << "结果:" << calc.divide(num1, num2) << std::endl; } else { std::cout << "无效的操作符" << std::endl; } } return 0; }
在开发过程中,常见的错误包括语法错误、逻辑错误和运行时错误。调试技巧包括打印调试、断点调试和单元测试。
std::cout << "值为:" << value << std::endl;
使用IDE的断点调试功能,可以逐步执行代码并观察变量的变化。
编写测试用例,确保代码的正确性。
#include <gtest/gtest.h> class CalculatorTest : public ::testing::Test { protected: Calculator calc; }; TEST_F(CalculatorTest, AddTest) { EXPECT_EQ(calc.add(1, 2), 3); } TEST_F(CalculatorTest, SubtractTest) { EXPECT_EQ(calc.subtract(3, 1), 2); } TEST_F(CalculatorTest, MultiplyTest) { EXPECT_EQ(calc.multiply(2, 3), 6); } TEST_F(CalculatorTest, DivideTest) { EXPECT_EQ(calc.divide(6, 3), 2); } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
#include <iostream> #include <thread> #include <vector> #include <mutex> std::mutex mtx; void worker(int id) { for (int i = 0; i < 5; i++) { std::lock_guard<std::mutex> guard(mtx); std::cout << "线程 " << id << " 执行任务 " << i << std::endl; } } int main() { std::vector<std::thread> threads; for (int i = 0; i < 5; i++) { threads.push_back(std::thread(worker, i)); } for (auto& thread : threads) { thread.join(); } return 0; }
#include <iostream> #include <vector> #include <string> class Database { public: void addRecord(const std::string& record) { records.push_back(record); } void printRecords() { std::cout << "记录:" << std::endl; for (const auto& record : records) { std::cout << record << std::endl; } } private: std::vector<std::string> records; }; int main() { Database db; db.addRecord("记录1"); db.addRecord("记录2"); db.printRecords(); return 0; }
通过以上案例,可以更好地理解和应用C++11中的新特性和标准库,提高编程效率和代码质量。