C++初阶--C++入门(1)

news2025/1/17 4:08:31

文章目录

  • C语言与C++
  • 命名空间
    • 命名空间的定义和使用
  • C++的输入输出
  • 缺省参数
  • 函数重载
  • 引用
    • 赋值与引用
    • 引用在参数上的使用以及注意事项
    • 函数返回值的引用
    • 引用与值的时间效率比较
    • 常引用

C语言与C++

很多初学者都会把这两门语言进行混淆,但其实这是两种不同的语言,C++相对与C语言,高级了一些;

语法差异
C语言是一种面向过程的编程语言,它主要注重函数的调用和流程控制。语法比较简洁,代码结构更加直观。
C++语言是一种混合型的编程语言,即支持面向过程的编程方式,还支持面向对象的编程方式。相对于C语言,C++主要引入了类、对象、继承、多态等概念。

标准库
C语言的标准库提供了基本的操作函数和常用的数据结构、如数组、字符串的处理、文件操作等。
C++语言是C语言标准库的拓展,提供丰富的容器(vector、list等)和算法(排序、查找等),以及输入输出流等功能。

内存管理
C语言中,需要手动管理内存分配和释放,使用malloc、free等函数进行动态内存的管理。
C++语言引入了析构函数和构造函数,通过new和delete关键字自动管理内存分配和释放,减少了内存泄漏和错误释放的风险。

在C++中,可以完全兼容C语言,可以直接调用C语言编写的库函数和代码。

命名空间

在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的,

在C语言中,

#include<stdio.h>
int printf = 5;
int main()
{
	
	printf("%d", printf);
	return 0;
}

这种做法是错误的,printf是一个打印到屏幕的函数,由于你对变量的命名与函数名一致,就会导致编辑器认为printf就是创建的临时变量,printf函数也就无法使用。

命名空间的定义和使用

命名空间关键字为namespace,它是将全局作用域进行划分,规定出自己的区域,这样同名者就不会进行冲突了。就像你们村有个叫张三的,隔壁村也有个叫张三的,只要你说我们村的张三的,那么就知道你要找哪个张三了。

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员

namespace sea
{
	int printf = 10;
	int Add(int left, int right)
	{
	return left + right;
	}

 struct Node
 {
	struct Node* next;
	int val;
 };
}

这样就规定了上面使用的结构体,printf,Add就在sea命名空间内了。

命名空间也是可以嵌套使用的,就像一个大的村子里面,还有很多个小村;

namespace sea1
{
	int a;
	int b;
	int Add(int left, int right)
	 {
	     return left + right;
	 }
	namespace sea2//嵌套
	 {
	     int c;
	     int d;
	     int Sub(int left, int right)
	     {
	         return left - right;
	     }
	 }
}

对于同样的命名,编辑器会自动规划在同一片区域

namespace sea1
{
	int a;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace N2//嵌套
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}
namespace sea1
{
	int a = 10;
	int c;
}

在这里插入图片描述
将命名空间进行调用,发现两个创建的变量和函数都放到一起,所以可以看出同样的命名空间会自动划分为同样一块区域;
而像a这样的,会报错,出现重定义:
在这里插入图片描述
对于命名空间的使用,有三种方式,
第一种就是上面的方式:

int main()
{
	//::表示作用域限定符::,对作用域内的函数、变量等进行调用
	printf("%d\n",sea1::a);
}

第二种:使用using将命名空间中某个成员引入

using sea1::b;
int main()
{
    printf("%d\n", sea1::a);
    printf("%d\n", b);
    return 0;    
}

第三种:使用using namespace 命名空间名称 引入

using namespce sea1;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;    
}

C++的输入输出

对于C++来说,输入输出不只是可以用printf和scanf,

#include <iostream>
using namespace std;
int main()
{
	//直接输出
	cout<<"hello"<<endl;
	//类型不同
	int a = 10;
	cout << a << endl;
	float b = 3.33;
	cout << b << endl;
	//输入
	cin >> a;
	cout << a << endl;
	return 0;
}

在这里插入图片描述

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
    以及按命名空间使用方法使用std。
    2.== cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出==,他们都包含在包含<
    iostream >头文件中。
    3.== <<是流插入运算符,>>是流提取运算符==。
  2. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
    C++的输入输出可以自动识别变量类型
    具体介绍后面章节会说,这里我们只要记住,cout类似于printf一样
    cin类似于scanf

缺省参数

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

void f(int a=10, int b=15, int c=20)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;

}
int main()
{
	//缺省参数
	f();
}

输出:10 15 20
像这种形参中都用成缺省参数,称之为全缺省参数;

	f(1, 2, 3);//全缺省参数,可以全部传参
	f(1, 2);
	f(1);

以上这种都可以进行实现;

1 2 3
1 2 20
1 15 20
对于引用缺省参数的函数来说,在进行函数调用传参时,默认从左到右进行传参,像上面f(1)一样,默认就是第一个传参了,其他的都用了缺省参数的调用值;

如果函数成这样:

void f(int a, int b, int c=20)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;

}

称之为半缺省参数
在这里插入图片描述
会发现,下面两个函数调用都是错误的,因为那些没有使用缺省参数的,你不传参表示没有值传参;

这里要注意,半缺省参数必须从右往左给,因为函数传参时默认是从左到右依次传参

缺省参数不能在函数声明和定义中同时出现,否则,将会报错:
在这里插入图片描述
真要选其中一个进行定义,应该在声明中进行缺省参数。

缺省值必须是常量或者全局变量

函数重载

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

int f(int a,float b)
{
	cout << a << endl;
	cout << b << endl;

	return 0;
}
void f(float a)
{
	cout << a << endl;
	//cout << b << endl;
}

int main()
{
	f(1,2.2);
	f(2.2);
}
	

这种为函数参数个数不同
在这里插入图片描述

int f(int a,float b)
{
	cout << a << endl;
	cout << b << endl;

	return 0;
}
void f(float a ,int b)
{
	cout << a << endl;
	cout << b << endl;
}

int main()
{
	f(1,2.2);
	f(2.2,1);
}

这种是函数参数位置不同

在这里插入图片描述

void f(int a,int b)
{
	cout << a << endl;
	cout << b << endl;

	
}
void f(double a ,double b)
{
	cout << a << endl;
	cout << b << endl;

}

int main()
{
	f(1,2);
	f(2.2,1.1);
}

这种为参数类型不同
在这里插入图片描述
而这里如果把double改为float的话,会进行报错,这是因为在VS2022中,1.1和2.2默认为double类型的常数,而double可以隐式转化为float或int,编译器就会报错;
解决方法是f(1.1f,2.2f);

引用

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

在这里插入图片描述

赋值与引用

int main()
{
	int a = 10;
	int& b = a;
	a = 11;
	cout << b << endl;
	//引用相当于别名,别人怎么改,它就怎么改
	return 0;
}

在这里插入图片描述

如果是赋值的话:

int main()
{
	int a = 10;
	int b = a;
	a = 11;
	cout << b << endl;
	//如果是赋值,一开始指向都是同个数,是相同的地址,一旦其中一个改变,
	//由于同个数有两个变量,所以另一个只能在别的地址开辟存储别的数;
	return 0;
}

在这里插入图片描述
在这里插入图片描述

引用在参数上的使用以及注意事项

引用可以应用在函数传参上,,这样函数调用的参数不会额外产生空间,可提高时间效率

int add(int* a, int* b)
{
	return *a + *b;
}
int add(int& a, int& b)
{
	return a + b;
}
int main()
{
	//int a = 10;
	//int b = a;
	//
	int& a1;//注意:引用须初始化变量
	// int& a2=10;//不可引用常量,引用的权限被放大
	//int& c = a;
	//int& d = a;

	int a = 10;
	int b = 20;
	int c=add(&a, &b);//运用到了重载
	cout << c << endl;
	int d=add(a, b);
	cout << d << endl;

	return 0;
}

在这里插入图片描述

函数返回值的引用

int& Count()
{
	int n = 90;
	
	return n;
}
int main()
{
	int ret = Count();
	int& ret1 = Count();
	
	cout<<ret<<endl;
	cout << ret1 << endl;//局部变量空间被销毁了,但还是输出正确的答案
	cout <<"l" << ret << endl//虽然空间被销毁了,但值还在那个位置上,ret是一个变量,可以使用
	cout <<"l" << ret1 << endl;//临时拷贝被‘l'所占领,ret1输出随机值
	//是因为返回的值是随机值或者临时拷贝
	//该编译器会保留住一个临时拷贝
}


以上这种使用方法是错误的,而是在调用函数的变量前加上static或者调用的变量是全局变量,使变量不会随着函数栈帧销毁而销毁,保留变量所属空间去引用才是正确的。

引用与值的时间效率比较

#include <time.h>
struct A { int a[10000]; };

void TestFunc1(A aa) {}

void TestFunc2(A& aa) {}

void TestRefAndValue()
{
	A a;
	// 以值作为函数参数
	size_t begin1 = clock();
	for (size_t i = 0; i < 10000; ++i)
		TestFunc1(a);
	size_t end1 = clock();

	// 以引用作为函数参数
	size_t begin2 = clock();
	for (size_t i = 0; i < 10000; ++i)
		TestFunc2(a);
	size_t end2 = clock();

	// 分别计算两个函数运行结束后的时间
	cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
	cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
	//8:0,传值还需要不断创建参数栈帧和销毁,而引用不用
	
}

常引用

	int a = 10;
	//int& b = a;//引用时权限平等
	const int& b = a;//引用时可权限放小

	cout << b << endl;//10
	a = 20;
	cout << b << endl;//20
	//a修改时,b有相当于只读,所读值也会改变
	b = 20;//错误,引用的b虽然同样是a的别名,但是权限只限制于读,即b是无法修改的
	const int c = a;//可以,赋值时c是另一个变量,const把他变为常变量

所以,引用的权限可以平等和放小,但不能放大;就像一个常量不能用int&来进行引用;

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

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

相关文章

零基础学习CSS

01-CSS初体验 层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09;。 书写位置&#xff1a;title 标签下方添加 style 双标签&#xff0c;style 标签…

2023网络工程毕业设计选题推荐 - 计算机毕业设计题目大全

文章目录 0 简介1 如何选题2 最新网络工程选题2.1 Java web - SSM 系统2.2 大数据方向2.3 人工智能方向2.4 其他方向 4 最后 0 简介 学长搜集分享最新的网络工程专业毕设毕设选题&#xff0c;难度适中&#xff0c;适合作为毕业设计&#xff0c;大家参考。 学长整理的题目标准…

从文字到视频:借助ChatGPT与剪映轻松生成高质量视频(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

ChatGPT AIGC 实现Excel 交叉查找 Index+match 函数

行与列交叉多条件查找需求如下: 这个需求要使用Excel中最经典的组合函数Index+match函数。 函数公式可以交给ChatGPT AIGC来实现。 Prompt: 有一个表格A列为品牌,B列为月份,C列为销量,61行数据,请写出Excel函数公式根据E3单元格的品牌与F2单元格的月份查找对应的销量,…

合规合规,合规法规的挑战与解决方案

在当前数据安全威胁日益加剧的时代&#xff0c;无论是来自企业内部还是外部&#xff0c;您都需要采取积极主动的态度。政府方面也希望出于公民数据安全的考虑&#xff0c;确保对企业的IT操作进行监管。为了实现这一目标&#xff0c;政府或主管法定机构发布了关于企业IT操作的法…

《golang设计模式》第三部分·行为型模式-01-责任链模式(Chain of Responsibility)

文章目录 1 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1 概念 责任链&#xff08;Chain of Responsibility&#xff09;是指将客户端请求处理的不同职责对象组成请求处理链。 客户端只需要将请求交付到该链上&#xff0c;而不需要关心链上含有哪些对象。请求…

5款CSS3选项框单选按钮样式(走过路过不要错过)

5款CSS3选项框单选按钮样式是一款创意好看的选项单选按钮样式特效。 样式如下&#xff1a; 文章顶部就是源码&#xff0c;如果下载不了&#xff08;如果被弄成收费or要VPI才能下载&#xff09;私一下我&#xff0c;第一次弄csdn的资源绑定&#xff0c;不行我重新弄成网盘的 百…

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.7 拖放事件

本节对应的视频讲解&#xff1a;B_站_链_接 【QT开发笔记-基础篇】 第4章 事件 4.7 拖动事件 本章要实现的整体效果如下&#xff1a; QEvent::DragEnter ​ 当拖动文件进入到窗口/控件中时&#xff0c;触发该事件&#xff0c;它对应的子类是 QDragEnterEvent QEvent::DragLe…

IDEA2023.1版本新建Web项目并配置本地Tomcat

IDEA2023.1版本新建Web项目并配置本地Tomcat 一、新建Web项目 一、新建Web项目 由于我最初是新建了一个空项目作为工作空间的&#xff0c;所以这里选择直接新建module&#xff0c;如下所示。&#xff08;这里使用的是idea的newUI&#xff09; 新建module&#xff0c;输入信息…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程(五)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 今天讲一下wf_demo表单的一些修改 1、demo的实现类修改如下&#xff1a; 主要是增加一个服务名称&#…

学信息系统项目管理师第4版系列30_信息系统管理

1. 管理方法 1.1. 技术底座构成了几乎所有业务模式的支柱 1.2. 信息系统是为组织用来生产和管理信息&#xff08;数据&#xff09;的技术&#xff08;“什么”&#xff09;、人员&#xff08;“谁”&#xff09;和过程&#xff08;“如何”&#xff09;的组合 1.3. 信息系统…

【nginx学习笔记】

1.正向代理&#xff1a;代理的是客户端&#xff0c;一般有明确的访问对象 比如&#xff1a;我现在通过v-p-n去访问YouTube&#xff0c;那么就是正向代理。 2.反向代理&#xff1a;代理的是服务器 最常见的就是web中&#xff0c;nginx去代理一群后端的服务器。 3.负载均衡&…

mac虚拟机,无法从apple store下载软件

问题&#xff1a;vmware版本为16pro&#xff0c;mac版本为10.14.6&#xff0c;网络可以正常访问互联网&#xff0c;apple id也正常登录了&#xff0c;但是从apple store下载软件&#xff0c;转了一会圈&#xff0c;就停掉了。 解决&#xff1a;后面使用了一个网上看到的方法&a…

ESDA in PySal (4):shape-measures:形状测量

ESDA in PySal (4)&#xff1a;shape-measures&#xff1a;形状测量 1.Measures of shape esda.shape 模块提供文献中使用的统计数据来测量多边形的结构和规则性。 这些测量值从非常简单&#xff08;例如长宽差&#xff09;到非常复杂&#xff08;例如归一化转动惯量&#xf…

以太网诊断协议DoIP(Ethernet Diagnostic Protocol DoIP)

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

【4】c++11新特性(稳定性和兼容性)—>final关键字

c中增加了final关键字来限制某个类不能被继承&#xff0c;或者某个虚函数不能被重写。如果使用final修饰函数&#xff0c;只能修饰虚函数&#xff0c;并且放在类或者函数的后面。 修饰函数 #include <iostream> using namespace std;class Base { public:virtual void t…

在 Ubuntu 22.04安装配置 Ansible

一、按官网指引安装 我使用的ubuntu22.04版本&#xff0c;使用apt安装。官网指引如下&#xff1a; $ sudo apt-get install software-properties-common $ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update $ sudo apt-get install ansible 由于内部网络…

《动手学深度学习 Pytorch版》 9.1 门控循环单元(GRU)

我们可能会遇到这样的情况&#xff1a; 早期观测值对预测所有未来观测值具有非常重要的意义。 考虑一个极端情况&#xff0c;其中第一个观测值包含一个校验和&#xff0c;目标是在序列的末尾辨别校验和是否正确。在这种情况下&#xff0c;第一个词元的影响至关重要。我们希望有…

《数理统计》第4章

文章目录 第4章4.4.1 协方差 第4章 4.4.1 协方差

项目平台——测试报告的实现(七)

这里写目录标题 一、Table表格组件的使用1、Table表格组件中的插槽使用 二、点击查看测试报告&#xff0c;跳转到测试报告详情页实现1、新建Report.vue组件2、配置路由3、查看报告按钮添加事件 三、页面布局1、Layout布局2、卡片设计3、打开页面发送请求加载报告数据4、对接口进…