c++

简介: c++基础性内容

C++基础

函数重载

能够使用多个同名的函数,完成相同的工作,但使用不停的参数列表。

形象的理解,就是同一句话,有着不同的含义,在c++要根据上下文来确定其意思。

其主要的核心是特征标 ==参数数目/参数类型/参数顺序==

返回值没有特别的要求。

问题:C++是如何支持函数重载的?为什么C语言不支持函数重载呢?

主要符号表中表示歧义,函数命名c语言是以函数名来储存的,而C++是函数名+参数类型,同时链接的时候也存在冲突

list.h list.c test.c

代码处理的过程

1.预处理 头文件展开,宏替换,条件编译,去掉注释

list.i test.i

2.编译 检查语法,生成汇编代码

list.s test.s

3.汇编 汇编代码转为二进制机器代码

list.o test.o

4.连接 将多个个目标文件链接到一起

引用变量

引用变量时必须同时进行初始化,引用取别名时,变量访问的权限可以缩小,不能放大

例:

int c=1;
int &d=c;
const int &e=c;             //c是可读可写的,而e变成别名只读


int  a=10;
double db=i;                //隐士类型转化
double  & c=a;              //error
const double &c=a;          // right

//变量赋值没有权限的放大和缩小之分,引用才有用

引用返回值

#include<iostream>
int& add(int a, int b)
{
    static int c = a + b;
    return c;
}

int main()
{
    using namespace std;
    int& ret = add(1, 2);
    add(3, 4);
    cout << ret << endl;

总结:一个函数要使用引用返回值,返回变量出了这个函数的作用域还存在,就可以使用这个返回,否则就不安全。

使用引用返回的好处,少拷贝一个临时变量,提高程序效率

1.引用做参数

a.输出型参数

b.提高效率

2.引用做返回值

a.提高效率

b.后期补

指针和引用的区别

int a;
int& b=a;
int* p=&a;

引用是a的别名,语法上不开辟空间,在底层的应用中,实则是用指针来开辟空间

不同点:

1.引用在概念上定义一个变量的别名,指针存储一个变量的地址

2.引用在定义的时候必须初始化,指针没有这样的要求,但最好将指针设为空(NULL)

3.引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型的实体

4.没有NULL引用,但有NULL指针

5.在sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(在32位操作系统下是4个字节)

6.引用自加即引用的实体加一,指针自加即指针向后偏移一个类型的大小

7.有多级指针,但是没有多级引用

8.访问实体方式不同,指针需要显示解引用,引用编译器自己处理

9.引用比指针使用起来相对安全

内联函数

inline修饰的函数成为内联函数,编译时c++编译器会在调用内联函数的地方展开。

频繁调用函数是有消耗的,会建立栈帧

如何解决?

1.c语言使用宏函数

2.c++使用内联函数

内联函数在release模式下会进行展开,在debug模式下不会进行展开,需要对编译器进行设计,否则代码不会对其进行优化。

空间换时间。

后期补一下release和debug模式的区别。

1.一般内联适用于小函数,小于20行,其他的例如递归,或者比较长的都不太适用于内联

2.inline对于编译器而言只是一个建议,编译器会自动进行优化

3.内联是不能定义和声明分离的。

内联与宏

宏的优缺点:

优点:

1.增强代码的复用性

2.提高性能

缺点:

1.不方便调试宏。why?预编译的阶段进行了替换

2.导致了代码的可读性差,可维护性差,并且容易误用

3.没有类型安全的检查。

c++中替代宏的操作

#define  N 10
const  int  N = 10;
宏函数替换为内联函数。

auto关键字(C++11)

自动推导变量

#include<iostream>
int main()
{
int a=0;
auto b=a;         //根据a推导b的类型
auto& c=a;
auto d =&a;
}

C++中看一个变量的类型的操作:

count<<typeid(变量).name()<<endl;

注意当auto同一行多个变量时,得需是同一种类型的

auto不能推导的场景:

1.auto不能作为函数的参数

//不能作为形参类型,无法具体推导
void add(auto a);

2.不能直接用来声明数组

int a[10]={     };
auto b[ 10]={      }

3.避免c++98中的auto的混乱。c++11只保留了auto作为类型指示符的用法

4.后面讲到的c++11for还有一些表达式的用法。map的用法。简化代码得写法。

基于C++11范围for的用法

举个例子

//将数组中的值乘以2倍
//C语言的做法
#include<iostream>
int main()
{
int arry[]={1,2,3,4,5};
for(i=0;i<sizeof(arry)/ssizeof(int);i++)
   {
      arry[i]*=2;
   }
for(i=0;i<sizeof(arry)/sizeof(int);i++)
   {
       count<<arry[i]<<" ";
   }
   count<<endl;
}

//用for的用法      语法糖,写代码会进行简介点
for(auto& e : arry)
{
    e*=2;
}
for(auto e : arry)
{
    count<<e<<" ";
}
count<<endl;

基于范围for的操作对象是数组,

范围for的使用条件

1.for循环迭代的范围必须是确定的

对数组的而言,就是数组第一个元素和最后一个元素的范围

C++中的空指针的表达形式

c语言中一般表达空指针的形式为NULL,而C++中推荐的表达形式为nullptr->空指针。

NULL其实是一个宏定义,在C语言中,被定义为0,或者被定义为无类型指针(void*)的常量。

CONST修饰指针

const Date* p1;          //*p1,指向的对象
Date const * p2;         //*p2,指向的对象
Date* const p3;          //->p3,指向本身
//*之前的都是对象,*之后的是指针本身
相关文章
|
存储 C++ 索引
哈希表、集合、映射
哈希表、集合、映射
|
8月前
|
SQL 数据库 Windows
YashanDB Windows客户端安装
本文介绍YashanDB客户端(Windows)的安装、使用及卸载步骤。首先,下载并解压软件包至本地路径,配置环境变量。接着,通过cmd窗口使用yasql命令连接数据库,执行SQL操作。最后,卸载时删除相关环境变量和客户端目录。更多功能请参考官方文档。
YashanDB Windows客户端安装
|
7月前
|
机器学习/深度学习 人工智能 运维
AI“捕风捉影”:深度学习如何让网络事件检测更智能?
AI“捕风捉影”:深度学习如何让网络事件检测更智能?
258 8
|
8月前
|
存储 SQL NoSQL
【赵渝强老师】达梦数据库的逻辑存储结构
本文介绍了达梦数据库的存储结构,包括逻辑和物理存储两部分。逻辑存储结构由数据库(Database)、表空间(Tablespaces)、段(Segments)、簇(Cluster)和页(Page)组成。数据库是最大逻辑单元,包含所有表、索引等;表空间由数据文件组成,用于存储对象;段由簇构成,簇包含连续的数据页;页是最小存储单元。文中还提供了查询表空间、段和页大小的SQL语句,并附有视频讲解和示意图。
327 7
|
存储 JSON 网络安全
使用 EFS 在 AWS Lambda 上安装 Python 依赖项
使用 aws lambda 时,开发人员面临的常见挑战之一是管理大型 python 依赖项。
169 1
|
机器学习/深度学习 自然语言处理 Java
RAG VS Fine-Tuning模型微调详解
【11月更文挑战第20天】在深入探讨RAG(Retrieval-Augmented Generation,检索增强生成)与Fine-Tuning(模型微调)这两种技术之前,让我们先回顾一下它们的历史背景和发展脉络。
559 19
|
传感器 算法 物联网
智能停车解决方案之停车场室内导航系统(二):核心技术与系统架构构建
随着城市化进程的加速,停车难问题日益凸显。本文深入剖析智能停车系统的关键技术,包括停车场电子地图编辑绘制、物联网与传感器技术、大数据与云计算的应用、定位技术及车辆导航路径规划,为读者提供全面的技术解决方案。系统架构分为应用层、业务层、数据层和运行环境,涵盖停车场室内导航、车位占用检测、动态更新、精准导航和路径规划等方面。
979 4
|
传感器 C# 监控
硬件交互新体验:WPF与传感器的完美结合——从初始化串行端口到读取温度数据,一步步教你打造实时监控的智能应用
【8月更文挑战第31天】本文通过详细教程,指导Windows Presentation Foundation (WPF) 开发者如何读取并处理温度传感器数据,增强应用程序的功能性和用户体验。首先,通过`.NET Framework`的`Serial Port`类实现与传感器的串行通信;接着,创建WPF界面显示实时数据;最后,提供示例代码说明如何初始化串行端口及读取数据。无论哪种传感器,只要支持串行通信,均可采用类似方法集成到WPF应用中。适合希望掌握硬件交互技术的WPF开发者参考。
311 0
|
JavaScript 前端开发 算法
【JavaScript】JavaScript 垃圾回收机制深度解析:内存管理的艺术
JavaScript的内存管理和垃圾回收机制涉及栈内存与堆内存、引用计数与标记-清除算法。栈内存存储基本类型和函数调用时的局部变量,而堆内存用于复杂数据类型,如对象和数组。垃圾回收主要通过标记-清除策略,处理不再被引用的对象。现代引擎如V8使用分代收集和增量标记等优化方法,减少停顿并提升性能。开发者应注意避免内存泄漏,如及时解除引用、管理DOM引用和定时器,使用WeakMap和WeakSet等。理解这些原理和最佳实践对于编写高效代码至关重要。
311 5
|
数据采集 供应链 监控
一文看懂:MES定义和功能是什么,以及在数字化工厂的应用
MES是制造企业信息化的关键,适应个性化和敏捷制造需求,助力生产精益管理。作为数字化与智能化的核心,MES系统在数字化工厂中发挥重要作用,实现实时监控、资源优化和生产流程自动化。系统功能包括一站式生产业务流程、生产进度追踪、灵活功能修改、数据可视化和移动端报工。发展历程从数据采集到智能制造,现正向MOM发展,整合更多环节,强调数据实时性、智能化、灵活性和整体优化,以提升制造业效率和竞争力。