当前位置: 首页 > news >正文

C++: 命名空间/C++输入输出/缺省参数/函数重载/引用/内联函数

进入C++以后,就翻开了新的篇章。C++支持C语言的使用。事实上,C++是创建者在发现C语言中有很多不好用的地方(在后续学习中会明显看到)后,在C语言基础上又加入了许多语法,于是就成了C++。

1.命名空间

来源:在C语言中,同一个作用域内,可能会发生命名重复,命名冲突的问题。如果代码量一多,那么命名冲突很难避免。在C++中,就增加了命名空间。

定义:namespace + 空间的名字 。空间名字是自定义的。比如zhangsan。

namespace zhangsan
{int rand = 0;int add(int a, int b){return a+b;}struct STNode{int val;STNode* next;};
}

这样就把自己定义的函数,变量,结构体限定在这个命名空间内。那么别人就不能随意访问了。除了定义变量、函数和结构体外,命名空间也可以嵌套。

命名空间的访问

1.空间名::成员名。   ::这个符号是作用域限定符。

int main ( )
{int a = zhangsan::rand;return 0;
}

2.用using 将命名空间的某个成员引入。个人理解,这相当于把这个空间内的成员声明在想使用的地方了。

using zhangsan::rand;
int main()
{int a = rand;return 0;
}

3.using namespace 空间名。和2有点相似,上面展开的只是某个成员,现在展开的是这个空间了。

using namespace zhangsan;
int main()
{int a = rand;add(2,3):struct STNode s1;return 0;
}

如上图所示,此时在main函数中就可以不加限定范围操作符而使用命名空间中的各种成员了。

2.C++输入和输出

#include <iostream>
using namespace std;int main()
{cout<<"hello"<<endl;return 0;
}

注意

a.使用cout 标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含头文件<iostream>,以及按照命名空间使用方法 使用std。

b.cout 和cin 是全局的流对象,endl是特殊的C++符号,表示换行输出。他们都包含在<iostream>头文件中。

c.<<是流插入,>>是流提取。

d.C++的输入输出可以自动识别变量类型,而不需要手动添加占位符。

cout和cin分别是ostream和istream的对象,<< 和>>也涉及运算符重载。此处不做扩展。

早期标准库基本都在全局域中实现,想要用的时候加上对应的.h头文件就可以。为了和C语言进行区分,C++的头文件不再加.h后缀。因此推荐使用<iostream>和std的方式。

std是C++标准库的命名空间名字,C++将标准库的定义实现都放在这个命名空间中。如果只在某个区域内使用,不必要在全局用,以免自己命名和函数名相撞产生命名冲突这种问题。只需要展开常用的头文件就可以了。

#include <iostream>int main()
{using std::cout;cout<<"hehe"<<"  "<<endl;return 0;
}

3.缺省参数

缺省参数是声明或者定义函数时,给参数一个缺省值,在调用这个函数时,如果没给实参,就用默认的缺省值,如果给了实参就用实参。

void func(int i = 10)
{cout<<"i"<<endl;
}
int main()
{func();func(2);return 0;
}

缺省参数分为全缺省和半缺省。

a.全缺省就是每一个形参都给了缺省值。

b.半缺省是部分没给。但需要注意的是半缺省只能从右往左给值,中间不能隔几个不给的。

c.缺省参数不能在声明和定义同时出现,同时出现而缺省值给的不同,编译器就不知道给哪个值了,所以不能同时出现。

d.缺省值必须是常量。

e.C语言不支持。

4.函数重载

C++允许在同一作用域中,声明几个功能相似的同名函数。这些函数由于形参的不同(类型不同,类型的顺序不同,个数不同)而能够同时使用。就是构成了函数重载。这些不同不包括返回类型不同。

为什么C++支持函数重载,C语言不支持?

一个程序要运行起来,需要经过预处理、编译、汇编、链接四个阶段。

链接的时候,面对一个函数,C语言中链接器会用函数名去找这个函数。

C++不一样,每个编译器都有自己的函数名修饰规则,在gcc中,是Z+函数名长度+函数名+形参类型的首字母。所以由于函数形参不一样而找到对应的函数,不会找错和搞混。

C语言没办法支持重载,因为它只能通过函数名去找,没法区分。C++是通过函数修饰规则区分,参数不同,修饰的名字就不一样,所以能够支持重载。

5.引用

引用不是新定义了一个变量,而是给变量取了个别名,它和被引用的变量共用一块空间。只是把原来的变量换了一种叫法。

void func ( )
{int a = 10;int& b = a;cout<<"a"<<"  "<<"b"<<endl;cout<<"&a"<<"  "<<"&b"<<endl;
}

引用特性

1.引用在定义时必须初始化

2.一个变量可以有多个引用

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

使用须知

1.引用可以权限缩小,但不能权限放大。

比如被引用的变量是int,可以定义一个常属性的变量来引用。

但是当被引用的是常量,就不能定义一个变量来引用它了。

2.做参数

void swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}

3.做返回值

下面这种写法是错的。因为b的范围只在作用域内。出了作用域空间被销毁,b的值就是随机的了。而返回值是b的引用,所以返回值也是随机的。而m又是返回值的引用。m获取的数值也是随机的。非法访问不属于自己的空间。

int& add(int a, int b)
{b = a+1;return b;
}int main()
{int& m = add(1,0);return 0;
}

因此做返回值的时候,要保证返回值出了作用域后,在上一层调用的空间依然存在。才可以是合法的使用。这种情况,由于已经返回给操作系统了,所以不能用引用返回,只能用传值返回。

传值返回:以这个例子来说,main函数在调用add函数时,由于add有返回值,所以建立栈帧的时候会提前由寄存器提供一块临时空间用来拷贝返回的值。所以传值调用是有空间损耗的,如果返回的值太大,就不是寄存器提供的了。会产生更多的空间消耗。

传引用的话,并不会新开辟一块空间,而是在原变量上,同一块空间中进行操作。所以传引用比传值返回效率高很多。特别在返回的值比较大的时候。

引用和指针的区别

1.引用必须初始化,指针可以不初始化。

2.引用一旦引用了一个变量,就不能更改。指针可以随意更改指向的空间。

3.引用在sizeof使用时是变量占用的空间大小,而指针始终是4/8个字节。

4.没有空引用,但有空指针。

5.引用自加是变量+1,指针是往后偏移一个类型大小

6.引用是定义变量别名,指针是储存地址

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

8.指针在访问实体时要解引用,引用是编译器自己处理

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

6.内联函数

以inline修饰的函数叫内联函数,内联函数在使用时,编译器在编译期间会把这个函数体直接展开,而不是调用。调用的话需要建立栈帧。就减少了这部分的空间开销。提升函数运行的效率。

特点

inline是一种以时间会空间的做法,虽然将函数体展开了减少了空间的损耗,但同时也会使目标文件变大。

内联函数对于编译器来说只是一个建议,不同编译器对于inline的实现机制是不一样的。很多编译器都不支持内联递归函数。内联函数一般用于代码量少、频繁调用、流程直接的函数。超过75行的函数不大可能在调用点内联地展开。

inline不支持声明和定义分离。因为inline被展开,就没有函数地址了。链接就找不到。

宏的优缺点?

优点:

1.不限类型

2.增强代码复用性

3.提高性能

缺点

1.不方便调试宏

2.没有类型检查,不安全

3.代码可读性差,可维护性差,容易误用。

C++中可以替代宏的部分功能有哪些?

1.短小函数可以用inline

2.常量定义用枚举,const enum。

相关文章:

C++: 命名空间/C++输入输出/缺省参数/函数重载/引用/内联函数

进入C以后&#xff0c;就翻开了新的篇章。C支持C语言的使用。事实上&#xff0c;C是创建者在发现C语言中有很多不好用的地方&#xff08;在后续学习中会明显看到&#xff09;后&#xff0c;在C语言基础上又加入了许多语法&#xff0c;于是就成了C。 1.命名空间 来源&#xff…...

Java | Leetcode Java题解之第13题罗马数字转整数

题目&#xff1a; 题解&#xff1a; class Solution {Map<Character, Integer> symbolValues new HashMap<Character, Integer>() {{put(I, 1);put(V, 5);put(X, 10);put(L, 50);put(C, 100);put(D, 500);put(M, 1000);}};public int romanToInt(String s) {int …...

题目:学习使用register定义变量的方法。

题目&#xff1a;学习使用register定义变量的方法。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated …...

IO_DAY7

1:实现2个终端之间的互相聊天 要求:千万不要做出来2个终端之间的消息发送是读一写的&#xff0c;一定要能够做到&#xff0c;一个终端发送n条消息&#xff0c;另一个终端一条消息都不回复都是没有问题的 终端A&#xff1a; #include<myhead.h> int main(int argc, char…...

大模型学习笔记八:手撕AutoGPT

文章目录 一、功能需求二、演示用例三、核心模块流程图四、代码分析1&#xff09;Agent类目录创建智能体对象2&#xff09;开始主流程3&#xff09;在prompt的main目录输入主prompt和最后prompt4&#xff09;增加实际的工具集tools&#xff08;也就是函数&#xff09;5&#xf…...

Java常用API_System——常用方法及代码演示

1.System.exit(int status) 方法的形参int status为状态码&#xff0c;如果是0&#xff0c;说明虚拟机正常停止&#xff0c;如果非0&#xff0c;说明虚拟机非正常停止。需要将程序结束时可以调用这个方法 代码演示&#xff1a; public class Test {public static void main(S…...

neo4j图数据库下载安装配置

neo4j下载地址Index of /doc/neo4j/3.5.8/ 1.说明&#xff1a;jdk 1.8 版本对应的 neo4j 数据库版本 推荐安装3.X版本 2.配置系统环境变量 3.启动 neo4j.bat console 4.访问...

结构化面试-有矛盾的人际沟通题

例题一&#xff1a; 你和小张一起值班&#xff0c;但是小张没来&#xff0c;刚好领导检查发现后批评了他&#xff0c;事后小张埋怨你&#xff0c; 认为你在领导面前表现&#xff0c;并在同事中传播&#xff0c;同事也觉得你不通人情&#xff0c;你怎么处理&#xff1f; 回答&a…...

AI技术创业机会之金融科技

金融科技服务(FinTech)领域正经历着一场由人工智能(AI)技术引领的深刻变革,为创业者提供了无数创新与颠覆传统金融服务模式的机会。以下详述了金融科技服务中AI技术的具体创业机会及其细节与内容,以期为有志于涉足此领域的创业者提供全面的洞察与参考。 一、智能投顾与财…...

LC低通滤波

LC滤波器&#xff0c;是指将电感L与电容器 C进行组合设计构成的滤波电路&#xff0c;可去除或通过特定频率的无源器件。电容器具有隔直流通交流&#xff0c;且交流频率越高越容易通过的特性。而电感则具有隔交流通直流&#xff0c;且交流频率越高越不易通过的特性。因此&#x…...

CS162 Operating System笔记

What is an Operating System? it’s typically a special layer of software that provides the application access to hardware resources.So.it’s convenient abs fractions of complex hardware devices....

mysql慢sql排查与分析

当MySQL遇到慢查询&#xff08;慢SQL&#xff09;时&#xff0c;我们可以通过以下步骤进行排查和优化&#xff1a; 标题开启慢查询日志&#xff1a; 确保MySQL的慢查询日志已经开启。通过查看slow_query_log和slow_query_log_file变量来确认。 如果没有开启&#xff0c;可以…...

基于Springboot+Vue实现前后端分离酒店管理系统

一、&#x1f680;选题背景介绍 &#x1f4da;推荐理由&#xff1a; 近几年来&#xff0c;随着各行各业计算机智能化管理的转型&#xff0c;以及人们经济实力的提升&#xff0c;人们对于酒店住宿的需求不断的提升&#xff0c;用户的增多导致酒店管理信息的不断增多&#xff0c;…...

2024泰迪杯c题详细思路代码讲解:竞赛论文的辅助自动评阅

C&#xff1a;竞赛论文的辅助自动评阅 步骤一&#xff1a;理解拆解题目&#xff0c;并对附件1中的论文集进行初步分析。 步骤二&#xff1a;特征构造 论文完整性&#xff1a;开发算法以检查论文是否全面回答了赛题。这包括自然语言处理(NLP)技术来识别关键段落和论证的完整…...

【GEE实践应用】GEE下载遥感数据以及下载后在ArcGIS中的常见显示问题处理(以下载哨兵2号数据为例)

本期内容我们使用GEE进行遥感数据的下载&#xff0c;使用的相关代码如下所示&#xff0c;其中table是我们提前导入的下载遥感数据的研究区域的矢量边界数据。 var district table;var dsize district.size(); print(dsize);var district_geometry district.geometry();Map.…...

Excel 文件底部sheet 如何恢复

偶然打开一个excel文件&#xff0c;惊奇地发现&#xff1a;原来excel文件底部的若干个sheet居然全都看不到了。好神奇啊。 用其它的电脑打开同样的excel文件&#xff0c;发现&#xff1a;其实能看到的。说明这个excel文件并没有被损坏。只要将修改相关设置。就可以再次看…...

spring boot3登录开发-3(2短信验证登录/注册逻辑实现)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 上文衔接 内容简介 功能分析 短信验证登录实现 1.创建交互对象 用户短信登录/注册DTO 创建用户登录VO…...

ChernoCPP 2

视频链接&#xff1a;【62】【Cherno C】【中字】C的线程_哔哩哔哩_bilibili 参考文章&#xff1a;TheChernoCppTutorial_the cherno-CSDN博客 Cherno的C教学视频笔记&#xff08;已完结&#xff09; - 知乎 (zhihu.com) C 的线程 #include<iostream> #include<th…...

【JavaEE】_Spring MVC项目获取Header

目录 1. 使用Servlet原生方法获取Header 2. 使用Spring注解获取Header 1. 使用Servlet原生方法获取Header .java文件内容如下&#xff1a; package com.example.demo.controller;import com.example.demo.Person; import org.springframework.web.bind.annotation.*; impor…...

JavaScript - 请你为数组自定义一个方法myFind,使其实现find方法的功能

难度级别:中级及以上 提问概率:50% 我们知道数组的find方法是ES6之后出现的,它强调找到第一个符合条件的元素后即跳出循环,不再继续执行,那么如果不用ES6的知识,为数组添加一个自定义方法实现find方法的功能,首先要想到在数组的原型pro…...

DSOX3034T是德科技DSOX3034T示波器

181/2461/8938产品概述&#xff1a; 特点: 带宽:350 MHz频道:4存储深度:4 Mpts采样速率:5 GSa/s更新速率:每秒1000000个波形波形数学和FFT自动探测接口用于连接、存储设备和打印的USB主机和设备端口 触摸: 8.5英寸电容式触摸屏专为触摸界面设计 发现: 业界最快的无损波形更…...

Golang | Leetcode Golang题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; func myAtoi(s string) int {abs, sign, i, n : 0, 1, 0, len(s)//丢弃无用的前导空格for i < n && s[i] {i}//标记正负号if i < n {if s[i] - {sign -1i} else if s[i] {sign 1i}}for i < n && s[i] >…...

3月份全球市场推出的24款网络安全热点产品和服务:应用安全和生成式AI应用是热点

CSO在线追踪了3月份全球市场推出的代表性网络安全产品和服务&#xff0c;从中可以观察网络安全产品创新趋势和风向。 1、Bedrock Security的数据安全平台应对云和生成式AI带来的风险 3 月 26 日&#xff1a; Bedrock Security 推出了数据安全平台&#xff0c;旨在帮助组织防范…...

如何在微信小程序中使用less来编写css

在微信小程序中使用 Less 需要一些额外的配置步骤,因为小程序本身不支持直接引用 Less 文件。我们可以借助 Webpack 进行构建,使用一些 loader 来编译 Less 文件。以下是具体步骤: 初始化项目 使用微信开发者工具新建一个小程序项目,或在已有项目的基础上操作。 安装依赖 使…...

【Leetcode】【240407】678. Valid Parenthesis String

It’s time to go back home, today’s in tomorrow lol BGM&#xff1a;无地自容(黑豹乐队《黑豹》) Descripition Given a string s containing only three types of characters: ‘(’, ‘)’ and ‘*’, return true if s is valid. The following rules define a valid…...

移动平台相关(安卓)

目录 安卓开发 Unity打包安卓 ​编辑​编辑 BuildSettings PlayerSettings OtherSettings 身份证明 配置 脚本编译 优化 PublishingSettings 调试 ReMote Android Logcat AndroidStudio的调试 Java语法 ​编辑​编辑​编辑 变量 运算符 ​编辑​编辑​编辑​…...

[C++][算法基础]食物链(并查集)

动物王国中有三类动物 A,B,C&#xff0c;这三类动物的食物链构成了有趣的环形。 A 吃 B&#xff0c;B 吃 C&#xff0c;C 吃 A。 现有 N 个动物&#xff0c;以 1∼N 编号。 每个动物都是 A,B,C 中的一种&#xff0c;但是我们并不知道它到底是哪一种。 有人用两种说法对这 N…...

深入理解Transformer的位置编码机制

Transformer架构由于其独特的设计&#xff0c;不像传统的循环神经网络&#xff08;RNN&#xff09;或卷积神经网络&#xff08;CNN&#xff09;&#xff0c;它无法自然地处理序列数据中的顺序信息。为了使模型能够理解序列中各元素的位置关系&#xff0c;Transformer引入了一种…...

10分钟上手:MySQL8的Json格式字段使用总结干货

一、关于效率和适用范围 尽管官方承诺Json格式字段采用了空间换时间的策略&#xff0c;比Text类型来存储Json有大幅度的效率提升。但是Json格式的处理过程仍然效率不及传统关系表&#xff0c;所以什么时候用Json格式字段尤为重要。 只有我们确定系统已经能精确定位到某一行&am…...

OpenCV 4.9基本绘图

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV使用通用内部函数对代码进行矢量化 下一篇:使用OpenCV4.9的随机生成器和文本 ​目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 line() 画一…...