C++ 速成

news2024/10/6 16:31:21

C++ 概述

c++ 融合了3中不同的编程方式:

  • C语言代表的过程性语言
  • C++ 在C语言基础上添加的类代表的面向对象语言
  • C++ 模板支持的泛型编程

C++ 标准

一种描述C++ 的一些语法规则的代码准则
C++11

C++ 应用

  • 游戏
    • C++ 效率是一个很重要的原因,绝大部分游戏殷勤都是C++写的
  • 网络软件
    • c++拥有很多成熟的用于网络通信的库,其中最具有代表性的是跨平台的、重量级的ACE库,该库可以说是C++ 语言最重要的成果之一。
  • 操作系统
    • 在该领域,c语言是主要的编程语言,但是c++凭借对c的兼容性,面向对象也开始应用在该领域
  • 嵌入式系统

C++ 编译器安装

编译器安装 + vscode

C++ 基础

命名空间

  1. 创建名字是程序设计过程中的基本活动,当一个项目很大的时候,名字会大量重叠,c++允许我们对名字的产生和名字的可见性进行控制
  2. 我们之前在学习c语言可以通过static关键字来是的名字只在本编译单元内课件,在c++ 中我们通过一种命名空间来控制对名字的访问。
  3. c++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类、对象…
  4. std是c++ 标准命名空间,c++标准程序库中的所有标识符都被定义在std中,比如标准库中的类iosstream、vectore等都定义在该命名空间中,使得要加上using声明或者using指示
  • 命名空间的使用:

    命名空间定义:

    	namespace 名称 {
    			// 定义变量、函数、类型、对象
    	}
    

    命名空间访问:

    	#include <iostream>
    	ussing namspace std;
    	namespace A {
    		int a = 10;
    	}
    	
    	namespace B {
    		int b = 20;
    	}
    	
    	int main(){
    		count << "a:" << A::a << endl;
    		count << "b:" << B::b << endl;
    		return 0;
    	}
    
    
    

注意事项:

命名空间只能在全局范围内定义。

引用

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它与引用的变量共用同一块内存空间。


引用的本质:

  • C++ 编译器在编译过程中使用常量指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见

1、引用可以看作是一个一定义变量的别名
2、引用的语法:Type& name = vars;

注意:

1 & 再次不是求地址运算,而是起标识作用
2、类型标识符是指目标变量的类型
3、必须在声明引用变量时
4、引用初始化之后不能改变
5、不能有null引用,必须确保引用是和一块合法的存储单元关联
6、一个变量可以有多个引用(相当于一个变量有好几个别名)

  • 错误写法
int main(){
	int a = 10;
	int& b = a;
	
	// 定义没有初始化
	int& x; 
	// 没有空引用
	int& y = NULL;
	// 没有所谓的二级引用
	int&& c = 1; 
}

交换2个变量的数值: 使用引用来做

#include <iostream>
using namespace std;
void my_swap (int& a,int& b)
{
	int tmp = a;
    a = b;
	b = tmp;
}
int main ()
{
	int x = 10, y = 20;my_swap(x,y) ;
	cout << " x = " << x<< " y = " << y << endl;  
    // x = 20  y = 10
	return 0;
}

总而言之:
引用本身是一个变量,但是这个变量又仅仅是另外一个变量一个别名,它不占用内存空间,它不是指针哦!仅仅是一个别名!


引用和指针的区别

1、语法层面的区别

  • 从语法规则上讲,指针变量存储某个实例(变量或对象)的地址;(引用是某个实例的别名。)

  • 程序为指针变量分配内存区域;而不为引用分配内存区域。

    int main()
    {
    	int a = 10;
    	int* ip = &a;
    	int& b = a;  \\b是a的别名 并没有分配新的空间
    }
    
    
  • 解引用是指针使用时要在前加“*”;引用可以直接使用。

    	int main()
    	{
    		int a = 10;
    		int* ip = &a;
    		int& b = a;  
    		*ip = 100//对于指针使用加“*”
    		b = 200//引用不需要“*”
    		
    	}
    
    
  • 指针变量的值可以发生改变,存储不同实例的地址;
    引用在定义时就被初始化,之后无法改变(不能是其他实例的引用)。

    int main()
    {
    	int a = 10,b = 20;
    	int* ip = &a;
    	ip = &b ;
    	int& c = a;
    	c = b;   //b的值给c实则是把b的值给a,将a的值改为20
    }
    
    
  • 指针变量的值可以为空(NULL,nullptr);没有空引用。

  • 指针变量作为形参时需要测试它的合法性(判空NULL);【引用不需要判空。】

  • 对指针变量使用"sizeof"得到的是指针变量的大小

  • 对引用变量使用"sizeof"得到的是变量的大小

    int main()
    {
    	double dx = 10;
    	double* dp = &dx;
    	double& a = dx; 
    	printf("sizeof(dp):%d\n", sizeof(dp));  // 4
    	printf("sizeof(a):%d", sizeof(a));   // 8
    }
    
    
  • 理论上指针的级数没有限制;但引用只有一级。
    即不存在引用的引用,但可以有指针的指针。

  • ++引用与++指针的效果不一样。

    	int main()
    (
    	int ar[5] = { 1,2,34,5 };
    	int* ip = ar; //数组首元素地址
    	int& b = ar[O]; //数组首元素的别名叫b
    	++ip;  //由0下标的地址指向1下标的地址
    	++b;  //由0下标指向1下标
    }
    
    

更多细节:参考引用单独详解 | 和指针区别


内联函数

特性

  • 内联函数不能声明与定义分离,如果分离,必会发生链接错误。
  • C++ 推荐使用内联函数替代宏代码片段
  • 内联函数在最终生成的代码中是没有定义的,C++ 编译器直接将函数体插入在函数嗲用的地方,内联函数没有普通函数调用时的额外开销( 压栈、跳转、返回 )
  • 因为内联函数在最终生成的代码中时没有定义的,所以内联函数的作用域可以理解成只在定义的文件中。加入在a.cpp中定义了inline int func ( int a ) { return ++a; }. 如果在b.c 中需要调用func函数,则在b.cpp中需要重新定义内联函数inline int func( int a ) { return ++a; }
  • inline 只是对编译器的一个内联请求,c+++ 内联编译会有一些限制,一下情况编译器可能不会考虑将函数进行内联编译:
    • 存在任何形式的循环语句
    • 存在果果的条件判断语句
    • 函数体过于庞大
    • 对函数进行取址操作

因此,内联仅仅只是给编译器一个建议,编译器不一定会接受这种建议,如果你没有将函数声明为内联函数,那么编译器也可能将此函数做内联编译。一个好的编译器将会内联小的、简单的函数。

函数默认参数

这里参考前端里面的Typscript 默认参数语法


函数重载

概念:

  • 同一个函数名定义的不同函数
  • 当函数名和不同的参数搭配时函数的含义不同

条件

  • 同一个作用域
  • 参数个数不同
  • 参数类型不同
  • 参数顺序不同

【C++】C++中函数重载的理解


函数重载的本质原理:(g++ 编译器,编译成了多个函数地址)
在这里插入图片描述


类 、对象

基本概念

1、现实世界的事物都具有的共性就是每个事物都具有本身的属性,一些自身具有的行为,例如一个学生有姓名、性别、年龄等属性,吃饭睡觉等行为。
2、类对于某个事物的描述起始还是抽象的,例如有一类事物有姓名、性别、年龄等属性,可以吃饭睡觉玩游戏等。如果只是描述的话起始我们还是不知道这个事物具体是什么样,因为这个类没有告诉我们每个属性具体的值是多少(这个事物的姓名是什么,年龄是多少),所以类只是对某一类事物的一个描述而已。实际应用中我们需要操作某类事物中的一个或者多个具体的事物。那么这个具体的事物我们就称之为对象。
3、类是抽象的,对象是具象的。
4、对象是怎么来的呢? 由类实例化来,因此我们也说通过一个类实例化一个对象。


1、在C++中可以给成员变量和成员函数定义访问级别。

  • ·public 公有的,修饰成员变量和成员函数可以在类的内部和类的外部被访问
  • ·private 私有的,修饰成员变量和成员函数只能在类的内部被访问
  • ·protected 被保护的,修饰成员变量和函数只能在类的内部被访问
//student.h
#ifndef _STUDENT_H_
#define _STUDENT_H_
#include <iostream>
using namespace std;
class Student
{
    public:
        int GetAge() {
        	return m_age;
        };   //声明类的成员函数,在函数的其它地方实现
        int SetAge(int age) {
	        // 参数合法性限制
        	if(age < 0 || age > 200 ) return;
        	m_age = age;
        };
    private:
        int m_age;
        char m_name[32];
};
#endif

如果某些属性不想被外部修复访问、则可以设置成private 关键字,继续保护

不过类提供一种机制来实现内部成员变量的修改和访问,就是通过·public· 声明的函数,来供类外部进行访问,修改。

面向过程 | 对象

  • 面向过程
    • 数据结构 + 算法
    • 用户需求简单而固定
    • 特点:
      • 分析解决问题所需步骤
      • 利用函数实现各个步骤
      • 依次调用函数解决问题

参考文章

《C++面向对象程序设计》✍千处细节、万字总结(建议收藏

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

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

相关文章

【刷题】 二分查找进阶

送给大家一句话&#xff1a; 你向神求助是因为相信神&#xff0c;神没有回应你是因为神相信你 ε≡٩(๑>₃<)۶ &#xfeff;ε≡٩(๑>₃<)۶ &#xfeff;ε≡٩(๑>₃<)۶ 一心向学 二分查找进阶 1 前言Leetcode 852. 山脉数组的峰顶索引题目描述算法思…

Unity类银河恶魔城学习记录13-5,6 p146 Delete save file,p147 Encryption of saved data源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili FileDataHandler.cs using System; using System.IO; using UnityEngine; p…

Git TortoiseGit 安装使用详细教程

前言 Git 是一个免费的开源分布式版本控制系统&#xff0c;是用来保存工程源代码历史状态的命令行工具&#xff0c;旨在处理从小型到非常大型的项目&#xff0c;速度快、效率高。《请查阅Git详细说明》。TortoiseGit 是 Git 的 Windows Shell 界面工具&#xff0c;基于 Tortoi…

pg内核之日志管理器(五)WAL日志

概念 WAL日志 数据库运行过程中&#xff0c;数据一般是会保存在内存和磁盘中&#xff0c;为保证数据的安全性&#xff0c;防止数据库崩溃时数据不丢失&#xff0c;一般都是要保证数据实时落盘的&#xff0c;但是又由于磁盘随机IO读写速率与内存相比慢很多&#xff0c;如果每个…

Python爬虫爬取中药材价格数据

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;喜欢的话麻烦您点个&#x1f44d;和⭐&#xff01; &#x1f388;…

【Ubuntu20.04+Noetic】UR5e+Gazebo+Moveit

环境准备 创建工作空间 mkdir -p ur5e_ws/src cd ur5e_ws/srcUR机械臂软件包 UR官方没更新最新的noetic的分支,因此安装melodic,并需要改动相关文件。 安装UR的模型配置包,包里面有UR模型文件,moveit配置等: cd ~/ur5e_ws/src git clone -b melodic-devel https://git…

llama-factory SFT 系列教程 (四),lora sft 微调后,使用vllm加速推理

文章目录 文章列表&#xff1a;背景简介llama-factory vllm API 部署融合 lora 模型权重 vllm API 部署HuggingFace API 部署推理API 部署总结 vllm 不使用 API 部署&#xff0c;直接推理数据集 tenplatevllm 代码部署 文章列表&#xff1a; llama-factory SFT系列教程 (一)&a…

【Django】调用django的pbkdf2_sha256加密算法测试

基于django搭建的系统中&#xff0c;用到pbkdf2_sha256&#xff08;&#xff08;Password-Based Key Derivation Function 2&#xff09;&#xff09;加密算法&#xff0c;这里做些代码测试、总结。 PBKDF2简介 PBKDF2是一种基于密码的密钥派生函数&#xff0c;用于从用户提供的…

cv2技术原理-图像旋转原理及手动实现

cv2技术原理-图像旋转原理及手动实现 1、图像旋转opencv实现2、cv2.getRotationMatrix2D函数解释3、数学原理推导旋转矩阵M4、手动计算旋转矩阵M5、旋转矩阵M的使用6、使用旋转矩阵M手动实现旋转功能 1、图像旋转opencv实现 图像旋转在对数据集数据增强&#xff08;主要是随机…

Spring 声明式事务控制

1. 编程式事务控制相关对象 1.1 PlatformTransactionManager PlatformTransactionManager 接口是 spring 的事务管理器&#xff0c;它提供了我们常用的操作事务的方法。 PlatformTransactionManager 是接口类型&#xff0c;不同的 Dao 层技术则有不同的实现类。例如:Dao层技…

Sileo安装插件报错:Depends mobilesubstrate

Sileo安装插件报错 iOS 15.8系统&#xff0c;使用palera1n越狱&#xff0c;然后使用Sileo安装插件的时候&#xff0c;有些插件会报错&#xff1a;Depends mobilesubstrate&#xff08;比如AppStore plus&#xff09; 报错的原因分析 从提示信息很容易可以看出&#xff0c;当…

upload-labs第十一十二关

第十一关 $is_upload false; $msg null; if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],strrpos($_FILES[upload_file][name],".")1);if(in_array($file_ext,$ext_arr)){$temp_file $_FILES[upload_fil…

MySQL-进阶篇-一条sql更新语句是如何执行的(redo log和binlog)

上一篇&#xff1a;一条sql查询语句是如何执行的 http://t.csdnimg.cn/nV3EY 摘自&#xff1a;林晓斌MySQL实战45讲——第二篇 更新语句的执行过程与上一篇查询流程相同&#xff0c;本篇简写。 但多了两个重要的日志模块&#xff1a;redo log&#xff08;重做日志&#xff0…

leetcode:滑动窗口----3. 无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

利用穷举算法求一个整数数组A中的逆序对的个数(C语言)

目录 实验内容&#xff1a; 实验过程&#xff1a; 1.算法设计 2.程序清单 3.复杂度分析 4.实验结果 实验内容&#xff1a; 给定一个整数数组A&#xff08;a0,a1,…,an-1&#xff09;&#xff0c;若i<j且ai>aj&#xff0c;则<ai,aj>就为一个逆序对&#xff0c…

STM32电机控制SDK实战

一、前言 本次测试基于ST开发板NUCLEO-F302R8&#xff0c;驱动板X-NUCLEO-IHM07M1&#xff0c;使用无刷直流电机BLDC实现FOC控制&#xff1b;采样三霍尔传感器检测电机转子位置&#xff1b;基于速度环闭环控制实现电机转动&#xff1b; 二、实战环境 软件环境&#xff1a; 1…

布隆过滤器初探

1、什么是布隆过滤器 布隆过滤器是一个很长的二进制向量和一系列随机hash函数。布隆过滤器可以用于检索一个元素是否在一个集合中。 常见的hash函数的应用hashMap、hashSet等 回顾一下hashMap的结构 hashMap由数组链表红黑树&#xff08;java1.8后&#xff0c;链表元素长度大…

Redis入门到通关之GEO实现附近的人功能

文章目录 ☃️概述☃️命令演示☃️API将数据库表中的数据导入到redis中去☃️实现附近功能 ☃️概述 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。…

OpenHarmony 蓝牙相关API用法

介绍 本示例通过使用蓝牙低功耗心率服务&#xff0c;展示蓝牙相关API用法。实现了以下几点功能&#xff1a; 发现具有特定服务的设备。连接到设备。发现服务。发现服务的特征、如何读取给定特征的值、为特征设置通知等。 相关概念 BLE扫描&#xff1a;通过BLE扫描接口实现对…

【DA-CLIP】图像复原在AutoDL上部署测试

起因&#xff1a; 虽然在本机Windows部署成功运行&#xff0c;但是由于计算资源少只有6G的GPU无法计算手机拍摄图像复原和其他一些数据集测试&#xff0c;尝试租用AutoDL的服务器部署测试 租AutoDL 租的人很多&#xff0c;刚确定运行的镜像环境就报告说这个机子已经没卡了&am…