c向c++的过渡

 

目录

 

1.不同版本的hello word!

2.namespace和::域作用限定符以及using

2.1 namespace

 2.2::

2.3using用于展开域

3.C++输入和输出

4.缺省参数

 5.重载

6.引用


1.不同版本的hello word!

还记得第一次写C语言的hello word吗

//text.c
#include<stdio.h>int main()
{printf("hello word!\n");return 0;
}

 这是C++版的

//text.cpp
#include<iostream>
using namespace std;
int main()
{cout << "hello word! \n" << endl;return 0;
}

C++ 诞生于c之后,c++兼容了c,我们重点了解c++中不同于c的部分

2.namespace和::域作用限定符以及using

 定义命名空间,需要用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间可以定义变量/函数/类型等。

2.1 namespace

namespace bit

{

//定义变量
int rand=10;

//定义函数

int Add ( int a , int b )

{

return a +b ;
}

//定义类型

 struct Node

{

struct Node* next;

int val;
};

}

 2.2::

调用域下面的变量/函数等

bit  ::rand

  • namespace本质是定义了一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不存在冲突了
namespace text1 {int rand = 0;
}
namespace text2 {int rand = 10;
}

 C++中域有函数局部域,全局域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的声明周期,命名空间域和类域不影响变量声明周期。

//text.cpp
#include<iostream>
using namespace std;namespace bit 
{int rand;int a = 2;int Fun(float c, float d){return c * d;}
}
int Fun(int c ,int d )
{return c + d;
}
int a = 1;
int main()
{int a = 0;printf("%d\n", a);// a没有被域限定 代码从上往下走,main 函数下被重新赋值 a=0,所以输出0printf("%d\n", ::a);//a被::域限定符限定,但左边没有元素,默认为全局域,a=1所以输出1printf("%d\n", bit::a);//a被::域限定符限定,左边有域名,限定在自定义的域,在bit域中a=2,所以输出2
printf("%d\n",Fun(1,2));
// a没有被域限定 代码从上往下走,找到自定义函数Fun调用Fun实现相加,输出3
printf("%d\n", ::Fun(1, 2));
//a虽然有域限定符,但是并没有限定范围,还是全局域找到Fun实现相加,输出3printf("%d\n", bit::Fun(1,2));//a被::域限定符限定,左边有域名,限定在自定义的域,在bit域中找到Fun实现相乘,输出2}

 验证答案

namespace只能定义在全局,当然他还可以嵌套定义

//text.cpp
#include<iostream>
using namespace std;namespace bit 
{int rand;namespace aa{int rand=1;}namespace bb {int rand=0;}
}int a = 1;
int main()
{printf("%d\n", bit::aa::rand);printf("%d\n", bit::bb::rand);return 0;
}

 

项目工程中多个文件中定义的同名namespace会认为是一个namespace,不会冲突

C++标准库都放在一个叫std(stdndard)的命名空间中

2.3using用于展开域

using namespace std;
//展开std头文件
using namespace bit::rand;
//展开bit中的rand

 一般日常练习中我们可以using namespace std,世纪项目开发中不建议using namespace

3.C++输入和输出

  •  <iostream>是Input Output Stream 的缩写,是标准的输入,输出流库,定义了标准的输入,输出对象
  • std::cin是ostream类的对象,他主要面向窄字符(narrow character (of type char))的标准输入流
  • std::cout是ostream类的对象,它主要面向窄字符的标准输出流
  • std::endl 是一个函数,流插入输出流,相当于插入一个换行字符加刷新缓冲区
  • <<是流插入运算符,>>是流提取运算符(c语言中的左移右移操作符)
  • 使用C++输入输出更方便,不要像printf/scanf输入输出那样,需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是痛过重载实现的),其实最重要的是C++的流能更好的支持只定义类型对象的输入和输出。
//text.cpp
#include<iostream>
using namespace std;int main()
{int i = 123;int j = 234;int x;int y;cin >> x >> y;//控制台手动输入x,ycout << i << j << endl;//输出i和j并且最后换行return 0;
}

但是一对<<  <<内只能有一个变量,否则编译器报错

 

在c++中我们没有包含<stdio.h>,也可以使用printf和scanf,在包含<iostream>间接包含了。vs编译器是这样的,但其他编译器会报错

4.缺省参数

  • 缺省参数是声明或定义函数时为函数指定一个确实值,在调用该函数时,如果没有指定实参则采用改形式参数的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数                                                                                                                                                                   全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省必须从右往左依次连续缺省,不能间隔条约给缺省值
  • 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值
//text.cpp
#include<iostream>
using namespace std;
//全缺省
void Fun1(int a=10,int b=20,int c=30)
{cout << "全缺省" << endl;cout << "a=" << a << endl;cout << "b=" << b << endl;cout << "c=" << c << endl;}
//半缺省
void Fun2( int a ,int b=10 ,int c=20)
{cout << "半缺省" << endl;cout << "a=" << a << endl;cout << "b=" << b << endl;cout << "c=" << c << endl;
}void Fun3(int a, int b, int c)
{cout << "普通" << endl;cout << "a=" << a << endl;cout << "b=" << b << endl;cout << "c=" << c << endl;
}
int main()
{Fun1();//没有传参时,使用参数的默认值Fun2(10);//传参时,使用的指定值Fun3(10,20,30);//传入指定值return 0;
}

 

 5.重载

C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或则类型不同。这样C++函数调用就表现出了多态行为,使用更加灵活。C语言是不支持同一作用域中出现同名函数的。

 

//text.cpp
#include<iostream>
using namespace std;
//1.参数类型不同
int Add(int a, int b)
{cout << "int Add(int a, int b)" << endl;return a + b;
}
double Add(double a, double b)
{cout << "double Add(double a, double b)" << endl;return a + b;
}
//2.参数个数不同
int Add(int a)
{cout << "int Add(int a)" << endl;return a;
}
double Add(double a, double b)
{cout << "double Add(double a, double b)" << endl;return a + b;
}
//3.参数类型顺序不同
void  fun(int a, char b)
{cout << "void fun(int a, char b)" << endl;}
void  fun(char b, int  a)
{cout << "void fun(char a, int b)" << endl;}
int main()
{cout << "参数类型不同" << endl;cout << Add(3,5)<< endl;cout << Add(3.1,5.0) << endl;cout << "参数个数不同" << endl;cout << Add(3) << endl;cout << Add(3.1, 5.0) << endl;cout << "参数类型顺序不同" << endl;fun(3, "x");fun("x", 5);return 0;
}

 注意:返回值不能作为判断是否重载的依据因为容易产生歧义,如下面的代码f()调用

//text.cpp
#include<iostream>
using namespace std;
void f()
{
cout<<"f()<<endl;
}
void f(int a=10)
{
cout<<"f(int a=20)"<<endl;
}int main()
{f();
return 0;
}

 

6.引用

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

类型&引用别名=引用对象;

 

//text.cpp
#include<iostream>
using namespace std;int main()
{int a = 0;//引用:b和c是a的别名cout << "a=" << a <<" " << &a << endl;int &b = a;cout << "b=" << b <<" " << &b << endl;int& c = a;cout << "c=" << c << " " << &c << endl;//也可以给b取别名,d还是相当于a的别名int& d = a;cout << "d=" << d<< " " << &d << endl;return 0;
}

 值一样,地址也一样

 传统的交换函数

void Swap(int* x,int* y)
{
int tem=x;
*y=*x;
*x=tem;
}

现在只要传引用就能解决

void Swap(int& rx,int&ry)
{
int tem=rx;
rx=ry;
ry=tem;}

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

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

相关文章

第二证券:资金抱团“高股息”,超三成A股年内创历史新低!

A股商场行情冰火两重天。 “预制菜榜首股”跌破发行价 7月8日&#xff0c;味知香盘中最低跌至19.26元/股&#xff0c;股价跌破发行价&#xff0c;并创前史新低。揭露资料显现&#xff0c;公司是集研发、生产、销售为一体的半成品菜企业&#xff0c;现在具有8大产品系列&#…

手机数据恢复:如何在没有root的情况下恢复Android数据?

您是否不小心从Android设备中删除了重要数据&#xff1f;您是否担心如何取回您的照片、视频和文档&#xff1f;有时&#xff0c;我们不小心删除了重要数据&#xff0c;并使用Android root方法取回文件。许多用户不喜欢root他们的Android设备&#xff0c;因为这是一种复杂的方法…

超详细版阿里云控制台环境配置+数据库配置

一、登录阿里云控制台 登录阿里云控制台&#xff0c;找到实例&#xff0c;切到阿里云服务器所在地址 &#x1f36d;不知道自己的服务器地址在哪边也没有关系&#xff0c;随便选择一个&#xff0c;查询不到记录的话会有以下提示&#xff0c;可以根据提示进行切换&#xff08;适…

Python 使用__slots__来限制实例动态添加属性

在Python中&#xff0c;是可以随便在对象实例中动态添加属性的。那么&#xff0c;怎么样可以防止其他人在调用类实例的时候胡乱添加属性和方法&#xff1f; 使用 __slots__ 属性&#xff0c;来限制 class 实例能添加的属性 也就是说&#xff0c;只有在 __slots__ 变量中的属性…

Java---包装类与泛型

1.包装类 1.1 包装类 在Java中&#xff0c;由于基本数据类型不是继承Object类&#xff0c;为了在泛型代码中可以支持基本数据类型&#xff0c;Java给每个基本数据类型各自提供了一个包装类。 如下图 除了char和int基本数据类型的包装类型有点特别&#xff0c;其他的都是首字…

Vue3基础知识:组合式API中的provide和inject,他们作用是什么?如何使用?以及案例演示

1.provide和inject相较于父子传递的不同在于provide,inject可以用于跨层级通信&#xff08;通俗易懂的讲就是可以实现爷孙之间的直接信息传递&#xff09;。 1.跨层级传递数据 1.在顶层组件通过provide函数提供数据 2.底层组件通过inject函数获取数据 演示一&#xff1a;跨…

工业一体机在物流智能设备中的意义

工业一体机在物流智能设备中的应用具有深远的意义&#xff0c;它们为物流行业的数字化转型和智能化升级提供了强大的技术支持。以下是工业一体机在物流智能设备中的几个主要意义&#xff1a; 一、提升物流作业效率 高性能与稳定性&#xff1a;工业一体机采用工业级硬件组件和…

【Ubuntu】windows和Linux文件互传、共享

【Ubuntu】windows和Linux文件互传、共享 一、FTP、SAMBA、NFS简介 FTP: File Transfer Protocol&#xff08;文件传输协议) SAMBA: 基于SMB(Server Message Block服务器消息块)协议的软件实现 NFS: Network File System&#xff08;网络文件系统&#xff09; 二、Linux 共享文…

【信息学奥赛】CSP-J/S初赛07 逻辑运算符与位运算

本专栏&#x1f449;CSP-J/S初赛内容主要讲解信息学奥赛的初赛内容&#xff0c;包含计算机基础、初赛常考的C程序和算法以及数据结构&#xff0c;并收集了近年真题以作参考。 如果你想参加信息学奥赛&#xff0c;但之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#…

私有化要约溢价60%,欧舒丹与投资者的相互成就

港股市场迎来新一轮私有化浪潮。据上海证券报不完全统计&#xff0c;自2023年以来&#xff0c;已有19家港股上市公司完成私有化退市。 对于深陷港股低估值困境的投资者来说&#xff0c;持仓名单里有公司宣布高溢价私有化要约&#xff0c;可谓“喜大普奔”的消息。 上市公司私…

202488读书笔记|《365日创意文案》——无聊的 到底是这世间, 还是自己?懂得忘却的人才能前进

202488读书笔记|《365日创意文案》——无聊的 到底是这世间&#xff0c; 还是自己&#xff1f;懂得忘却的人才能前进 1月2月3月4月5月6月7月8月9月10月11月12月 《365日创意文案》WRITES PUBLISHING&#xff0c;一些日常&#xff0c;是烟火&#xff0c;也是幸福的印记。 当下也…

电脑文件怎么加密?重要文件加密方法介绍

在使用电脑的过程中&#xff0c;我们需要加密保护重要文件&#xff0c;以免重要数据泄露。下面小编就为大家介绍两款文件加密软件&#xff0c;帮助你轻松加密保护重要文件。 超级加密3000 在众多文件加密软件中&#xff0c;超级加密3000凭借超高的加密强度&#xff0c;便捷的操…

ERP、CRM、MRP、PLM、APS、MES、WMS、SRM系统之间的关系

ERP系统是企业运营的神经中枢&#xff0c;整合了财务、人力资源、供应链等关键业务流程。CRM系统作为客户关系管理的专家&#xff0c;帮助企业深入了解客户需求&#xff0c;提升服务质量。MRP是物料需求的规划师&#xff0c;确保生产所需材料及时供应。PLM系统守护着产品从设计…

PCL 点云FPFH特征描述子

点云FPFH特征描述子 一、概述1.1 FPFH概念1.2 基本原理1.3 PFH和FPFH的区别二、代码实现三、结果示例一、概述 1.1 FPFH概念 快速点特征直方图(FPFH)描述子:计算 PFH 特征的效率其实是十分低的,这样的算法复杂度无法实现实时或接近实时的应用。因此,这篇文章将介绍 PFH 的简…

6000元最好的家用投影仪:当贝X5S Pro六千元配置最高画质最强

数码家电品牌发展迅速&#xff0c;投影同样也是一种更新迭代较快的产品类型&#xff0c;有时候去年还比较火的产品&#xff0c;今年就会被别的产品取代&#xff0c;就比如之前灯泡投影一直被认为是好产品的代表&#xff0c;但是现在国产激光投影的销量反而更高。一般来说6000元…

容易涨粉的视频素材在哪找啊?爆款涨粉的视频素材网站有这几个

亲爱的读者&#xff0c;大家好&#xff01;今天我们要探讨一个至关重要的问题&#xff1a;在充满竞争的视觉时代&#xff0c;如何使自己的短视频脱颖而出并吸引更多粉丝&#xff1f;关键在于使用那些既酷炫又高质量的视频素材&#xff01;下面就向大家推荐几个顶级视频素材网站…

Mysql笔记-v2

零、 help、\h、? 调出帮助 mysql> \hFor information about MySQL products and services, visit:http://www.mysql.com/ For developer information, including the MySQL Reference Manual, visit:http://dev.mysql.com/ To buy MySQL Enterprise support, training, …

永磁同步电机无速度算法--滑模观测器(反正切、反余弦)

一、原理介绍 在永磁同步电机滑模观测器控制中&#xff0c;转子的位置和转速信息与反动电势密切相关。滑模观测器控制基本设计思路是&#xff1a;利用永磁同步电机的电压、电流信息&#xff0c;通过永磁同步电机数学模型&#xff0c;估算出电机在两相静止坐标系中的反电动势信…

python中flask服务数据,客户端接收到中文乱码

问题&#xff1a;使用flask框架开发web服务。客户端接收到数据后&#xff0c;发现中文乱码 问题原因剖析&#xff1a;数据服务端打印出来&#xff0c;中文显示正常。客户端接收到数据&#xff0c;以json方式打开&#xff0c;中文也是正常的&#xff0c;以text或content打开&am…

最优化方法 运筹学【】

1.无约束 常用公式 线搜索准则&#xff1a;求步长 精确线搜索&#xff08;argmin&#xff09; 最速下降&#xff1a;sd&#xff1a;线性收敛 2.算法 SD dk&#xff1a;付梯度-g newton dk&#xff1a;Gkd-g 二阶收敛&#xff0c;步长为1 阻尼牛顿&#xff1a;步长用先搜…