☺初识c++(语法篇)☺

目录

一·命名空间(namespace):

二·cout与cin简述:

三·缺省参数:

四·函数重载:

五·引用:

六·内联函数:

七·c++中的nullptr简述:


一·命名空间(namespace):

namespace ns {int t = 5;
}//习惯写法:namespace+名字,注:末尾无;

这里相当于命名空间域;访问的时候要ns::+内部的量

对于c++域的理解:可分为四大域:函数局部域,全局域,命名空间域,类域。

其中前两个影响编译逻辑和生命周期,后两者不影响。

对于命名空间特点:

首先它是可以嵌套的:

namespace ns {int i = 10;int a = 10;namespace ne {int a = 2;//命名空间的嵌套}
}

这时如果访问ne内的a:可以ns::ne::a;或者可以不完全展开即 using namespace ns::ne。

还有一个就是多文件定义同一个命名空间它会自动合并如:

在头文件中定义一个ns命名空间,在cpp中也存在ns命名空间,同时在cpp调用就可以用到头文件中的ns。

对于standard 命名空间,在iostream库里存在的cin cout 就定义在std这个命名空间里。

二·cout与cin简述:

cin输入的数据自动识别为字符型,cout输出也是类同。

前者配合>>后者配合<<,由于是二元操作符,故只能是两个操作数即里面要么是变量自动识别,要么是字符串。

结合endl(end line ):都是存在于iostream库中的namespace std,故可以对它展开或者std::来使用。

int k= 10;
int e = 0;
int main() {std::cout << "k是" << k<< endl;std::cin >> e >> k;std::cout << "k是" << k << endl;std::cout << "e是" << e << endl;}

为了提高io效率,可以在程序中加入:

ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

三·缺省参数:

顾名思义,就是对于函数有的参数没有的时候可以去固定值,也可以输入:

大致就是要从函数所有参数的右边开始缺省,到左边,但是不能跳跃,当传参的时候省略的可传可不传。

using namespace std;
namespace hs {int Func(int a, int b, int c = 10) {return a + b + c;}}
#if 0
int main() {cout << hs::Func(1, 2) << endl;}
#endif

这里由于为给传参,故用默认的即输出13。 

四·函数重载:

即重载在同一作用域下,参数个数不同或者类型不同而函数名相同可以构成重载。通过调用函数的时候传参个数或者类型来取决调用哪个函数。

如:

using namespace std;
namespace hs {int Func(int a, int b, int c = 10) {return a + b + c;}double Func(double a, int b, int c = 11) {return a + b + c;}
}
#if 0
int main() {cout << hs::Func(1.1, 2) << endl;}
#endif

这里调用的就是double类型的Func。(参数类型不同)

using namespace std;
namespace hs {int Func(int a, int b) {return a + b ;}int Func(int a, int b, int c = 11) {return a + b + c;}
}
#if 0
int main() {cout << hs::Func(1, 2) << endl;}
#endif

 这里调用的就是第一个Func。(参数个数不同),当然,也可以是参数顺序不同等等。

 而函数重载是为了能调用的时候根据输入区分开不同的函数,故当只有返回值不同时不能作为重载条件:

void fxx()
{}int fxx()
{return 0;
}

上面这样当调用的时候编译器无法区分。

void f1 ()
{
cout << "f()" << endl;
}
void f1 ( int a = 10)
{
cout << "f(int a)" << endl;
}//由于参数是不同的,可以构成重载,但是调用的时候如果不输入,编译器无法区分调哪一个。

五·引用:

即类型&引⽤别名=引⽤对象

相当于给它取了一个新的名字,但还是同一块内存区域,即地址不变,可以理解为改变的时候类似于指针操作。

因此就可以换一种方式交换两个数:

namespace yy {int c = 10;int& b = c;namespace jh {int m = 1;int n = 2;void swap(int& a, int& b) {int tmp = a;a = b;b = tmp;}}}
using namespace yy::jh;
#if 0
int main() {cin >> yy::c;cout << &yy::b <<'\n'<< & yy::c << endl;cout << m <<" "<< n << endl;swap(m, n);cout << m << " " << n << endl;
}
#endif

这里通过这个引用把m n的值交换了,但m n这块地址没有变,通过m n找到对应的地址把里面的数据改变。(因为a,b是m n的别名故改变a b即改变m n) 。

这里注意一旦引用实体,不能再引用其他:

int main() {int a = 10;int& b = a;int d = 11;b = d;cout << "b" <<&b<<"  "<<"a" << &a << "  " << "d" << &d << endl;return 0;
}

这里可以看出,a b还是同一块地址,b指向的地址里数据只是对d数据的一次拷贝,而不是让b这个实体再次引用d。 

const引用:对于权限引用:范围可以缩小,可以等同,但不能放大:

即:

const int a=10;
const int &b=a;//等同int c=10;
const int& d=c;//缩小

这里虽然地址是同一个,但访问权限不同。

再看着一个例子:

const int a=10;
int d=a;//这里并非扩大访问,只是把a值copy给d,两者地址不同

下面引出临对象:所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象。

而当在c++中经常会出现,那么把它就要当成常性对待,不可修改故用const修饰。

int a=10;int b=1;
const int &c=(a+b);
//这里a+b就是临时对象

再比如隐式类型转化出现的临时对象:

double d = 3.14;
int i = d;
const int& ra = d;
cout << i << " " << ra << endl;

六·内联函数:

 即用inline修饰的函数,设计出来代替宏:

而宏:采用直接替换,不开辟空间,但效率慢。

普通函数:开辟多余空间,即建立栈帧,效率高。

而内联函数结合了这两点:

即当使用内联函数,如果遇到短小函数,不复杂的则编译器按照宏的方式去直接替换;但是遇到比如有递归等,就会按照函数方式直接展开建立栈帧去执行如:

namespace nl{inline int add(int& a, int &b) {return a + b;}inline int Add(int a, int b) {if (a + b > 10) {return a + b;}return Add(a+3,b+3)+1;}
}
int main() {int m = 1, n = 2;cout << nl::add(m, n) << endl;//这里由于短小函数,故采用类似宏的直接替换。cout << nl::Add(m, n) << endl;//这里由于出现了递归故采用直接展开即开辟一定空间。return 0;
}

 再如c++库里面swap函数就用的inline修饰的内联函数;

适用范围:频繁调用的短小函数(非递归)。

七·c++中的nullptr简述:

C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换 成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被 隐式地转换为指针类型,⽽不能被转换为整数类型。类似c中的NULL。

void f(int x)
{cout << "f(int x)" << endl;
}
void f(int* ptr)
{cout << "f(int* ptr)" << endl;
}int main() {f(0);f(NULL);f(nullptr);return 0;}

这里对于c语言可能NULL可以这样,但是c++会直接识别为0;故在这里c++对空指针用nullptr。 

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

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

相关文章

聚焦云技术,探讨 AGI 时代的云原生数据计算系统

6月22日&#xff0c;开源中国社区在上海举办了 OSC 源创会活动&#xff0c;本期活动以「云技术」为主题&#xff0c;邀请了来自华为 openEuler、字节跳动、AutoMQ 等厂商的技术大咖进行分享&#xff0c;拓数派作为云原生数据计算领域的引领者&#xff0c;受邀参与了本次活动&am…

【IMU】 温度零偏标定

温度标定 IMU的零偏随着温度的变化而变化&#xff0c;在全温范围内形状各异&#xff0c;有些可能是单调的&#xff0c;有些可能出现拐点。 多项式误差温度标定 目的是对估计的参数进行温度补偿&#xff0c;获取不同温度时的参数值&#xff08;零偏、尺度、正交&#xff09;&…

Study--Oracle-06-Oracler网络管理

一、ORACLE的监听管理 1、ORACLE网络监听配置文件 cd /u01/app/oracle/product/12.2.0/db_1/network/admin 2、在Oracle数据库中&#xff0c;监听器&#xff08;Listener&#xff09;是一个独立的进程&#xff0c;它监听数据库服务器上的特定端口上的网络连接请求&#xff0c…

HTML5表单的自动验证、取消验证、自定义错误信息

1、自动验证 通过在元素中使用属性的方法&#xff0c;该属性可以实现在表单提交时执行自动验证的功能。下面是关于对元素内输入内容进行限制的属性的指定。 属性说明required输入内容是否不为空pattern输入的内容是否符合指定格式min、max输入的数值是否在min~max范围step判断…

【机器学习】基于密度的聚类算法:DBSCAN详解

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 基于密度的聚类算法&#xff1a;DBSCAN详解引言DBSCAN的基本概念点的分类聚类过…

计算机图形学入门24:材质与外观

1.前言 想要得到一个漂亮准确的场景渲染效果&#xff0c;不只需要物理正确的全局照明算法&#xff0c;也要了解现实中各种物体的表面外观和在图形学中的模拟方式。而物体的外观和材质其实就是同一个意思&#xff0c;不同的材质在光照下就会表现出不同的外观&#xff0c;所以外观…

idea推送到gitee 401错误

在idea上推送时遇到这样的问题&#xff0c;解决方法如下&#xff1a; 在https://的后面加上 用户名:密码 然后再提交就ok啦&#xff01;

在vue3中,手写父子关联,勾选子级父级关联,取消只取消当前子级,父节点不动

树形控件选择子级勾选父级&#xff0c;以及所有子级&#xff0c; 取消勾选仅取消子级 在项目中&#xff0c;可能会遇到这种场景&#xff0c;比如权限配置的时候&#xff0c;页面权限和菜单权限以tree的形式来配置&#xff0c;而且不用半选&#xff0c;菜单在页面的下面&#xf…

在AvaotaA1全志T527开发板上使用AvaotaOS 部署 Docker 服务

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。 准备…

小白轻松上手,Python编程常用的30个经典操作以及代码演示

当谈到经典的Python编程案例时&#xff0c;通常涉及各种基础和进阶的编程任务. 30个常见的案例&#xff0c;涵盖了从基本操作到稍复杂的应用&#xff1a; 基础操作 1.Hello World: 打印"Hello, World!"到控制台。 print("Hello, World!")2.变量和数据…

【LLM】三、open-webui+ollama搭建自己的聊天机器人

系列文章目录 往期文章回顾&#xff1a; 【LLM】二、python调用本地的ollama部署的大模型 【LLM】一、利用ollama本地部署大模型 目录 前言 一、open-webui是什么 二、安装 1.docker安装 2.源码安装 三、使用 四、问题汇总 总结 前言 前面的文章&#xff0c;我们已经…

一些关于C++的基础知识

引言&#xff1a;C兼容C的大部分内容&#xff0c;但其中仍有许多小细节的东西需要大家注意 一.C的第一个程序 #include <iostream> using namespace std;int main() {cout << "hello world!" << endl;return 0; } 第一次看这个是否感觉一头雾水…

【运维】磁盘满了怎么办?如何快速找到占用空间的文件和腾出空间

机器用久了&#xff0c;很容易生成很多临时或者无用的文件&#xff0c;占用大量空间造成磁盘不够用。尤其是服务器&#xff0c;当磁盘不够用时&#xff0c;系统会出现莫名其妙的问题&#xff0c;数据库可能会造成数据损坏。此时快速定位可以删除的大文件并及时释放空间&#xf…

Python深度学习

原文链接&#xff1a;Python深度学习https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608512&idx1&sn16e2a0bb6b0a1f6b513be173730090c0&chksmfa826927cdf5e031b702deb04eef5cb0055f65b0d6e4c33588949ee81c7380ee044caeafd8c7&token2068755524&am…

如何解决群晖Docker注册表查询失败/无法拉取镜像等问题

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 问题概述 📒📒 解决方案 📒🔖 方法一🔖 方法二🔖 方法三⚓️ 相关链接 🚓️📖 介绍 📖 在群晖(Synology)NAS设备上使用Docker时,我们可能会遇到查询Docker注册表失败,无法拉取Docker镜像的问题。这种情况…

nvm安装报错(镜像问题)

一、问题报错 安装的时候如果跟着网上早些时候的配置&#xff0c;调整了setting文件&#xff0c;配置镜像的话&#xff0c;可能报这个错误。 这个是因为他没检索到后面的链接地址&#xff0c;因为镜像的地址新的已经更换了。使用这个吧&#xff1a; node_mirror: https://npm…

【1】A-Frame整体介绍

1.A-Frame是什么&#xff1f; A-Frame 是一个用于构建虚拟现实 (VR) 体验的 Web 框架。 A-Frame 基于 HTML 之上&#xff0c;因此上手简单。但 A-Frame 不仅仅是 3D 场景图或标记语言&#xff1b;它还是一种标记语言。其核心是一个强大的实体组件框架&#xff0c;为 Three.js …

倒计时 2 周!CommunityOverCode Asia 2024 IoT Community 专题部分

CommunityOverCode 是 Apache 软件基金会&#xff08;ASF&#xff09;的官方全球系列大会&#xff0c;其前身为 ApacheCon。自 1998 年以来&#xff0c;在 ASF 成立之前&#xff0c;ApacheCon 已经吸引了各个层次的参与者&#xff0c;在 300 多个 Apache 项目及其不同的社区中探…

【操作与配置】VSCode配置Python及Jupyter

Python环境配置 可以参见&#xff1a;【操作与配置】Python&#xff1a;CondaPycharm_pycharmconda-CSDN博客 官网下载Python&#xff1a;http://www.python.org/download/官网下载Conda&#xff1a;Miniconda — Anaconda documentation VSCode插件安装 插件安装后需重启V…

刷代码随想录有感(130):动态规划——编辑距离

题干&#xff1a; 代码&#xff1a; class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>>dp(word1.size() 1, vector<int>(word2.size() 1));for(int i 0; i < word1.size(); i)dp[i][0] i;for(int j 0; j …