继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

C++11语法项目实战:从入门到简单应用

哈士奇WWW
关注TA
已关注
手记 522
粉丝 71
获赞 400
概述

本文深入介绍了C++11的基础语法,包括数据类型、变量声明、常量与字面量、运算符和表达式等,并通过控制流程语句、函数与模板、类与对象的详细讲解,进一步阐述了C++11的特性。文章还通过实战项目展示了如何应用C++11语法项目实战开发简单应用程序,涵盖图书管理系统的实现与优化。

C++11基础语法介绍

数据类型与变量声明

在C++中,变量是用来存储数据的容器,每个变量都有特定的数据类型,如整型、浮点型、布尔型等。C++11引入了一些新的数据类型和语法特性,使得变量声明更加简洁和灵活。

基本数据类型:

  • int:整数类型
  • double:双精度浮点数类型
  • float:单精度浮点数类型
  • char:字符类型
  • bool:布尔类型,取值为truefalse

示例代码:

#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++中用于根据某个条件的结果来执行不同的代码块。常见的条件语句包括ifswitch

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)

循环语句用于重复执行一段代码,直到满足某个条件为止。常见的循环语句包括forwhiledo-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_ptrshared_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的新特性开发实际应用。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP