C++进阶教程

一、引言

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 = 5double a = 3.14, b = 2.71;swap(a, b); // 调用double类型的swap函数实例cout << "a = " << a << ", b = " << b << endl; // 输出:a = 2.71, b = 3.14return 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());// 输出排序后的vectorfor (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; });// 输出排序后的vectorfor (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++的学习是一个持续的过程,不断地实践和探索将使你更加精通这门语言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外部排序快速入门详解:基本原理,败者树,置换-选择排序,最佳归并树

文章目录 外部排序1.最基本的外部排序原理2.外部排序的优化2.1 败者树优化方法2.2 置换-选择排序优化方法2.3 最佳归并树 外部排序 为什么要学习外部排序&#xff1f; 答&#xff1a; 在处理数据的过程中&#xff0c;我们需要把磁盘(外存&#xff09;中存储的数据拿到内存中处理…

ue5创建地图瓦片

先在虚幻商城下载免费的paperzd插件&#xff0c;并启用。 导入资源后&#xff0c;先通过应用paper2d纹理资源&#xff0c;将去掉导入ue时产生的边缘模糊&#xff0c;再点击下面的创建瓦片集&#xff0c; 打开瓦片集&#xff0c;发现选中不对&#xff0c; 改变瓦片大小为16*…

ChatGPT对话基本原则和玩法

一、使用三个准备 1.1 认知上 超级学霸&#xff0c;几乎所有的工作/生活场景&#xff0c;都可以找它帮忙 ChatGPT作为一个人工智能语言模型&#xff0c;具有强大的知识储备和处理能力。这意味着在许多工作和生活场景中&#xff0c;你都可以向它请教问题或寻求帮助。无论是科…

Virustotal查询恶意进程

1、使用netstat查看可疑进程 执行ls -al /proc/$PID/exe确认可疑进程对应的文件&#xff1b;若文件未被删除&#xff0c;则直接上传文件到Virustotal进行检测&#xff0c;或者计算出文件对应的md5&#xff0c;使用md5去Virustotal进行查询&#xff1b;若文件已被删除&#xff0…

Python第二语言(七、Python模块)

目录 1. 什么是模块 2. 基本语法 2.1 模块的导入方式 2.2 基本语法 import 模块名 2.3 基本语法 from 模块名 import 功能名 2.4 基本语法as 别名 3. 自定义模块 4. 调用自定义模块时&#xff0c;如何让其模块中的函数不被调用&#xff08;__name__&#xff09; 5. 调…

java面试题:hashCode的作用

在Java集合中&#xff0c;hashCode起着至关重要的作用&#xff0c;特别是在基于哈希的集合类如HashMap、HashSet和Hashtable中。以下是hashCode在集合中的主要作用&#xff1a; 快速查找和定位&#xff1a; hashCode被用作确定对象在哈希表中存储位置的索引&#xff08;或称为“…

基于SSM+Jsp的家用电器销售网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

微信小程序获取 OpenId 和 UnionId

文章目录 1.什么是 OpenId 和 UnionId&#xff1f;2.获取 OpenId 和 UnionId 的办法3.备注 前言&#xff1a;最近开发小程序&#xff0c;需要通过用户登录的唯一值存储数据&#xff0c;查看手册发现要使用的是 “OpenId” 和 “UnionId” 1.什么是 OpenId 和 UnionId&#xff1…

仓储系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;试剂管理&#xff0c;安全管理&#xff0c;存储管理 用户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;试剂管理&#xff0c;安全管…

54.ReentrantReadWriteLock

读写锁用的是同一个Sycn同步器,因此等待队列、state等也是同一个。 使用场景 当读操作远远高于写操作时,用读写锁让读可以并发,提高性能。读写是互斥的。 使用读锁保护数据的read方法,写锁保护数据的write方法。 读读之间是并发 @Slf4j public class DataContainer {p…

快速搭建rtsp server(Ubuntu)

在现代视频监控和实时视频流媒体应用中&#xff0c;实时流协议&#xff08;RTSP&#xff09;服务器扮演着至关重要的角色。无论是家庭安防系统、企业级监控还是流媒体服务&#xff0c;RTSP服务器都能提供高效、稳定的解决方案。然而&#xff0c;对于许多初学者或开发者来说&…

机器学习--生成式模型和判别式模型的具体分析

文章目录 生成式模型和判别式模型的具体分析生成式模型定义工作原理优点缺点常见模型 判别式模型 总结生成式模型判别式模型 生成式模型和判别式模型的具体分析 生成式模型和判别式模型在机器学习中有着不同的目标、应用场景和性能特点。以下将详细分析它们的定义、工作原理、…

【qt】绘图

绘图 一.画家二.绘图事件三.坐标体系四.画笔1.setColor2.setWidth3.setStyle4.setCapStyle5.setJoinStyle6.给画家配置笔 五.画刷1.setColor2.setStyle3.给画家设置刷子 六.用到的类汇总1.QRect 矩形2.QPoint 点3.QImage 图片4.QPixmap 图片5.QLine 线6.QPainterPath 路径 七.开…

河海大学上岸经验分享!

这个系列会邀请上岸学长学姐进行经验分享~ 今天分享经验的同学&#xff0c;二战上岸河海大学。 经验分享 大家好&#xff0c;先介绍一下我自己吧&#xff0c;我本科双非院校&#xff0c;电子信息工程专业。我是一名二战考生&#xff0c;23年当时疫情发高烧&#xff0c;总分3…

aabb c++

题目描述 查找形如"aabb"的四位完全平方数&#xff0c;也即前两位数字相同&#xff0c;后两位数字也相同。 输入 无 输出 若干行&#xff0c;每行一个符合条件的四位数&#xff08;从小到大&#xff09;。 分析&#xff1a; 完全平方数&#xff1a; &#xff…

.Net 使用 MongoDB

安装nuget包 MongoDB.Driver 简单代码 using MongoDB.Bson; using MongoDB.Driver; using System.Buffers; using System.Collections.Concurrent; using System.Diagnostics;namespace ConsoleApp4 {internal class Program{static void Main(string[] args){var client = ne…

Solidity选择使用 require 语句还是条件语句结合手动触发 revert 操作?

文章目录 Solidity选择使用 require 语句还是条件语句结合手动触发 revert 操作&#xff1f; Solidity选择使用 require 语句还是条件语句结合手动触发 revert 操作&#xff1f; IERC721 nft IERC721(nftAddress); // 声明IERC721接口合约变量 if (nft.getApproved(tokenId)…

中国蚁剑 安装教程 2024年5月

2024/5/11 中国蚁剑 安装教程 一、下载中国蚁剑的加载器和核心源码&#xff08;两个都要用到&#xff09; github官方下载地址&#xff1a;https://github.com/AntSwordProject/ 参考文档&#xff1a;antSword/README_CN.md at master AntSwordProject/antSword GitHub 核…

计算机视觉与深度学习实战,Python为工具,基于语音识别的信号灯图像模拟控制技术

计算机视觉与深度学习在实战中的应用广泛,特别是在结合语音识别技术的信号灯图像模拟控制系统中,这种技术的结合展现出了极大的潜力和应用价值。以下将基于Python工具,对计算机视觉与深度学习在信号灯图像模拟控制中的应用进行详细阐述,并特别关注语音识别技术的整合。 一、…

#10 解决Stable Diffusion常见问题和错误

文章目录 前言1. 环境配置错误问题描述解决方案 2. 模型加载失败问题描述解决方案 3. 图像生成质量差问题描述解决方案 4. 生成速度慢问题描述解决方案 5. 内存不足错误问题描述解决方案 结论 前言 Stable Diffusion是一种先进的AI图像生成工具&#xff0c;它允许用户基于文本…