【C++】入门与过渡

【C++】入门与过渡

文章目录

  • 【C++】入门与过渡
    • 一、命名空间
    • 二、输入输出(cin/cout)
    • 三、缺省参数
    • 四、函数重载
    • 五、引用
      • 作用
      • 使用
      • 指针和引用的区别
    • 六、内联函数
    • 七、auto关键字
    • 八、空指针

注:本文为学习笔记,只记录了一些重点,有些比较简单的内容做了省略

一、命名空间

解决问题:对标识符的名称进行本地化,以避免命名冲突或名字污染

使用方法:

  • 命名空间名称及作用域限定符::,前面没有命名空间表示全局
  • 使用using将命名空间中成员引入
  • 使用using namespace 命名空间名称引入

注意:

  • 命名空间可以嵌套
  • 同名的命名空间将被合并
  • 命名空间影响的是编译查找规则。使用命名空间后,查找范围为:局部、全局、命名空间
  • 一般练习用哦namespace,实际项目最好不用

示例:

std::cout << "hello world";
using std::cout;
using namespace std;

二、输入输出(cin/cout)

使用:

#include <iostream>int main() {std::cout << "input: ";int a = 0;std::cin >> a;std::cout << "output: " << a << std::endl;return 0;
}

注意:取消缓冲区同步语句 std::ios::sync_with_stdio(false)

三、缺省参数

作用:缺省参数是声明或定义函数时为函数的参数指定一个默认值

分类:

  • 全缺省参数void test(int a = 1, int b = 2, int c = 3)
  • 部分缺省参数void test(int a, int b = 1, int c = 2)

注意:

  • 半缺省参数必须从右往左依次来给出,不能出现间隔
  • 缺省参数不能在函数声明和定义中同时出现。若声明和定义进行分离,需要使用缺省参数,必须在声明中给出。
  • 缺省值必须是常量或者全局变量

四、函数重载

作用:C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)不同

使用

int Add(int left, int right);
int Add(int left, int right,int temp);int Add(int left, int right);
double Add(double left, double right);double Add(double left, int right);
double Add(int left, double right);

注意:

  • 类型将自动识别
  • 会影响编译速度,但不会影响运行速度
  • 同一作用域
  • double与float的传参区分需要注意后缀有没有f
  • 可以从函数名修饰的规则来理解重载,返回值不同不能构成重载

原理补充:

  • c++函数名修饰规则,从而区别不同函数,不同平台修饰规则是不同的。
  • c++将会用修饰以后函数名去寻找函数的地址

五、引用

作用

给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间

使用

  • 定义,相当于给已存在变量取了一个别名,用不同的变量名来标识同一块地址空间;

    int a = 0;
    int& b = a;
    
  • 输出型参数,此时形参的改变会影响实参;

    void swap(int* p1, int* p2);
    void swap(int& r1, int& r2);
    
  • 传引用返回,出了作用域返回的变量还在。调用函数栈帧的销毁,不影响返回值的生命周期;

    如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。多用于:静态变量、全局变量、上一层栈帧、堆区等。

    // 引用返回 1、减少拷贝 2、调用者可以修改返回对象
    int& PosAt(AY& ay, int i){return ay.a[i];
    }
    int main(){int ret = Count();AY ay;for (int i = 0; i < N; ++i){PosAt(ay, i) = i*10;}for (int i = 0; i < N; ++i){cout << PosAt(ay, i) << " ";}cout << endl;return 0;
    }
    

  • 区分引用和取地址,类型+&为引用,&+变量为取地址

  • 引用定义时必须初始化

  • 一个变量可以存在多个引用

  • 引用一旦引用一个实体,不能再引用其他实体

  • 值和引用的作为返回值类型的性能比较下,引用的作为返回值性能可能更优秀。

  • 常引用:赋值/初始化时,权限可以不变或者缩小,但是不能放大(指针同理)

    临时变量具有常性,函数返回为临时变量、类型转换(中间会产生临时变量),也只能用常引用

    const int a = 2;
    //int& b = a; 错误
    const int& b = a; //正确
    

指针和引用的区别

  • 语法概念:引用没有开空间,指针开辟了空间并存入了地址。引用在语法的层面上是变简单了
  • 底层实现:也是开辟了一个空间,将有效地址写入。从汇编上看引用也是用指针实现的
  • 引用必须初始化,指针没有要求
  • 引用一个实体后,不能再引用其他实体,指针没有要求
  • 没有NULL的引用,但有空指针
  • sizeof的含义不同
  • 自增自减的意义不一样
  • 有多级指针,但是没有多级引用
  • 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  • 引用比指针使用起来相对更安全

六、内联函数

定义:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。

使用

inline void test(int i){cout << i << endl;
}

注意

  • 替换宏函数:宏的缺点是纯粹简单的替换,无法调试,没有安全的类型检查并且在有些场景中非常的复杂
  • 因此cpp推荐使用const和enum替换宏常量,inline替代宏函数
  • 在使用inline后,就不会建立函数栈帧(需要在release模式下才能观察到)
  • 是一种以空间换时间的做法,省去调用函数额开销,但是如果存在循环将可能造成空间浪费,因为会在每处调用处进行指令展开
  • 编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联
  • inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到(可以直接在.h文件里面直接定义)
  • 可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数,因为inline函数会在调用的地方展开,所以符号表中不会有inline函数的符号名,不存在链接冲突。

七、auto关键字

作用:

  • 编译器自动推导变量类型,作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得
  • 当类型很长时,可以简化代码

使用

  • 自动判断类型

    int a = 10;
    auto b = a;
    
  • 范围for 意义和使用:自动依次取数组中数据赋值给e对象,自动判断结束

    注意:for循环迭代的范围必须是确定的;迭代的对象要实现++和==的操作

    void test(){int array[] = { 1, 2, 3, 4, 5 };for(auto& e : array) e = 1;for(auto e : array)cout << e << " ";return 0;
    }
    

注意

  • 缺点:无法显示获取变量的类型
  • auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型
  • auto*auto&,分别限定了必须为指针和引用
  • 同一行定义多个变量:当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量
  • 不能使用的场景:不能作为函数的参数,不能用于声明数组

八、空指针

NULL与nullptr的区别:

  • NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量

    #ifndef NULL
    #ifdef __cplusplus
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif
    #endif
    
  • 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的

  • 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同

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

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

相关文章

使用boost.hana在编译期加密字符串

在当今数字时代&#xff0c;软件安全问题愈发凸显&#xff0c;攻击者利用各种手段对应用程序进行破解和逆向工程的尝试也日益猖獗。其中&#xff0c;通过使用OllyDbg、IDA等软件加载应用程序&#xff0c;分析程序中的字符串&#xff0c;进而找到关键条件判断&#xff0c;实施软…

【python】进阶--->MySQL数据库(一)

一、mysql数据库 关系型数据库 &#xff1a; 一些相关的表和其他数据库对象的集合。 表是由行和列组成。列包含一组命名的属性(也称为字段)。 行包含一组记录&#xff0c;行和列的交集称为数据项(也叫字段值)。 数据库(database) : 存储数据的仓库&#xff0c;本质上就是一个文…

《C++ Primer》第14章 重载运算与类型转换(二)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 14.8 函数调用运算符&#xff08;P506&#xff09; 如果类重载了函数调用运算符&#xff0c;则我们可以像使用函数一样使用该类的对象。这样的类同时也能存储状态&#xff0c;所以它们比普通函数更加灵活。…

x-cmd pkg | czg - git commit 智能生成工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 czg 源于 commitizen/cz-cli 交互插件中 cz-git 的延伸项目&#xff0c;重新使用 TypeScript 编写的零依赖独立的 Node.js 命令行工具。旨在使用交互友好的方式&#xff0c;辅助用户生成规范的 git commit message 约…

游泳耳机哪种款式好?最值得入手的游泳耳机大全

在如今注重健康和娱乐的生活方式中&#xff0c;游泳作为一项全身性的运动备受欢迎。然而&#xff0c;对于热爱水中活动的人们来说&#xff0c;选择一款出色的游泳耳机至关重要。好的游泳耳机不仅能提供清晰的音质&#xff0c;还能有效防水&#xff0c;让您在水中尽情畅游的同时…

MySQL中约束是什么?

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

记录由客户端http请求原因引起的5xx响应问题排查过程

看到 http 状态码 5xx&#xff0c;很多开发者第一感觉就是服务端的问题&#xff0c;其实并不全是。下面我遇到的问题就是一个例外。 问题描述 最近在为反向代理 nginx 配置 auth_request 后&#xff0c;出现了请求504错误。 504状态码是HTTP协议中的一种服务器错误状态码。当…

Windows压缩包的MySQL安装方式

1.下载压缩包 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.35-winx64.zip 2.解压压缩包&#xff08;建议将解压到非C盘&#xff0c;路径不要出现特殊符号&#xff09; 3.在MySQL主目录下&#xff0c;创建my.ini空文件&#xff08;先创建一个txt文件&#xff0c;进…

如何改造现有文件为 CMD 模块

如何改造现有文件为 CMD 模块 经过一段考察&#xff0c;我们终于要在项目中引入模块机制和 Sea.js 了&#xff0c;那么如何将现有的文件改造成 CMD 模块就成了重要的问题。下面针对一些典型场景来说明包装的方式。 首先还是请大家详细了解下 CMD 模块定义规范&#xff0c;只要…

JavaScript删除数组中指定元素的5种方法

文章目录 目录 文章目录 前言 一、数组是什么&#xff1f; 二、讲解数组 总结 前言 在JavaScript开发中&#xff0c;处理数组是一项非常常见的任务。有时候我们需要从数组中删除特定的元素&#xff0c;以便对数组进行进一步操作或者满足特定的需求。幸运的是&#xff0c;JavaS…

Unity中URP下实现能量罩(外发光)

文章目录 前言一、实现菲涅尔效果1、求 N ⃗ \vec{N} N 2、求 V ⃗ \vec{V} V 3、得出菲涅尔效果4、得出菲涅尔相反效果5、增加菲涅尔颜色二、能量罩 交接处高亮 和 外发光效果结合1、修改混合模式,使能量罩透明2、限制 0 ≤ H i g h L i g h t C o l o r ≤ 1 0\leq HighL…

【字符串】贝贝的车牌问题(UPC)

题目描述 广州市车管所为每一辆入户的汽车都发放一块车牌&#xff0c;车牌的号码由六个字符组成&#xff0c;如A99452、B88888等&#xff0c;这个字符串从左边数起的第一个字符为大写英文字母&#xff0c;如A、B、C等&#xff0c;表示这辆车是属于广州市区内的汽车还是郊区的汽…

Swoft - Bean

一、Bean 在 Swoft 中&#xff0c;一个 Bean 就是一个类的一个对象实例。 它(Bean)是通过容器来存放和管理整个生命周期的。 最直观的感受就是省去了频繁new的过程&#xff0c;节省了资源的开销。 二、Bean的使用 1、创建Bean 在【gateway/app/Http/Controller】下新建一个名为…

7.vue学习笔记(模板引用+组件组成+组件嵌套关系)

文章目录 1.模板引用2.组件组成3.组件嵌套关系3.1.App.vue3.1.1.Header.vue3.1.2.Main.vue3.1.3.Aside.vue 1.模板引用 在Vue直接读取DOM 虽然Vue的声明性渲染模型为你抽象了大部分对DOM的直接操作&#xff08;事件&#xff0c;内容&#xff0c;属性&#xff09;&#xff0c; …

持久双向通信网络协议-WebSocket-入门案例实现demo

1 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP是短连接&#xff0…

Edge 浏览器设置自动刷新

要在 Microsoft Edge 浏览器中设置自动刷新&#xff0c;您可以使用第三方扩展来实现这一功能。目前&#xff0c;Edge 浏览器本身并没有内置的自动刷新功能。以下是启用自动刷新的一般步骤&#xff1a; 打开 Microsoft Edge 扩展商店&#xff1a;首先&#xff0c;在 Edge 浏览器…

【MATLAB】小波_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 小波-LSTM神经网络时序预测算法是一种结合了小波变换和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 小波变换是一种信号处理方法&#xff0c;能够将信号分解为…

Postman应用打开超级慢解决办法

电脑系统环境变量增加 POSTMAN_DISABLE_GPUtrue 电脑系统环境变量增加 POSTMAN_DISABLE_GPUtrue 电脑系统环境变量增加 POSTMAN_DISABLE_GPUtrue 电脑系统环境变量增加 POSTMAN_DISABLE_GPUtrue 电脑系统环境变量增加 POSTMAN_DISABLE_GPUtrue 电脑系统环境变量增加 POSTMAN_DI…

<蓝桥杯软件赛>零基础备赛20周--第14周--BFS

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

发布_Windows系统服务器发布Java程序

windows服务器发布Java程序 一般来说再Windows服务器上发布就直接使用cmd&#xff0c;然后使用javaw -jar ****.jar但是使用这种方法有两种环境同时再此服务器上时&#xff08;生产环境和测试环境&#xff09;&#xff0c;直接再任务管理器中杀死javaw进程就会混乱&#xff0c…