了解一下c++的小语法——步入c++

news2025/1/23 22:44:02

前言:c++是一门既面向对象又面向过程的语言。 不同于java纯粹的面向对象和c纯粹的面向过程。 造成c++该特性的原因是c++是由本贾尼大佬在c的基础上增添语法创建出来的一门新的语言。 它既兼容了c, 身具面向过程的特性。 又有本身的面向对象的特性。 

面向对象和面向过程的区别:

我们可以以将大象关进冰箱为例子。 如果是c语言的话。它只会关注将大象关进冰箱的过程——打开冰箱门, 将大象关进冰箱, 关闭冰箱。但如果是c++的话,它会关注解决这个问题的对象——人, 大象, 冰箱。 

然后c语言的函数解决的就是每一步骤如何做才能将大象装进行冰箱。c++的函数就是定义在对象的类里作为成员函数,作为这个对象解决问题的手段, 方法。

目录

命名空间

域操作符

展开命名空间

c++的输入和输出

缺省参数

 函数重载

引用

内联函数

空指针nullptr


命名空间

命名空间解决的是变量重命名的问题。 在c语言中,当我们向定义一个变量, 这个变量的变量名和库中的函数或者其他重复了。

#include<stdlib.h>

int main()
{
    int rand;//这时会和stdlib.h中的rand生成随机数函数重复。 c语言除了将变量名改掉没有办法。
    return 0;
}

 可能这个问题你认为只要改一下变量名就好了。但是如果是在公司之中。 那个时候许多人共同开发一个程序。 不可避免地会有变量名重复的问题。 如果事先商量好说“谁谁谁这么取名, 谁谁谁那么取名。”或者说如果两个人定义的变量名冲突后就商议一下谁改掉谁的程序中所有的这个变量的变量名。 这个就太烦了。 所以本贾尼大佬针对这个问题就创建出来了命名空间, 有效的解决了这个问题。 

域操作符

namespace name
{
	int A() 
	{
		return 1;
	}
}

int main() 
{
	int A = 0;//因为A函数是在命名空间name中定义的。 所以函数A不会和这里的变量A重命名。

	cout << A << endl;

	return 0;
}


想要使用命名空间内的函数或者变量。 有两种方法:一种是使用“::”作用域操作符一种是直接将作用域展开。

namespace name
{
	int A() 
	{
		return 1;
	}
}


int main() 
{
	//int A = 0;//因为A函数是在命名空间name中定义的。 所以函数A不会和这里的变量A重命名。
	name::A();//::前面加作用域, 如果是全局就不写作用域


	return 0;
}

::前面加作用域, 如果是全局就不写作用域

这里打印的A前面加了域操作符。 且查找的是全局

展开命名空间

我们正常情况下直接包含头文件

#include<iostream>

int main() 
{

	int i = 0;
	cout << i << endl;//编译不过

	return 0;
}

这样是编译不过的, 因为cout 和 endl都被包含在std命名空间中。 std命名空间就是c++的标准库命名空间。 

想要使用cout 和endl必须用与操作符在std中寻找使用。 或者直接将std展开

#include<iostream>
using namespace std;//using 就是展开空间

int main() 
{

	int i = 0;
	cout << i << endl;//此时可以编过

	return 0;
}

using就是命名空间展开的关键字。 using后面加命名空间就可以将一个命名空间展开。 或者加命名空间中的一个函数或其他成员。 意思就是将其从命名空间中展开到全局。 


#include<iostream>
using std::cout;
using std::endl;

int main() 
{

	int i = 0;
	cout << i << endl;//编译不过

	return 0;
}

 这样也可以, 这样只展开了cout和endl。

c++的输入和输出

从上面我们已经看到了输出 对象"cout", 它是标准输出对象终端, 或者说是控制台。 

然后我们再看一下输入 "cin",它是标准输入对象

<< 是流插入操作符。 "cout << 数据" 的意思就是将数据输出到终端, 好处就是自行判断输出数据的类型。 

>> 是流提取操作符。"cin >> 内存"的意思就是将流中的数据输入到内存中, 好处也是自行判断格式,不需要自行判断

endl标识换行输出。 

以上都包含在iostream头文件中的std命名空间中。

缺省参数

#include<iostream>
using namespace std;
int Add(int x = 0, int y = 0) 
{
	return x + y;
}

int main() 
{
	int a = 1;
	int b = 1;

	int ret1 = Add();//输出0
	int ret2 = Add(a, b);//输出2

	cout << ret1 << "\n" << ret2 << endl;


	return 0;
}

当我们调用函数时没有进行传参时, 函数如果定义了缺省参数, 那么这个被调用的函数就会使用缺省参数。 

如图中

 这个int x = 0, int y = 0就是缺省参数定义的方式。 

然后, 当我们传参时如果没有传参, 就像图中的第一次调用

这个时候就会使用缺省参数。 x 为0, y 也是0。所以计算出来的就是0。

上面定义的是全缺省参数定义缺省参数时也可以半缺省

#include<iostream>
using namespace std;
int Add(int x, int y = 0) 
{
	return x + y;
}

int main() 
{
	int a = 1;
	int b = 1;

	int ret1 = Add(a);//输出1

	cout << ret1 << endl;


	return 0;
}

半缺省参数是从右向左定义的 ,向这个图中的Add函数就是定义的y为半缺省。 注意不能定义x为半缺省。定义半缺省要从右向左!

 函数重载

c++函数重载是很重要的一个知识点。就是说可以同时存在多个同名的函数。只要他们的参数个数不同或者参数的类型不同,或类型顺序不同这时, 这些函数就构成函数重载。

#include<iostream>
using namespace std;
int Add(int x, int y) //这两Add函数构成函数重载
{
	return x + y;
}

double Add(double x, double y) //
{
	return x + y;
}

int main() 
{

	int ret1 = Add(1, 2);
	
	double ret2 = Add(1.1, 2.2);
	cout << ret1 << " " << ret2 << endl;

	return 0;
}

这串代码中两个Add函数就构成了函数重载。 因为他们的参数类型不同。

注意:编译器这里分辨不同函数不是通过返回类型。 而是通过参数类型 参数个数不同类型参数顺序。它的分辨本质就是将函数转函数一种符号表的形式。 

假如

转化后就类似于:Addii  ,这里的Add是函数名。 ii是标识两个类型。i是int首字母。

 

这个就转换为Adddd, Add同样是函数名, dd是两个类型。 d是double首字母

这里的具体转换规则是什么我并不清楚。 只是意思就是这个意思。 有兴趣的话可以去查找相关资料

引用

大件来了!

引用, 为了避免使用指针而创造出来的一个类似于指针的语法。

引用就是一个变量的别名。 

 引用是变量的别名。 我们可以想象a 和 b共同代表着一个空间a的数据改变。 b也就改变了。

有了引用后, 我们交换函数就有了另一种定义方法:

这里形参x 是a的别名,语法上x就是ay是b的别名,语法上y就是b。所以交换x和y的值, 就交换了a和b的值。 

内联函数

内联函数inline + 函数定义

内联函数宏定义函数对应。 

宏定义在预处理阶段通过代码替换。来达到简单的函数的作用,提高行能。但是宏也有没有类型检查无法调试等缺点。

内敛函数在拥有着宏定义的优点:同样不用调用函数,直接将代码在原调用位置展开,提高性能。 

内联函数是在编译阶段,将函数体在原调用位置展开。 

内联函数不能将声明和定义定义在不同的文件之中。 否则可能报错。 

对于内联函数, 一般建议函数规模较小不是递归不是频繁调用。 否则编译器可能不会将内联函数展开, 而是直接调用内联函数

空指针nullptr

空指针nullptr是为了弥补NULL的错误。 

NULL可能标识空地址。 但是也有可能标识0.但是nullptr只有一种含义:无类型的地址0。

注:nullptr是c++11引入的关键字。 不需要包含头文件。 

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

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

相关文章

selenium-java 通过配置xml文件并发运行类或者方法

1、打开idea允许某个class类&#xff0c;可以在控制台看到运行路径的下的配置文件如下图&#xff1a; 2、将路径复制到本地路径中找到temp-testng-customsuite.xml文件 3、复制该文件到项目的根目录下&#xff0c;可以修改文件名称&#xff0c;如下图 4、如图所示&#xff0c;通…

【Python】成功解决TypeError: ‘int‘ object is not iterable

【Python】成功解决TypeError: ‘int’ object is not iterable &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…

【Flink网络数据传输(4)】RecordWriter(下)封装数据并发送到网络的过程

文章目录 一. RecordWriter封装数据并发送到网络1. 数据发送到网络的具体流程2. 源码层面2.1. Serializer的实现逻辑a. SpanningRecordSerializer的实现b. SpanningRecordSerializer中如何对数据元素进行序列化 2.2. 将ByteBuffer中间数据写入BufferBuilder 二. BufferBuilder申…

java ~ word模板填充字符后输出到指定目录

word文件格式&#xff1a; jar包&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0</version></dependency>样例代码&#xff1a; // 封装参数集合Map<String, Ob…

【异常处理】BadSqlGrammarException低级SQL语法异常

报错 org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use …

MYSQL5.7报1205 - Lock wait timeout exceeded; try restarting transaction

简介 今天使用navicate操作添加时&#xff0c;mysql报错误&#xff0c;错误如下 原因 这个问题的原因是在mysql中产生了事务A&#xff0c;执行了修改的语句&#xff0c;比如&#xff1a; update t1 set aget18 where id1;此时事务并未进行提交&#xff0c;事务B开始运行&am…

Linux_防火墙无法启动问题

当查看防火墙状体的时候报如下错误 ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)Active: inactive (dead) since 四 2024-03-07 07:42:16 CST; 7s agoDocs: man…

【黑马程序员】STL实战--演讲比赛管理系统

演讲比赛管理系统 需求说明 比赛规则 程序功能 创建管理类 功能描述 提供菜单界面与用户交互 对演讲比赛流程进行控制 与文件的读写交互 创建演讲比赛管理类 新建speechManager.hpp #pragma once#include <iostream>using namespace std;// 设计演讲比赛类 clas…

光线追踪5- Surface normals and multiple objects

首先&#xff0c;让我们获取一个表面法线&#xff0c;以便进行着色。这是一个垂直于交点处表面的向量。在我们的代码中&#xff0c;我们需要做一个重要的设计决定&#xff1a;法线向量是否为任意长度&#xff0c;还是将其归一化为单位长度。 诱人的是&#xff0c;如果不…

react高阶组件:如何同时兼容class类组件和函数式组件。

场景&#xff1a; 每个页面都要实现分享功能&#xff0c;但是页面有些是用class类&#xff0c;有些又直接是函数式。 方案1&#xff1a; 写2套方法。各自引用。&#xff08;维护不太好&#xff0c;改要改2遍&#xff09; 方案2&#xff1a; 可以封一个 jsx的组件&#xff0c…

服务器cpu占用高没看到进程

现象&#xff1a; 1. 今天连服务器发现root密码被改了&#xff0c;再改回去&#xff0c;登录发现服务器很卡&#xff0c;top查看&#xff0c;可用的cpu为0&#xff0c;但是没看到明显的进程&#xff0c;很显然中了病毒 2. 发现crontab -l有异常的定时计划&#xff0c;给删除掉 …

DailyNotes个人笔记管理工具

DailyNotes 是记录笔记和跟踪任务的应用程序&#xff0c;使用markdown进行编辑 部署 下载镜像 docker pull m0ngr31/dailynotes创建目录并授权 mkdir -p /data/dailynotes/config_dir chmod -R 777 /data/dailynotes启动容器 docker run -d --restart always --name mynot…

【Web安全靶场】upload-labs-master 1-21

upload-labs-master 其他靶场见专栏… 文章目录 upload-labs-masterPass-01-js前端校验Pass-02-MIME校验Pass-03-其他后缀绕过黑名单Pass-04-.hatccess绕过Pass-05-点空格点代码逻辑绕过Pass-06-大小写绕过Pass-07-空格绕过Pass-08-点号绕过Pass-09-::$DATA绕过Pass-10-点空格…

2024年腾讯云8核16G18M服务器租用价格1668元15个月

2024年腾讯云8核16G18M服务器租用价格1668元15个月&#xff0c;270GB SSD云硬盘&#xff0c;3500GB月流量。 一张表看懂腾讯云服务器租用优惠价格表&#xff0c;一目了然&#xff0c;腾讯云服务器分为轻量应用服务器和云服务器CVM&#xff0c;CPU内存配置从2核2G、2核4G、4核8…

【开源】JAVA+Vue.js实现学校热点新闻推送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…

Python与FPGA——全局二值化

文章目录 前言一、Python全局128二、Python全局均值三、Python全局OTSU四、FPGA全局128总结 前言 为什么要进行图像二值化&#xff0c;rgb图像有三个通道&#xff0c;处理图像的计算量较大&#xff0c;二值化的图像极大的减少了处理图像的计算量。即便从彩色图像转成了二值化图…

HarmonyOS应用开发-环境搭建(windows环境)

官网地址&#xff1a;链接 DevEco Studio 3.1.1 Release&#xff1a;下载地址 1、安装DevEco Studio 直接安装即可 2、配置开发环境 1.运行已安装的DevEco Studio&#xff0c;首次使用&#xff0c;请选择Do not import settings&#xff0c;单击OK。 2.安装Node.js与ohpm。注…

STC89C52串口通信详解

目录 前言 一.通信基本原理 1.1串行通信与并行通信 1.2同步通信和异步通信 1.2.1异步通信 1.2.2同步通信 1.3单工、半双工与全双工通信 1.4通信速率 二.串口通信简介 2.1接口标准 2.2串口内部结构 2.3串口相关寄存器 三.串口工作方式 四.波特率计算 五.串口初始化步骤 六.实验…

【go语言开发】gorm库连接和操作mysql,实现一个简单的用户注册和登录

本文主要介绍使用gorm库连接和操作mysql&#xff0c;首先安装gorm和mysql依赖库&#xff1b;然后初始化mysql&#xff0c;配置连接池等基本信息&#xff1b;然后建表、完成dao、controller开发&#xff1b;最后在swagger中测试 文章目录 前言安装依赖库数据库初始化账号注册和登…

Hadoop运行搭建——系统配置和Hadoop的安装

Hadoop运行搭建 前言&#xff1a; 本文原文发在我自己的博客小站&#xff0c;直接复制文本过来&#xff0c;所以图片不显示(我还是太懒啦&#xff01;)想看带图版的请移步我的博客小站~ Linux镜像&#xff1a;CentOS7 系统安装&#xff1a;CentOS安装参考教程 系统网卡设置…