首页 > 编程语言 >C++进阶教程

C++进阶教程

时间:2024-06-11 11:01:01浏览次数:27  
标签:std 教程 进阶 int C++ include 模板 cout

一、引言

C++是一种高效、强大且灵活的编程语言,广泛应用于系统软件开发、游戏开发、科学计算等领域。对于已经掌握C++基础知识的开发者来说,进阶学习C++将帮助他们更深入地理解这门语言,并提升编程能力。本教程将介绍C++中的一些高级特性和技术,包括面向对象编程、模板编程、STL(标准模板库)的使用以及C++11/14/17等新版标准中的新特性。

二、面向对象编程(OOP)

面向对象编程是C++的核心特性之一,它使得代码更加模块化、可重用和易于维护。OOP的三大核心概念是类(Class)、对象(Object)和继承(Inheritance)

1. 类与对象

类是对象的抽象描述,它定义了对象的属性和方法。对象则是类的实例,具有类的属性和方法。

示例代码:

#include <iostream>
using namespace std;

// 定义一个名为Person的类
class Person {
public:
    string name; // 成员变量(属性)
    int age;

    // 成员函数(方法)
    void introduce() {
        cout << "My name is " << name << ", and I'm " << age << " years old." << endl;
    }
};

int main() {
    // 创建一个Person对象
    Person person1;
    person1.name = "Alice";
    person1.age = 25;
    person1.introduce(); // 输出:My name is Alice, and I'm 25 years old.

    return 0;
}

2. 继承

继承允许我们创建一个新的类(子类或派生类),它继承了一个或多个已存在的类(父类或基类)的特征。子类可以访问和修改从父类继承的属性和方法,也可以添加新的属性和方法。

示例代码:

#include <iostream>
using namespace std;

class Animal {
public:
    void eat() {
        cout << "The animal is eating." << endl;
    }
};

class Dog : public Animal { // Dog类继承自Animal类
public:
    void bark() {
        cout << "The dog is barking." << endl;
    }
};

int main() {
    Dog myDog;
    myDog.eat(); // 输出:The animal is eating.(调用继承自Animal类的方法)
    myDog.bark(); // 输出:The dog is barking.(调用Dog类自己的方法)

    return 0;
}

三、模板编程

模板编程是C++中的一项重要技术,它允许我们编写通用的代码,这些代码可以处理不同类型的数据。模板编程主要包括函数模板和类模板。

1. 函数模板

函数模板允许我们编写一个函数,该函数可以处理多种类型的数据。在编译时,编译器会根据实际传入的参数类型来生成相应的函数实例。

示例代码:

#include <iostream>
using namespace std;

// 定义一个函数模板,用于交换两个变量的值
template <typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 5, y = 10;
    swap(x, y); // 调用int类型的swap函数实例
    cout << "x = " << x << ", y = " << y << endl; // 输出:x = 10, y = 5

    double a = 3.14, b = 2.71;
    swap(a, b); // 调用double类型的swap函数实例
    cout << "a = " << a << ", b = " << b << endl; // 输出:a = 2.71, b = 3.14

    return 0;
}

2. 类模板

类模板允许我们编写一个类,该类可以处理多种类型的数据。与函数模板类似,编译器会根据实际传入的类型参数来生成相应的类实例。

示例代码:

#include <iostream>
#include <vector>
using namespace std;

// 定义一个类模板,用于创建一个可以存储任意类型数据的数组
template <typename T>
class Array {
private:
    T* data;
    int size;

public:
    Array(int size) : size(size) {
        data = new T[size];
    }

    ~Array() {
        delete[] data;
    }

    T& operator[](int index) {
        if (index < 0 || index >= size) {
            throw out_of_range("Index out of range");
        }
        return data[index];
    }

    // ... 其他成员函数,如push_back、pop_back等(此处省略)
};

int main() {
    // 创建一个可以存储int类型数据的Array对象
    Array<int> intArray(5);
    for (int i = 0; i < 5; ++i) {
        intArray[i] = i * 2;
    }
    for (int i = 0; i < 5; ++i) {
        cout << intArray[i] << " "; // 输出:0 2 4 6 8 
    }
    cout << endl;

    // 创建一个可以存储string类型数据的Array对象
    Array<string> stringArray(3);
    stringArray[0] = "Hello";
    stringArray[1] = "World";
    stringArray[2] = "!";
    for (int i = 0; i < 3; ++i) {
        cout << stringArray[i] << " "; // 输出:Hello World ! 
    }
    cout << endl;

    return 0;
}

四、STL(标准模板库)的使用

STL是C++标准库中的一部分,它提供了一系列高效的模板类和函数,用于处理常见的数据结构和算法。STL中的容器类(如vector、list、map等)和算法类(如sort、find等)极大地简化了C++的编程工作。

1. 使用vector容器

vector是一个动态数组,可以存储任意类型的数据,并可以根据需要自动调整大小。

示例代码:

#include <iostream>
#include <vector>
#include <algorithm> // 用于sort函数
using namespace std;

int main() {
    // 创建一个存储int类型数据的vector对象
    vector<int> nums = {5, 2, 8, 1, 9};

    // 使用STL中的sort函数对vector中的元素进行排序
    sort(nums.begin(), nums.end());

    // 输出排序后的vector
    for (int num : nums) {
        cout << num << " "; // 输出:1 2 5 8 9 
    }
    cout << endl;

    return 0;
}

2. 使用map容器

map是一个关联容器,它存储的元素是键值对(key-value pair),其中键是唯一的。

示例代码:

#include <iostream>
#include <map>
using namespace std;

int main() {
    // 创建一个存储string-int键值对的map对象
    map<string, int> scores = {{"Alice", 90}, {"Bob", 85}, {"Charlie", 95}};

    // 遍历map并输出键值对
    for (const auto& pair : scores) {
        cout << pair.first << ": " << pair.second << endl; // 输出:Alice: 90, Bob: 85, Charlie: 95
    }

    // 查找键为"Bob"的元素,并输出其值
    auto it = scores.find("Bob");
    if (it != scores.end()) {
        cout << "Bob's score is " << it->second << endl; // 输出:Bob's score is 85
    }

    return 0;
}

五、C++11/14/17等新标准中的新特性

C++11、C++14和C++17等新版标准为C++带来了许多新特性和改进,如智能指针、lambda表达式、范围for循环、auto关键字、类型推导、nullptr关键字等。这些新特性使得C++编程更加简洁、安全和高效。

1. Lambda表达式

Lambda表达式是一种定义匿名函数的简洁方式。它允许我们在需要的地方直接定义并使用函数,而无需事先声明函数名。

示例代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> nums ={5, 2, 8, 1, 9};

    // 使用lambda表达式作为sort函数的比较函数
    sort(nums.begin(), nums.end(), [](int a, int b) { return a < b; });

    // 输出排序后的vector
    for (int num : nums) {
        cout << num << " "; // 输出:1 2 5 8 9 
    }
    cout << endl;

    return 0;
}

2. 智能指针

智能指针是一种能够自动管理内存的生命周期的指针类型。C++11中引入了std::unique_ptrstd::shared_ptrstd::weak_ptr等智能指针。

示例代码(使用std::unique_ptr):

#include <iostream>
#include <memory> // 引入智能指针头文件

class MyClass {
public:
    MyClass(int value) : value_(value) {
        cout << "MyClass(" << value_ << ") constructor called." << endl;
    }

    ~MyClass() {
        cout << "MyClass(" << value_ << ") destructor called." << endl;
    }

    void printValue() {
        cout << "Value: " << value_ << endl;
    }

private:
    int value_;
};

int main() {
    // 使用std::unique_ptr管理MyClass对象的生命周期
    std::unique_ptr<MyClass> ptr(new MyClass(42));
    ptr->printValue(); // 输出:Value: 42

    // 当ptr离开作用域时,它所指向的MyClass对象将自动被删除
    // 此时将输出:MyClass(42) destructor called.

    return 0;
}

六、总结

本教程介绍了C++中的一些高级特性和技术,包括面向对象编程、模板编程、STL的使用以及C++11/14/17等新标准中的新特性。这些特性和技术将帮助你更深入地理解C++,并提升你的编程能力。当然,C++的学习是一个持续的过程,不断地实践和探索将使你更加精通这门语言。

标签:std,教程,进阶,int,C++,include,模板,cout
From: https://blog.csdn.net/qq_41256535/article/details/139551724

相关文章

  • OpenCV实战案例——校正+切边[C++]
    0.前言本文以实战案例为背景,讲述如何使用计算机图形学知识完成需求,实现最终效果。本文包含实战案例素材以及过程代码讲解,方便读者理解。1.案例需求某公司打算开发一款用于提取学生作业本的程序,学生用手机拍摄自己的作业上传到程序,程序进行处理最终提取出作业本区域方便老师批改......
  • jQuery 的进阶细节和使用技巧
    1.链式调用链式调用允许你连续地对同一个元素执行多个操作。<divid="chain-demo">ChainDemo</div>$('#chain-demo').css('color','red').slideUp(200).slideDown(200);2.事件委托事件委托允许你将事件绑定到父元素上,而不是每个子元素上,这对于动态添加的元素很有用......
  • 微信计数器开发,微信计数器使用教程
    1.客户端样式  采用非注入式开发,防封好,支持最新版Vx,不挑系统,主流windows系统都支持,可根据需求自定义客户端样式(万里,熊猫.GD,JD,Ti,智多粉…)2.后台样式一角 后台操作简单,数据效验加密机制,结构性强大,稳定性极强3.分享页 可根据需求来匹配写后台数据返回,以及后......
  • Java进阶_接口
    接口的概念       在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。        接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则......
  • 华为云短信服务教你用C++实现Smgp协议
    本文分享自华为云社区《华为云短信服务教你用C++实现Smgp协议》,作者:张俭。引言&协议概述中国联合网络通信有限公司短消息网关系统接口协议(SGIP)是中国网通为实现短信业务而制定的一种通信协议,全称叫做ShortMessageGatewayInterfaceProtocol,用于在短消息网关(SMG)和服务提供商(SP......
  • Aria2安装教程
    Aria2安装教程时间:2024-3-1922:41:03版本:1.37.0官方下载地址:Releases·aria2/aria2(github.com)打开网址后点击这里。​​拉到最后,选择自己合适的版本下载即可,我选择的是win64版本。​​解压文件夹,放到自己合适的目录下。​​在当前目录新建四个文件:Aria2.log(日志......
  • C/C++ 位域注意事项
    C/C++位域注意事项:一、位域定义与布局可以使用无名域位,这样的域位主要用来补齐或调整位置,但不能被直接使用。位域的长度不能大于其类型说明符中指定类型的固有长度。例如,int类型的位域长度不能超过32位,char的位域长度不能超过8位。二、位域的使用与对齐在使用位......
  • Sklearn基础教程:机器学习界的瑞士军刀
    Sklearn基础教程:机器学习界的瑞士军刀引言在机器学习的世界里,sklearn(Scikit-learn)就像是一把瑞士军刀,小巧、多功能,而且非常实用。无论你是数据科学家还是编程新手,sklearn都能成为你解决问题的得力助手。今天,就让我们一起走进sklearn的奇妙世界,探索它的起源、发展过程、原......
  • LeetCode 算法:缺失的第一个正数c++
    原题链接......
  • C++笔记
    c++一、基础(一)C++初识1.注释//1.单行注释,上方或末尾/*2.多行注释,上方*//* 3.main是一个程序的入口 每个程序都有必须有这么一个函数 有且仅有一个 默认return0,程序状态正常*/// ;是语句结束// ;;;;多个空语句// l+(r-1)/2比(l+r)/2比l+r>>1更安全......