C++入门(上)

news2024/11/25 4:38:08

C++入门

c++是对于c语言的补充而发展的一种面向对象的语言,也能兼容c语言的内容,所以c语言的东西可以在cpp文件中写c语言的内容,也是可以运行的(可以混写)

文章目录

  • C++入门
    • 命名空间
      • 命名空间的定义
      • 命名空间的使用
    • C++的输入和输出
    • 缺省函数
      • 缺省函数的概念
    • 函数重载


命名空间

namespace是为了防止命名重复然后会报错的问题,而提出的一种新型的方式来解决命名冲突问题。使用命名空间的目的是对于标识符的名称进行本地化,以免命名冲突或者名字污染。

//比如这个例子
int a=0;
namespace why{
  int a=1;//namespace 是命名空间操作符,表明我们规定了一个命名空间why,里面是有一个变量a为1  
};
int main()
{
    a=10;
    cout<<a<<" "<<endl;//
    return 0;
}

在这里插入图片描述

命名空间的定义

定义命名空间,需要使用namespace这个关键字,然后加上命名空间的名字,最后加上一对{},这就是完整的命名空间

namespace why{
    int data=0;	//可以定义变量
    void Print();//命名空间里面可以定义可以声明函数
    int Add(int x,int y){
        return x+y;
    }
}
//这就是完整且正确的定义
/
//命名空间是可以嵌套的,命名空间内部是可以再定义命名空间的
namespace why {
    int a = 1;//namespace 是命名空间操作符,表明我们规定了一个命名空间why,里面是有一个变量a为1  
    namespace cdd {
        int a = 10;
    }
};

using namespace why;
int main()
{
    //a = 10;
    cout << why::cdd::a << " " << endl;//
    return 0;
}

在这里插入图片描述

C++中的namespace是允许同一个工程存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中

//比如下文在test.cpp中
#include "test.h"
using namespace std;
namespace name1 {
	int data=1;
	namespace name2 {
		int data = 10;
	}
	void Print()
	{
		cout << "hello,world!!!" << endl;
	}
}
int main()
{
	name1::Set();
	name1::Print();
	return 0;
}
//下文为test.h
#include<iostream>
using namespace std;
namespace name1 {
	void Set() {
		cout << "Set!!!" << endl;
	}
}

//也就是说,我们在最后链接的过程中将两个相同名称的命名空间里面的成员合并在一起。
//一个命名空间就定义了一个新的作用域,命名空间中的所有内容都是局限于该命名空间中

命名空间的使用

命名空间的使用,大致有三种方式

//初始化一个命名空间为why
namespace why{
    int data=0;
}
//1.加命名空间名称及其作用域限定符
int main()
{
  	cout<<why::data<<endl;
    return 0;
}
//2.使用using将命名空间中的某一个成员引入
using why::data;
int main()
{
    cout<<why::data<<endl;
    return 0;
}
//3.using namespace 命名空间名字 的引入
using namespace why;
int main()
{
    cout<<why::data<<endl;
    return 0;
}

以上三种方法,就是对于命名空间的使用方法

std,实际上就是C++的标准库,里面包括STL,C++库等等,当我们使用using namespace std展开的时候,大部分的函数都能使用了

C++的输入和输出

这个地方可以直接看下面代码演示

#include<iostream>
using namespace std;
int main()
{	
	int a;
	cin >> a;  //cin输入,自动识别a的类型
	cout << a << endl;	//自动输出a,但是如果为double 且需要精确到XX位小数,(一般)就不用cout,需要使用 printf("%.2f",double); 
	return 0;
}//cin 是输入  cout是输出  endl是换行 相当于<<"\n";

std命名空间的使用规范

std是C++标准库的命名空间,如何展开std使用更合理呢?

  1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对
    象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
    大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 +
    using std::cout展开常用的库对象/类型等方式。

缺省函数

缺省函数的使用,是相较于C语言,比较神奇的一种函数的使用方式,比较灵活多变

缺省函数的概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参。

#include<iostream>
using namespace std;
void Print(int x=10){
    cout<<x<<endl;
}
int main()
{
    Print(20);//这样输出为20  有参数传参的时候,使用传参值
    Print();//这样输出为10  没有传参的时候,使用参数的默认值
    return 0;
}

缺省函数分类

  • 全缺省函数
#include<iostream>
using namespace std;
void Print(int x=10int y=20){
   cout<<x<<" "<<y<<endl;
}
int main()
{
   Print(20);//这样20传递给了x  然后输出为20 20
   Print();//这样没有实参传值,那就是输出为 10 20
   return 0;
}
  • 半缺省函数
#include<iostream>
using namespace std;
void Print(int x,int y=20){   //这样x是必须要接受数值
   cout<<x<<" "<<y<<endl;
}
int main()
{
   Print(20);//这样20传递给了x  然后输出为20 20
   Print();//这样没有实参传值,因为是半缺省,x没有传递数值所以会报错
   return 0;
}

全缺省函数,无所谓传参不传参,如果是不传参,那就是说,直接使用原始值既可以,传参的话,就是将参数替换函数的原始形参值,即可,但是传参是一一对应的

半缺省函数,必须将没有原始数值的参数,进行传参,且没有原始数值的参数从左向右一依次没有,不能跳过

#include<iostream>
using namespace std;
void Print(int x,int y=20,int z=10){   //这样x是必须要接受数值
   cout<<x<<" "<<y<<endl;
}		//Print是缺省函数,可以这样int x,int y=20,int z=10;
		//但是不能这样            int x=10,int y,int z=10;
int main()
{
   Print(20);//这样20传递给了x  然后输出为20 20
   Print();//这样没有实参传值,因为是半缺省,x没有传递数值所以会报错
   return 0;
}

半缺省参数必须从右往左依次来给出,不能间隔着给

缺省参数不能在函数声明和定义中同时出现

//test.h
void Func(int a, int b, int c = 20);//在头文件中声明

//test.cpp
void Func(int a, int b, int c)//在cpp源文件中定义
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
//这样会报错,显示cpp文件的Func重定义默认参数,也就是说在cpp文件中的c参数是重复定义为20,如果我们将20删除 改为int c  这个的话,就不会报错
//也就是说,缺省函数不能将定义和声明分开
int main()
{	
	Func(10,20);
	return 0;
}

//
//注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。
//test.h
void a(int a=10)
{
   
}
//test.cpp
void a(int a=20){
   
}
//这样的话会进行报错,这也就是当头文件中对函数使用缺省函数时,cpp文件中不能再用这个缺省,得改成一般函数,不然编译器报错

上述程序调用流程图

  1. 从main函数中,想要调用Func函数,这个时候先去.h文件去找到声明,然后发现Func为一个缺省函数,最少赋值前两个ab即可,那么就会调用.cpp文件中Func的定义,传入abc的数值,c的数值就为20
  2. 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。

函数重载

函数重载实际上就是,将同一个函数名,经过变一下参数的个数、类型、顺序等使得这两个函数不一致,在cpp中称为函数的重载

函数重载不根据返回值类型来判断,也就是int和double作为返回值时,如果函数名以及参数完全相同,这不是重载

//函数重载的样例
//正确样例
//1.改变参数类型,只要下面参数有不同的类型即可
void Func(double a, int b, int c)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
void Func(int a, int b, int c)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
//2.改变参数顺序 先double 在int 和 先int 再double
void Func(double a, int b, int c)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
void Func(int a, double b, int c)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
//3.改变参数个数  
void Func(int a, int b, int c)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
void Func(int a)
{
	cout << "a = " << a << endl;
}
//以上是正确样例
///
//下面是错误样例
void Func(int a, int b, int c)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
double Func(int a, int b, int c)
{
	cout << "a = " << a << endl;
}//只是改变返回类型,这不是重载,因为重载不管这个返回值类型为什么,只关心参数是不是完全一样,不一样(个数,顺序....),那就是重载,反之,不是重载

函数重载的原因:C++中支持函数重载,是因为进行了名字修饰

名字修饰就是在编译之后,通过参数是否不同,给定不一样的汇编后的名字,这样的话,我们就可以根据不同的名字去call不同的函数,这就实现了函数从重载在不同的编译器环境下,不同的重载函数命名规则

程序运行要经历这四个阶段:预处理、编译、汇编、链接

预处理:头文件展开/宏替换/条件编译/去掉注释等等 得到.i文件
编译:检查语法,生成汇编代码。 得到.s文件
汇编:汇编代码转换成二进制代码。 得到.o文件
链接:将这些代码链接起来,也就实现了多文件的交互 得到.exe可执行程序文件 or .out文件

程序运行的方式

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

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

相关文章

22、Tweak原理及部分逆向防护

一、Tweak原理 1.1 Tweak产物.dylib 执行make命令时,在 .theos的隐藏目录中,编译出obj/debug目录,包含 arm64、arm64e两种架构,同时生成readbadges.dylib动态库 在arm64、arm64e目录下,有各自架构的readbadges.dylib,而debug目录下的readbadges.dylib,是一个胖二进制文件 fi…

ShareSDK QQ平台注册

注册开发者账号 1.在QQ互联开放平台首页 QQ互联官网首页 &#xff0c;点击右上角的“登录”按钮&#xff0c;使用QQ帐号登录&#xff0c;如下图所示&#xff1a; 重要提示&#xff1a; 开发者QQ号码一旦注册不能变更&#xff0c;建议使用公司公共QQ号码而不是员工私人号码注册…

软件测试好学习吗?

软件测试好不好学习其实各自的认知都不同&#xff0c;想要知道自己能不能学会&#xff0c;对于自己怎么样&#xff0c;最简单的方法就是找个基础教程先去学习一下了~ 其实软件测试这个行业与其他岗位相比&#xff0c;对零基础的学习者更加友好。即使你不懂互联网&#xff0c;不…

小程序过审失败,怎么解决?

小程序过审失败&#xff0c;怎么解决&#xff1f; 如果你的小程序未能通过审核&#xff0c;可以参考以下步骤解决问题&#xff1a; 1、审核不通过原因&#xff1a;在审核失败的通知中会注明不通过的具体原因和相关文件路径。请先认真阅读并理解不通过的原因&#xff0c;找到问…

存储电路:计算机存储芯片的电路结构是怎样的?

我们把用于存储数据的电路叫做存储器&#xff0c;按照到 CPU 距离的远近&#xff0c;存储器主要分为寄存器、缓存和主存。我们就来重点分析这三种存储器的特点、原理&#xff0c;以及应用场景。 存储器是由基本的存储单元组成的&#xff0c;要想搞清楚存储器原理&#xff0c;我…

【C++关联容器】set的成员函数

目录 set 1. 构造、析构和赋值运算符重载 1.1 构造函数 1.2 析构函数 1.3 赋值运算符重载 2. 迭代器 3. 容量 4. 修改器 5. 观察者 6. 操作 7. 分配器 set set是按照特定顺序存储唯一元素的容器。 在一个set中&#xff0c;一个元素的值也是它的标识&#xff08;值…

插装式两位两通电磁阀DSV-080-2NCP、DDSV-080-2NCP

特性 压力4000 PSI(276 Bar) 持续的电磁。 硬化处理的提升阀和柱塞可获得更长的寿命和低泄漏量。 有效的混式电磁铁结构。 插装阀允许交流电压。可选的线圈电压和端子。 标准的滤网低泄漏量选择 手动关闭选择。 工业化通用阀腔。 紧凑的尺寸。 两位两通常闭式双向电磁…

热门好用的企业网盘工具大盘点

企业网盘作为热门的企业文件管理工具相比于个人网盘&#xff0c;更注重安全性&#xff0c;并增加了协同功能。当下市面上的企业网盘工具可谓是百花齐放&#xff0c;今天就盘点几款热门好用的网盘工具&#xff0c;希望能帮助您挑选到心仪的网盘工具~ 1. Zoho Workdrive Zoho Wo…

#PythonPytorch 2.如何对CTG特征数据建模

系列文章目录 #Python&Pytorch 1.如何入门深度学习模型 #Python&Pytorch 2.如何对CTG特征数据建模 我之前也写过一篇使用GBDT对UCI-CTG特征数据进行建模的博客&#xff0c;不过那是挺早的时候写的&#xff0c;只是简单贴了代码&#xff0c;方便了解流程而已&#xff0…

原神3.2剧情服搭建教程

同步官服所有剧情和交互 优化后电脑16G运行内存也可以完美运行 数据库再次启动报错的,把将redis.service中的Type=forking配置删除或者注释掉即可。 位于:/usrb/systemd/system/redis.service 然后重启服务就不会爆错了。 下面是具体步骤 su root (此处会提示输入密…

相机雷达联合标定cam_lidar_calibration

文章目录 运行环境&#xff1a;1.1 ROS环境配置1&#xff09;工作空间创建和编译2&#xff09;官方数据集测试环境 2.1 在线标定1&#xff09;数据类型2&#xff09;标定板制作3&#xff09;配置文件4&#xff09;开始标定5&#xff09;完整实现步骤 3.1 python版本选择3.2 rvi…

医疗保障信息平台HASF应用系统技术架构名词解释技术选型架构图

下载地址&#xff1a; 医疗保障信息平台HASF应用系统技术架构规范.pdf下载—无极低码 HSAF 医疗保障应用框架&#xff08;Healthcare Security Application Framework&#xff09; IaaS 基础设施即服务&#xff08;Infrastructure-as-a-Service&#xff09; PaaS 平台即服务…

实现了单链表各种功能,并配上详细解读。

单链表 链表的概念及结构链表的分类链表的实现初始化打印申请结点头插尾插头删尾删查找在pos位置之后插入在pos位置之前插入删除pos位置之后的值删除pos位置的值销毁 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素…

离散数学期末复习第一章 数理逻辑

离散数学 离散数学是研究各种各样的离散量的结构及离散量之间的关系一门学科&#xff0c;是计算机科学中基础理论的核心课程。 什么是连续变量&#xff1f; 在一定区间内可以任意取值的变量叫连续变量&#xff0c;其数值是连续不断的&#xff0c;相邻两个数值可作无限分割&a…

buuctf4

目录 [极客大挑战 2019]LoveSQL [极客大挑战 2019]Http [极客大挑战 2019]Knife qr 镜子里面的世界 ningen 小明的保险箱 爱因斯坦 easycap 隐藏的钥匙 另外一个世界 FLAG [极客大挑战 2019]LoveSQL 1.启动环境&#xff0c; 使用万能密码尝试一下 2.跳转到了check.php…

维度云工业品ERP进销存软件教您如何突破工业品生意的困境?

是困境也是机遇 随着全球化和技术进步的不断推进&#xff0c;工业品贸易正逐渐成为国际贸易的重要组成部分。工业品包含了从原材料、零部件到工业设备、机械以及其他工业用品等范畴的产品&#xff0c;涉及各种制造、加工和组装过程。在全球供应链互联互通之下&#xff0c;工业品…

【人工智能概论】 用Python实现数据的归一化

【人工智能概论】 用Python实现数据的归一化 文章目录 【人工智能概论】 用Python实现数据的归一化一. 数据归一化处理的意义二. 常见的归一化方法2.1 最大最小标准化&#xff08;Min-Max Normalization&#xff09;2.2 z-score 标准化 三. 用sklearn实现归一化 一. 数据归一化…

服务(第十一篇)LVS

什么是群集&#xff1f; 多台主机组成的一个整体&#xff0c;提供一个ip访问通道&#xff0c;所有的主机干一件事 提供同样的服务。 群集有哪些类型&#xff1f; ①负载均衡群集&#xff08;LB&#xff09;&#xff1a; 提高系统的响应能力&#xff0c;处理更多的访问请求&a…

20、Theos越狱调试Wallet

前面的总结中使用砸壳重签后的App进行调试,本篇在越狱环境下不重签App进行调试,但是还是需要砸壳获取Headers. 一、Cycript 1.1 在越狱环境中使用Cycript 在越狱环境上,安装Cycript插件.需要先安装adv-cmds插件,因为被Cycript插件所依赖、在Cydia中,安装Cycript 在设备中找到…

观察者设计模式(Observer Design Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

文章目录 概念组成角色相关图示示例代码框架中的运用适用场景 概念 观察者设计模式&#xff08;Observer Design Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种对象间的一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;当…