C++复习笔记4

news2024/11/26 4:50:28

编译器给一个类默认生成的六个成员函数:

构造函数、析构函数、拷贝构造函数、赋值运算符重载、对象取地址运算符以及常对象取地址运算符。其中析构函数不能重载,默认的拷贝和赋值两个函数存在浅拷贝的问题。

对象取地址运算符重载和常对象取地址运算符重载如下:

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容。
#include<iostream>
using namespace std;

class Person
{
public:
	Person* operator&()
	{
		return this;
	}

	const Person* operator&() const//这个const实际上是加到this指针前面了 this指针是 类型* const 指针常量
	{
		return this;
	}

private:
	char m_name[10];
	int m_age;
};

1.引用和指针的区别

1. 引用在定义时必须初始化,指针没有要求
2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型 实体
3. 没有NULL引用,但有NULL指针
4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节)
5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
6. 有多级指针,但是没有多级引用
7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
8. 引用比指针使用起来相对更安全
2.内联函数(加inline关键字),以空间换时间。声明为内联函数后编译器会在调用处对齐进行代码复制。直接将代码块在这里展开。减少了函数压栈(现场保护和现场恢复的时间)。
内联函数注意事项:1.内联只是一种建议,编译器会自己决定是否采纳。
                             2.内联函数不允许内部有循环和递归,它适用于调用次数多,代码简单的函数。
                              3.内联函数的的声明和定义一般都放在.h文件中,如果分开在头文件和源文件中会发生未定义的错误。引文内联函数的展开是在编译时完成的,链接会找不到。
#include<iostream>
using namespace std;

inline void add(int a, int b)
{
	int c = a+b;
}

int main()
{

	int a = 10,b=20;
	add(a, b);
	system("pause");
	return 0;
}
#include<iostream>
#include"test.h"
using namespace std;

int main()
{

	int a = 10,b=20;
	add(a, b);
	system("pause");
	return 0;
}
#include<iostream>
using namespace std;
inline void add(int a, int b)
{
	int c = a + b;
}

上面为.h文件。

2.auto自动类型推导

auto声明的变量必须由编译器在编译时期推导而得使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类
1. auto与指针和引用结合起来使用
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
2. 在同一行定义多个变量 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
注意事项:1.auto不能推导函数参数
                2.auto不能推导数组
#include<iostream>
using namespace std;

void test01()
{
	int a = 10;
	auto* ptr = &a;
	cout << typeid(ptr).name() << endl;

	auto& ref = a;
	cout << typeid(ref).name() << endl;
}

void test02()
{
	int arr[5] = { 1,2,3,4,5 };
	auto br = arr;
	cout << typeid(br).name() << endl;//这里显示int *
	br[3] = 5;
	cout << arr[3] << endl;
}

void test03()
{
	int arr[5] = { 1,2,3,4,5 };
	auto& br = arr;//数组的引用
	//int(&br)[5] = arr;//数组引用写法
	cout << typeid(br).name() << endl;//这里会显示int [5]不是int *
	br[3] = 5;
	cout << arr[3] << endl;
}

int main()
{
	test03();

	system("pause");
	return 0;
}

3.基于范围的for循环

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中 引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量, 第二部分则表示被迭代的范围。
注意:1. for循环迭代的范围必须是确定的
对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的 方法,begin和end就是for循环迭代的范围。
#include<iostream>
using namespace std;

void test02(int array[])
{
	for (auto e : array)//数组传参传的是地址,不存在开闭范围,不能这样循环
	{
		cout << e;
	}

	for (int i = 0; i < sizeof(array) / sizeof(int); i++)
		cout << array[i];
	cout << endl;
}

void test01()
{
	int br[] = { 1,2,3,4,5 };
	for (auto &e : br)
	{
		e *= 2;
		cout << e;
	}
	cout << endl;

	for (int i=0;i<sizeof(br)/sizeof(int);i++)
	{
		cout << br[i];
	}
	cout << endl;
	
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7 };
	test01();

	system("pause");
	return 0;
}

3.空指针,NULL在底层被宏定义为0和void*(无类型指针),它可以作为void*使用也可以作为整形0使用,默认情况下会被当作0,所以NULL在函数重载等情况下会造成不便。

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。
1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引的。
2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
#include<iostream>
using namespace std;

void func(int i)
{
	cout << "func(int i)" << endl;
}

void func(int* p)
{
	cout << "func(int* p)" << endl;
}

void test01()
{
	cout << sizeof(nullptr) << endl;
	cout<<sizeof((void*)NULL)<<endl;
}

int main()
{
	func(NULL);//传0
	func((int*)NULL);//传 int*

	func(nullptr);//传空指针

	test01();

	system("pause");
	return 0;
}

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

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

相关文章

KD03丨选品种-横截面动量

大家好&#xff0c;今天我们分享可达鸭系列第3篇策略——横截面动量。 想必这种逻辑大家也都熟悉&#xff0c;为了照顾大部分新人朋友&#xff0c;开始还是简单介绍一下该该逻辑理论。 横截面是一种非时序动量逻辑&#xff0c;从统计学感性描述&#xff08;非严谨客观描述&am…

windows安装PaddleSpeech(无需visual studio)

前言 首先啊&#xff0c;狠狠的批评一下paddle&#xff0c;不想看请直接跳到用法&#xff0c;另外我python版本是3.9&#xff0c;所以包找的也都是3.9。 1.分成许多子项目涵盖AI的不同领域&#xff0c;初心是好&#xff0c;安装起来得安装多个环境。 2.官方文档推荐linux安装&…

anaconda详细介绍、安装及使用(python)

anaconda详细介绍、安装及使用1 介绍1.1 简介1.2 特点1.3 版本下载2 Anaconda管理Python包命令3 安装3.1 windows安装4 操作4.1 Conda 操作4.2 Anaconda Navigator 操作4.3 Spyder 操作4.4 Jupyter Notebook 操作5 示例参考1 介绍 1.1 简介 Anaconda是用于科学计算&#xff08…

力扣sql简单篇练习(十四)

力扣sql简单篇练习(十四) 1 银行账户概要|| 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 高于相当于大于的意思 SELECT u.name,t.balance FROM Users u INNER JOIN (SELECT account,sum(amount) balanceFROM TransactionsGROUP BY accountHAVIN…

Kafka入门(四)

下面尝试一下Kafka 的生产者客户端和消费者客户端的实现。 1、客户端简介 生产者就是负责向Kafka发送消息的应用程序&#xff0c;消费者就是拉取Kafka消息的应用程序。 在Kafka的历史版本中&#xff0c;主要的客户端如下&#xff1a; 基于Scala语言编写的客户端&#xff0c;称…

JAVA工具篇--3 maven项目转gradle项目

前言&#xff1a;将已有的Maven 项目转换为Gradle 项目&#xff1b; 1 项目转换&#xff1a; 1.1 winr 打开cmd命令窗口, 然后进入到maven项目根目录后&#xff0c;输入命令: gradle init --info --type pom1.2 选择构建的语言&#xff1a; 输入 1 然后回车&#xff1b; 1.3…

Rust编码的信息窃取恶意软件源代码公布,专家警告已被利用

黑客论坛上发布了一个 用Rust编码的信息窃取恶意软件源代码 &#xff0c;安全分析师警告&#xff0c;该恶意软件已被积极用于攻击。 该恶意软件的开发者称&#xff0c;仅用6个小时就开发完成&#xff0c;相当隐蔽&#xff0c; VirusTotal的检测率约为22% 。 恶意软件开发者在…

canal使用说明:MySQL、Redis实时数据同步

1. canal简介 canal是阿里开源的数据同步工具&#xff0c;基于bin log可以将数据库同步到其他各类数据库中&#xff0c;目标数据库支持mysql,postgresql,oracle,redis,MQ,ES等 canal分成服务端deployer和客户端adapter&#xff0c;我们可以部署多个&#xff0c;同时为了方便管…

AssertionError: 618 columns passed, passed data had 508 columns【已解决】

问题描述 程序中断&#xff0c;报错如下AssertionError: 618 columns passed, passed data had 508 columns Exception has occurred: ValueError 618 columns passed, passed data had 508 columns AssertionError: 618 columns passed, passed data had 508 columnsThe abo…

< CSDN周赛解析:第 27 期 >

CSDN周赛解析&#xff1a;第 27 期&#x1f449; 前言&#x1f449; 第一题&#xff1a; 幸运数字> 解析> 解决方案> 拓展知识&#x1f449; 第二题&#xff1a; 投篮> 解析> 解决方案&#x1f449; 第三题&#xff1a; 通货膨胀-x国货币> 解析> 解决方案…

数字展陈技术,让珍贵馆藏资源走出深闺

这篇文章来自于笔者2017年发表在《档案时空》第12期的一篇文章&#xff0c;原名为《数字展陈技术在档案展览中的应用》。 档案时空 时隔5年&#xff0c;数字视觉技术的发展突飞猛进&#xff0c;特别是这两年元宇宙浪潮席卷全球&#xff0c;VR/AR/MR技术的综合应用给受众带来非一…

【PyTorch】教程:对抗学习实例生成

ADVERSARIAL EXAMPLE GENERATION 研究推动 ML 模型变得更快、更准、更高效。设计和模型的安全性和鲁棒性经常被忽视&#xff0c;尤其是面对那些想愚弄模型故意对抗时。 本教程将提供您对 ML 模型的安全漏洞的认识&#xff0c;并将深入了解对抗性机器学习这一热门话题。在图像…

Java程序设计-ssm企业财务管理系统设计与实现

摘要系统设计系统实现开发环境&#xff1a;摘要 对于企业集来说,财务管理的地位很重要。随着计算机和网络在企业中的广泛应用&#xff0c;企业发展速度在不断加快&#xff0c;在这种市场竞争冲击下企业财务管理系统必须优先发展&#xff0c;这样才能保证在竞争中处于优势地位。…

from文件突然全部变为类cs右击无法显示设计界面

右击也不显示查看设计器 工程文件 .csproj中将 <Compile Include"OperatorWindows\Connection.cs" /> <Compile Include"OperatorWindows\Connection.Designer.cs"> <DependentUpon>Connection.cs</DependentUpon> &…

CV——day74 读论文:关注前景的anchor-free交通场景探测器

FII-CenterNet&#xff1a;关注前景的anchor-free交通场景探测器FII-CenterNetI. INTRODUCTIONII. RELATED WORKC. Detectors Exploiting Segmentation InformationIII. FII-CENTERNET APPROACHA. 前景区域建议网络(Foreground Region Proposal Network)1) 上分支提出前景区域2…

linux称手的终端管理器Zsh(Z shell)-图文安装超详细

linux默认的shell太low了&#xff0c;iTerm2在macOS系统简直堪称终端管理神器&#xff0c;有一款可以平替iTem2的linux开源软件 Zsh&#xff08;Z shell&#xff09; &#xff0c;Zsh 是一个为交互使用而设计的 shell 一&#xff1a;安装Zsh 1.yum安装zsh yum install zsh安装…

频谱分析仪测量噪声系数方法介绍

用频谱仪测量噪声系数&#xff1a;测量框图为&#xff1a;基于噪声系数的定义得到的一个测量公式为&#xff1a;NFPNOUT-(-174dBm/Hz20lg(BW)Gain)(1)公式中&#xff0c;PNOUT是已测的总共输出噪声功率&#xff0c;-174dBm/Hz是290oK&#xff08;室温&#xff09;时环境噪声的功…

视频号小店新订单如何实时同步企业微信

随着直播带货的火热&#xff0c;视频号小店也为商家提供商品信息服务、商品交易&#xff0c;支持商家在视频号运营电商&#xff0c;许多企业也将产品的零售路径渗透至视频号小店中了。如果我们希望在视频号小店接收到订单后&#xff0c;能尽快及时发货&#xff0c;给用户较好的…

filter属性详解

filter属性详解 filter 属性定义了元素(通常是<img>)的可视效果(例如&#xff1a;模糊与饱和度)。 filter: none | blur() | brightness() | contrast() | drop-shadow() | grayscale() | hue-rotate() | invert() | opacity() | saturate() | sepia() | url();下面运用…

【金三银四系列】Spring面试题-上(2023版)

Spring面试专题 1.Spring应该很熟悉吧&#xff1f;来介绍下你的Spring的理解 有些同学可能会抢答&#xff0c;不熟悉!!! 好了&#xff0c;不开玩笑&#xff0c;面对这个问题我们应该怎么来回答呢&#xff1f;我们给大家梳理这个几个维度来回答 1.1 Spring的发展历程 先介绍…