浅淡 C++ 与 C++ 入门

        我们知道,C语言是结构化和模块化的语言,适用于较小规模的程序。而当解决复杂问题,需要高度抽象和建模时,C语言则不合适,而C++正是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式。

        因此在这篇博客,将会介绍C++中引入哪些新东西以及相对于C语言优化的地方。主要包括C++关键字/命名空间/C++输入输出/缺省参数/函数重载/引用/内联函数/基于范围的for循环。

1. 第一个 C++ 程序 
我们首先看代码和运行结果:
#include<iostream>
using namespace std;int main()
{cout << "hello world"<<endl;return 0;
}

我们首先来看,这里打印 "hello world" 并没有利用C语言中使用的 printf 函数,这里使用的是 cout<< ,为此我们首先解释cout<<的含义。
cout 是控制台标准输出对象,使用时需要包含 <iostream> 头文件,而 << 流插入运算符,endl 是特殊的 C++ 符号,表示换行。与 cout<< 相对应的就是 cin>> ,我们来看代码:
#include<iostream>
using namespace std;int main()
{int a = 0;cin >> a;cout << a << endl;return 0;
}

我们发现 cin>> 的功能就相当于C语言的 scanf, >> 是流提取运算符,同时我们可以看到cout<< 可以自动识别输出类型 。以上介绍的便是C++的 IO 流,包含流提取和流插入。 
那么 using namespace std; 这句代码是什么含义呢?为此我们首先要理解什么是命名空间。先看这样一个问题:下面的代码会报出命名冲突的问题,因为 rand 在C语言中是函数名。无法再次使用。而在C/C++中,变量、函数、类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。namespace 关键字的出现就是针对这种问题的。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,
#include<stdio.h>
#include<stdlib.h>int rand = 10;int main()
{printf("%d",rand);return 0;
}
接下来,我们来看命名空间的定义,定义命名空间,需要使用到 namespace 关键字,后面跟命名空间的名字,然后接一对 {} 即可,{} 中即为命名空间的成员。同时,命名空间可以嵌套。需要注意的是一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
namespace edsinty
{//在命名空间里定义int a = 10;int b = 100;//命名空间内部可以定义任何内容  
}
 命名空间有三种使用方式:
using namespace std;int main()
{	cout << edsinty::a << endl;cout << edsinty::b << endl;return 0;
}
//加命名空间名称及作用域限定符
//edsinty::a
using namespace std;
using  edsinty::a;int main()
{	cout << a << endl;cout << edsinty::b << endl;return 0;
}
//使用using将命名空间中某个成员引入
//using  edsinty::a;
using namespace std;
using namespace edsinty;int main()
{	cout << a << endl;cout << b << endl;return 0;
}
//使用using namespace 命名空间名称 引入
这样我们就明白了 using namespace std;的含义了,需要注意的是 C++语言只有一个命名空间std,C++定义的所有的类和对象都是 std 这个命名空间下的命名的且C++的标准库都是在 std 命名空间中定义的。
2. 缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。
void Func(int a = 0)
{cout << a << endl;
}
int main()
{Func();Func(100); return 0;
}

缺省参数分为全缺省和半缺省,半缺省参数必须从右往左依次来给出,不能间隔着给 ,缺省参数不能在函数声明和定义中同时出现 ,缺省值必须是常量或者全局变量 ,C语言不支持 (编译器不支持) 缺省参数。
//全缺省
void Func(int a = 10, int b = 20, int c = 30){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}//半缺省
void Func(int a, int b = 10, int c = 20){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}//缺省参数不能在函数声明和定义中同时出现
//a.hvoid Func(int a = 10);// a.cppvoid Func(int a = 20){}// 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该
用那个缺省值。
3. 函数重载
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。 
// 1、参数类型不同
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}// 2、参数个数不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}// 3、参数类型顺序不同
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, 'a');f('a', 10);return 0;
}

C语言没办法支持重载,是因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。 
4. 引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。
int main()
{int a = 10;int& ra = a;//<====定义引用类型cout << a << endl;cout << ra << endl;cout << &a << endl;cout << &ra << endl;
}

需要注意以下几点: 引用类型必须和引用实体是同种类型的,引用在定义时必须初始化,一个变量可以有多个引用,引用一旦引用一个实体,再不能引用其他实体。
同时引用可以做参数和做返回值:
//做参数
void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}//做返回值
int& Count()
{static int n = 0;n++;return n;
}
//如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用
引用返回,如果已经还给系统了,则必须使用传值返回。
 引用与指针的区别:
1.引用概念上定义一个变量的别名,指针存储一个变量地址;
2.引用在定义时必须初始化,指针没有要求;
3.引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体;
没有NULL引用,但有NULL指针;
4.没有NULL引用,但有NULL指针;引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小;
5.有多级指针,但是没有多级引用;访问实体方式不同,指针需要显式解引用,引用编译器自己处理;
6.引用比指针使用起来相对更安全。
5.内联函数
C语言的宏虽然具有增强代码的复用性,提高性能的优点,但是宏不方便调试,代码可读性差,可维护性差,容易误用;且没有类型安全的检查 。因此在 C++ 中可以利用 const enum 来代替宏的常量定义。短小函数定义换用内联函数,那什么是内联函数呢?
inline 修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
inline int Add(int x, int y)
{return x + y;
}int main()
{int ret = Add(1,2);cout << ret << endl;return 0;
}
inline 是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,
缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
inline 对于编译器而言只是一个建议,不同编译器关于 inline 实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用 inline 修饰,否则编译器会忽略 inline 特性。
7. 基于范围的for循环
使用时,for 循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
	int array[] = { 1, 2, 3, 4, 5 };for (auto x : array) {cout << x << " ";}

与普通循环类似,可以用 continue 来结束本次循环,也可以用 break 来跳出整个循环。for 循环迭代的范围必须是确定的, 对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供 beginend 的方法,beginend 就是 for 循环迭代的范围。

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

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

相关文章

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的吸烟检测系统(深度学习+Python代码+PySide6界面+训练数据集)

摘要&#xff1a;本文详细说明了如何利用深度学习开发一个用于监测吸烟行为的系统&#xff0c;并分享了完整的代码实现。该系统采用了先进的YOLOv8算法&#xff0c;同时还使用YOLOv7、YOLOv6、YOLOv5算法&#xff0c;并对它们进行了性能比较&#xff0c;呈现了不同模型的性能指…

记一次特殊的渗透经历

起因 搞安全的小伙伴们应该知道&#xff0c;干我们这行老是会碰到一些奇奇怪怪的问题和需求&#xff0c;比如上次&#xff0c;某客户领导说让我给他找个会渗透的小伙子来&#xff0c;有个比较棘手的业务。我一听&#xff0c;心想&#xff1a;好嘛&#xff0c;这私活不就来了嘛…

MySQL 开发规范

优质博文&#xff1a;IT-BLOG-CN 一、设计原则 原则&#xff1a; SQL开发规范制定是基于良好的编码习惯和可读性&#xff1b; 目的&#xff1a; 消除冗余&#xff0c;数据简约&#xff0c;提高效率&#xff0c;提高安全&#xff1b; 【1】禁止在线上生产环境做数据库压力测试&…

视频监控管理系统EasyCVR平台设备增删改操作不生效是什么原因?

国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xf…

数据结构——线性表顺序表示详解

目录 1.线性表的类型定义 2.基本操作 3.线性表的存储结构 4.补充 1.元素类型说明 2.数组定义​编辑 3.c语言的内存动态分配 4.c的动态存储分配 5.c中的参数传递 引用类型作参数 6.顺序表基本操作的实现 1.线性表的初始化 代码示例&#xff1a; 2.销毁线性表&…

什么是光伏气象站?—气象科普

光伏气象站&#xff0c;也称为光伏环境监测仪&#xff0c;是一种专门针对光伏发电站研发生产的环境监测系统。它主要利用太阳能电池板将太阳能转化为电能&#xff0c;并配备有气象监测设备以实时监测和记录气象数据。这些数据对于评估光伏电站的性能、效率和故障诊断至关重要&a…

SV-7045网络草坪音箱安装说明 景区园区背景音乐广播石头音箱

SV-7045网络草坪音箱安装说明 景区园区背景音乐广播石头音箱 在做室外公共广播/背景音乐系统时&#xff0c;对于草坪音箱的安装方法,大家可能不甚了解&#xff0c;所以将具体安装方法作简要说明。 音箱安装步骤如下&#xff1a; 1.测量草地音箱的底座尺寸大小&#xff0c;最…

Linux 多线程开发

第三章 Linux 多线程开发 3.1 线程3.1.2 线程操作3.1.2 线程属性 3.2 线程同步3.2.1 互斥量/锁3.2.2 死锁3.2.3 读写锁 3.3 生产者消费者模型3.3.1 条件变量3.3.2 信号量/灯 网络编程系列文章&#xff1a; 第1章 Linux系统编程入门&#xff08;上&#xff09; 第1章 Linux系统…

TSINGSEE青犀煤矿矿井视频监控与汇聚融合管理视频监管平台建设方案

一、背景需求 随着我国经济的飞速发展&#xff0c;煤炭作为我国的主要能源之一&#xff0c;其开采和利用的重要性不言而喻。然而&#xff0c;煤矿事故频发&#xff0c;不仅造成了巨大的人员伤亡和财产损失&#xff0c;也对社会产生了深远的负面影响。视频监控系统作为实现煤矿智…

【Rockchip android7.1 平台rtl8821cs wifi移植调试】

Rockchip 平台rtl8821cs wifi移植调试 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip rk3128 OS:Android 7.1.2 Kernel: 3.10 问题描述 客户需要在现在的板子上调一款RTL882…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的商品识别系统(深度学习+UI界面+训练数据集+Python代码)

摘要&#xff1a;在零售行业的技术进步中&#xff0c;开发商品识别系统扮演着关键角色。本博文详细阐述了如何利用深度学习技术搭建一个高效的商品识别系统&#xff0c;并分享了一套完整的代码实现。系统采用了性能强劲的YOLOv8算法&#xff0c;同时对YOLOv7、YOLOv6、YOLOv5等…

华为OD机试 - 字符串化繁为简(Java 2024 C卷 200分)

目录 专栏导读一、题目描述示例&#xff1a; 二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&…

2024蓝桥杯每日一题(区间合并)

一、第一题&#xff1a;挤牛奶 解题思路&#xff1a;区间合并 区间合并模板题 【Python程序代码】 n int(input()) a [] for i in range(n):l,r map(int,input().split())a.append([l,r]) def cmp(x):return x[0],x[1] a.sort(keycmp) res1,res20,0 st,ed a[0][0…

visualization_msgs::Marker 的pose设置,map坐标系的3d box显示问题

3D框显示 3D框显示可以使用visualization_msgs::Marker::LINE_LIST或者LINE_STRIP&#xff0c;前者使用方法需要指明线的两个端点&#xff0c;后者自动连接相邻两个点。 姿态问题 网上看了一些&#xff0c;没有涉及到朝向设置&#xff0c;Pose.orientation默认构造为4个0 至…

Python环境下一维时间序列的小波尺度谱和时间平均小波谱(基于Morlet小波)

小波分析是较好的非平稳信号分析方法之一&#xff0c;它通过伸缩和平移运算对信号进行多尺度细化分析&#xff0c;能够在不同的尺度上描述信号的局部特征&#xff0c;为微弱故障特征信号的检测提供了有效的工具。小波尺度谱可看作一个有恒定相对带宽的谱图&#xff0c;能够反映…

Java剖析 : HashMap底层存储数据的结构 | HashSet添加不重复元素底层原理

HashSet底层剖析 前言&#xff1a; 我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; ★ HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c…

OpenAI:ChatGPT API 文档之 Embedding

在自然语言处理和机器学习领域&#xff0c;"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称为嵌入空间&#xff08;embedding space&#xff09;&#xff0c;而生成的向量则称为嵌入向量&#xff08;embedding vector&#xff0…

14---DVI电路设计

视频链接 DVI硬件电路设计01_哔哩哔哩_bilibili DVI电路设计 1、DVI的简介 DVI(Digital Visual Interface)&#xff0c;即数字视频接口。它是1998年9月&#xff0c;在Intel开发者论坛上成立的&#xff0c;由Silicon Image、Intel(英特尔)、Compaq(康柏)、IBM(国际商业机器公…

时序数据库:TDengine整体架构

文章目录 [toc]一、集群与基本逻辑单元1.主要逻辑单元2.节点之间的通讯3.一个典型的消息流程 二、存储模型与数据分区、分片1.存储模型2.数据分片3.数据分区4.负载均衡 三、数据写入与复制流程1.Master Vnode 写入流程2.Slave Vnode 写入流程3.主从选择4.同步复制 四、缓存与持…

五 超级数据查看器 讲解稿 列表功能2

五 超级数据查看器 讲解稿 列表功能2 点击此处 以新页面 打开B站 播放教学视频 点此下载 百度手机助手 下载地址4 讲解稿全文&#xff1a; 大家好&#xff0c;今天我们讲解一下&#xff0c;超级数据查看器列表界面&#xff0c;分为1-2两集。这是第二集 继续讲解弹出式菜单…