C++编程进阶

news2024/11/26 16:47:09

目录

new运算符

new关键字的使用案例

C++的引用

C++中引用案例 

引用的注意事项

引用做函数参数

引用做函数的返回值

前言:

具体案例

引用的本质

常量引用

常量引用原理

经典案例

函数的提高

函数的默认参数

注意:

具体案例

函数的占位参数

具体案例

函数的重载

函数重载满足的条件

函数重载的注意事项

引用作为重载的条件

函数重载碰到函数默认参数

new运算符

前言:C++中利用new操作符程序员可以在堆区手动开辟数据空间;程序员也可以手动释放空间,释放空间利用操作符delete

开辟空间语法:new 数据类型

返回值:该数据对应类型的指针

释放空间语法:delete 要释放的地址;

开辟数组语法:new 数据类型[数组长度]

返回值:对应开辟出数组空间的首地址(指针)

释放数组空间语法:delete[] 要释放的地址;

new关键字的使用案例

#include <iostream>
using namespace std;
int* func() {
	//在堆区创建空间
	int* p = new int(10);
	return p;
}
void testArr() {
	//在堆中创建长度为10的整形数组
	int* arr = new int[10];
	for (int i = 0; i < 10; i++) {
		//给10个元素赋值
		arr[i] = i + 100;
	}
	for (int i = 0; i < 10; i++) {
		cout << arr[i] << endl;
	}
	//释放数组空间地址
	delete[] arr;
}
void main() {
	testArr();
	int* p = func();
	cout << "a的值为:" << *p << endl;
	cout << "a的值为:" << *p << endl;
	//堆内释放地址
	delete p;
	//内存已经被释放,再次访问就是非法操作
	cout << "a的值为:" << *p << endl;
}

C++的引用

作用:给变量起别名

语法:数据类型 &别名=原名

C++中引用案例 

#include <iostream>
using namespace std;
void main() {
	//引用的基本语法
	int a = 10;
	int &b = a;
	b = 20;
	cout << "a的值为:" << a << endl;//20
	cout << "b的值为:" << b << endl;//20
	system("pause");
}

引用的注意事项

  • 引用必须要初始化(必须要告诉引用的是谁,如:int &b;是不正确的)
  • 引用一旦初始化后就不可以更改

理解:变量名本身就是自己所表示的值的一块内存空间,值的地址表示变量,因此,值与别名在某种意义上是等价的,所以引用必须要初始化,并且初始化后便不可更改

引用做函数参数

作用:函数传参时可以利用引用的技术让形参修饰实参

#include <iostream>
using namespace std;
void swap(int &a,int &b) {
	int temp = a;
	a = b;
	b = temp;
}
void main() {
	int a = 10;
	int b = 20;
	swap(a, b);
	cout << "a的值为:" << a << "\tb的值为:" << b << endl;
	system("pause");
}

结果:由此观之,引用传递,那么形参的改变会影响实参

引用做函数的返回值

前言:

  • 引用是可以作为函数返回值存在的
  • 不要返回局部变量的引用
  • 引用的返回值类型:数据类型&
  • 返回值为引用类型的函数那么其调用可以作为左值

具体案例

#include <iostream>
using namespace std;
//以引用的形式返回a
int& change() {
	//全局区的变量a
	static int a = 10;
	return a;
}
void main() {
	int &ref = change();
	//10
	cout << "ref的值为:" << ref << endl;
	cout << "ref的值为:" << ref << endl;
	system("pause");
}
#include <iostream>
using namespace std;
//以引用的形式返回a
int& change() {
	//全局区的变量a
	static int a = 10;
	return a;
}
void main() {
	int &ref = change();
	//相当于将a的引用赋值为1000
	change() = 1000;
	//因为ref为a的引用所以也为1000
	cout << "ref的值为:" << ref << endl;
	system("pause");
}

结论:若函数返回值类型为引用类型,则其函数调用可以作为左值

引用的本质

本质:在C++内部实现是一个指针常量

结论:C++推荐使用引用技术,因为语法方便,引用的本质是指针常量,但是所有的指针操作编译器都帮助我们做了

常量引用

作用:常量引用主要用来修饰形参,防止误操作

常量引用原理

#include <iostream>
using namespace std;
void main() {
	//加上const后,编译器将代码改为:int temp=10; int& ref=temp;
	const int& ref = 10;
	//下面报错,加了const后引用的值不可更改
	//ref = 20;
	cout << "ref的值为:" << ref << endl;
	system("pause");
}

注意:加了const后,那么被引用的别名值不可被更改 

经典案例

#include <iostream>
using namespace std;
void showValue(const int& a) {
	//这里形参到的改变会影响实参,因此加const来防止误操作
	cout << "a的值为:" << a << endl;
}
void main() {
	int a = 100;
	showValue(a);
	system("pause");
}

函数的提高

函数的默认参数

前言:在C++中函数的形参列表中的形参是可以有默认值的

语法:
返回值类型 函数名(参数=默认值){
    函数体;
}

注意:

  • 若某个位置已经有了默认值,那么从这个位置往后,从左到右都必须有默认值
  • 若函数的声明有默认参数,那么函数的实现就不能有默认参数(函数的声明和函数的实现只能有1个有默认参数)
  • 调用函数传递的实参从左到右依次与形参一一匹配,其中传入的参数会覆盖掉对应位置的默认值

具体案例

#include <iostream>
using namespace std;
int add(int a, int b=20, int c=30) {
	return a+b+c;
}
void main() {
	int sum=add(10);
	cout << "sum等于:" << sum << endl;//60
	system("pause");
}

函数的占位参数

C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置

语法:
返回值类型 函数名(数据类型){
    函数体;
}

注意:占位参数也可以有默认值 

具体案例

#include <iostream>
using namespace std;
//占位参数
void func(int a,int) {
	cout << "占位参数实例!" << endl;
}
void main() {
	//占位参数函数的调用
	func(10, 20);
	system("pause");
}
#include <iostream>
using namespace std;
//占位参数的默认参数
void func(int a,int =10) {
	cout << "占位参数实例!" << endl;
}
void main() {
	//占位参数函数的调用
	func(10);
	system("pause");
}

函数的重载

含义:函数名相同,但参数列表不同,进而提高函数的复用性

函数重载满足的条件

  • 同一个作用域下
  • 函数名称相同
  • 函数参数类型不同或者参数个数不同,或者参数顺序不同

注意:函数的返回值不可以作为函数重载的条件的

#include <iostream>
using namespace std;
void func() {
	cout << "func的调用:" << endl;
}
void func(int a) {
	cout << "func(int a)的调用:"<<a<< endl;
}
void main() {
	func();
	func(10);
	system("pause");
}

函数重载的注意事项

引用作为重载的条件

#include <iostream>
using namespace std;
void func(int &a) {
	cout << "func(int &a)的调用:" << endl;
}
void func(const int &a) {
	cout << "func(const int &a)的调用:"<<a<< endl;
}
void main() {
	int a = 10;
	//调用第一个
	func(a);
	//调用第二个
	func(10);
	system("pause");
}

函数重载碰到函数默认参数

#include <iostream>
using namespace std;
void func(int a,int b=10) {
	cout << "func(int a,int b=10)的调用:" << endl;
}
void func(int a) {
	cout << "func(int a)的调用:"<< endl;
}
void main() {
	int a = 10;
	//若传一个参数的话会出现二义性
	func(10,20);
	system("pause");
}

注意:当函数重载碰到默认参数时,会出现二义性,报错,应尽量避免这种情况

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

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

相关文章

已解决:树莓派外接硬盘 usb 或者sata 导致wifi无法链接 无线网卡无法使用问题

我的环境是树莓派4b 买了一个有硬盘的盒子 看上图的连接方式&#xff0c;是占用了树莓派的一个usb3.1进行了sata的转接&#xff0c;实现挂载硬盘。 但是我发现&#xff0c;安装系统开机之后&#xff0c;可以看到有硬盘接入&#xff0c;但是无法连wifi&#xff0c;如果拔掉硬盘…

G. SlavicG‘s Favorite Problem(树的遍历DFS,BFS均可)

Problem - G - Codeforces 给你一棵有n个顶点的加权树。回顾一下&#xff0c;树是一个没有任何循环的连接图。加权树是一棵树&#xff0c;其中每条边都有一定的权重。这棵树是无定向的&#xff0c;它没有根。 由于树让你感到厌烦&#xff0c;你决定挑战自己&#xff0c;在给定…

java--Lambda (3)变量的访问与修改

文章目录0 写在前面1 可以直接在 Lambda 表达式中访问外层的局部变量2 在 Lambda 表达式当中被引用的变量的值不可以被更改3 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量4 写在最后0 写在前面 学习使用在Lambda表达式&#xff0c;有些地方访问一些变…

VM系列振弦读数模块采集测量数据的一般步骤

VM 模块是通用型单振弦式传感器测量模块&#xff0c;主要功能是测量频率的传感器内置的温度传感器&#xff0c;使用默认工作参数即可自动测读绝大多数振弦传感器。 但由于传感器类型、结构、厂家、钢弦材料、线圈等影响因素不同&#xff0c;导致使用 VM 模块测量某些传感器时需…

【408专项篇】C语言笔记-第六章(指针)

文章目录第一节&#xff1a;指针的本质1. 指针的定义2. 取地址操作符与取值操作符第二节&#xff1a;指针的传递1. 指针的传递第三节&#xff1a;指针的偏移1. 指针的偏移2. 指针与一维数组第四节&#xff1a;动态指针与内存申请1. 指针与动态内存申请2. 堆空间和栈空间的差异第…

电脑无线网卡连接的无线信号不好的,经常丢包,掉线断网如何优化解决

环境&#xff1a; 电脑&#xff1a;HP480G7 系统:Win10 专业版 无线网卡&#xff1a;水星ud6s 、TP-LINK等 AP&#xff1a;锐捷RAP2200(E) 组网模式&#xff1a;AP代管AP模式 问题描述&#xff1a; 电脑无线网卡连接的无线信号不好的&#xff0c;经常断网&#xff0c;因…

docker logs命令详解

docker 命令官档如下&#xff1a; https://docs.docker.com/engine/reference/commandline/docker/ docker logs官档如下 https://docs.docker.com/engine/reference/commandline/logs/#retrieve-logs-until-a-specific-point-in-time 一、常用命令 1. 可以查看命令用法 doc…

英国访问学者|签证申请详细步骤简述

英国访问学者签证流程是怎么样的&#xff1f;下面就随知识人网老师一起来看一看英国访问学者签证申请详细步骤简述。 第1步&#xff1a;英国签证申请中心只接受在线填写的申请表&#xff0c;不接受手写表格。请访问官网完整填写申请表。(必须使用英文大写填写) 第2步&#xff…

数据库系统 整体结构化 的理解

数据库系统实现整体数据的结构化&#xff0c;这是数据库的主要特征之一&#xff0c;也是数据库系统与文件系统的本质区别。 在文件系统中&#xff0c;文件中的记录内部具有结构&#xff0c;但是记录的结构和记录之间的联系被固化在程序中&#xff0c;需要由程序员加以维…

jenkins配置maven+git自动构建jar包

进入页面 安装maven插件 需要使用maven插件构建项目,所以安装maven插件 步骤如下图&#xff1a; 点击安装后跳转至安装页面&#xff0c;等待在线安装完成即可 安装完成配置当前服务器中安装的maven 下滑到最下面点击新增maven 配置完成点击应用完成 配置当前服务器中安装的gi…

ADB 命令结合 Monkey 的使用

1、什么是monkey Monkey 是Android SDK提供的一个命令行工具&#xff0c;可以简单方便的发送伪随机的用户事件流&#xff0c;对Android APP做压力&#xff08;稳定性&#xff09;测试。主要是为了测试app是否存在无响应和崩溃的情况。 2、adb结合 monkey 的常用命令 adb shel…

如何选择跨平台桌面应用开发框架

受益于开源技术的发展&#xff0c;以及响应快速开发的实际业务需求&#xff0c;跨平台开发不仅限于移动端跨平台&#xff0c;桌面端虽然在市场应用方面场景不像移动端那么丰富&#xff0c;但也有市场的需求。 相对于个人开发者而言&#xff0c;跨平台框架的使用&#xff0c;主…

干货!一次伪静态页面的SQL注入!白帽黑客实战 。

涉及技能点 SQL注入基础原理 盲注常用函数及思路 burpsuite基础知识 过程记录 1.发现 在翻阅一EDU站点时&#xff0c;发现路径中带有明显的数字参数 好像与我们平时习惯的xxx.php?id不同呃 2.尝试注入 按照以往习惯&#xff0c;先用order by探探底&#xff0c;结果翻车了…

SPARKSQL3.0-PhysicalPlan物理阶段源码剖析

一、前言 阅读本节需要先掌握【SPARKSQL3.0-Optimizer阶段源码剖析】 本质&#xff1a;物理计划阶段将optimizer阶段优化后的逻辑算子树【LogicalPlan】进行进一步转换&#xff0c;生成物理算子树【SparkPlan】&#xff0c;物理算子树的节点可以直接生成 RDD 或对 RDD 进行 t…

javaweb 使用element + vue 完善项目 servlet 优化

我们先定义一个BaseServlet,继承HttpServlet 重写Service方法 &#xff08;因为HttpServlet就是在Service方法里做的通过请求方式进行方法分发&#xff0c;我们就重写改成通过请求路径分发&#xff09; 根据资源路径进行方法分发&#xff0c;利用反射得到调用者的class字节码文…

C++-指针:void*(不确定类型指针)简介【void *可以接受任何类型的赋值】【void *可以赋值给任何类型的变量】【void *不可以解引用】

void* 是一种特殊的指针类型&#xff0c;可用于存放任意对象的地址。一个 void* 指针存放着一个地址&#xff0c;这一点和其他指针类似。 void *可以接受任何类型的赋值&#xff0c;任何类型的指针都可以直接赋值给void *型指针&#xff0c;无需进行强制类型转换&#xff0c;相…

超大规模研究发现,缺乏维生素D,增加早逝风险

晒太阳是日常生活中最常见的一件事情了&#xff0c;但是很多人为了避免晒黑不喜欢晒太阳&#xff0c;更是把自己在夏天裹得严严实实&#xff0c;恨不得只露两只眼睛。其实每天晒太阳对身体有很多益处&#xff0c;杀菌消毒、促进维生素D的生成、促进血液循环和加速脂肪燃烧等。维…

IBM MQ 通道数量查看,以及最大通道数的修改

一&#xff0c;说明 在实践生产环境中&#xff0c;我们的运维人员很多时候都想关注通道使用了多少&#xff0c;离限定的对大通道数还有多少&#xff1f;下面我们就查看通道数量提供相应的办法。 二&#xff0c;示例 我有两个队列管理器&#xff0c;TEST_QM和 TEST_RQM&#…

C. Random Events(思维+概率)

Problem - 1461C - Codeforces 罗恩是一个长度为n的排列组合的快乐主人。 一个长度为n的排列组合是一个由1到n的n个不同的整数按任意顺序组成的阵列。例如&#xff0c;[2,3,1,5,4]是一个排列组合&#xff0c;但是[1,2,2]不是一个排列组合&#xff08;2在数组中出现了两次&…

动手学习深度学习

动手学习深度学习内容安排深度学习介绍内容安排 深度学习基础&#xff1a;线性神经网络、多层感知机卷积神经网络&#xff1a;LeNet、AlexNet、VGG、Inception、ResNet循环神经网络&#xff1a;RNN、GRU、LSTM、seq2seq注意力机制&#xff1a;Attention、Transformer优化算法&…