C++入门基础知识2

1.引用

1.1引用的使用

1.引用在实践中主要是引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象

2.引用传参跟指针传参功能是类似的,引用传参相对更方便一些

3.引用和指针在实践中相辅相成,功能有重叠性,各有特点

在函数返回值类型的后面加&,即返回的是引用,实体是返回的值,那么在main函数里本来栈顶的数据是1,通过把4赋值给栈顶,则栈顶的数据就变为4而不是1,因为别名就是跟栈顶的数据是一样的,有相同的地址,改变一个都会改变,若不加&则返回的是一个临时变量,就是拷贝了一个与返回值一样的大小的数据,而赋值4给临时变量就会出错,临时变量生命周期用完就没了,当别名的实体是临时变量时,要加const,而这样临时变量的生命周期就会改变,当别名销毁时,这个临时变量就会销毁。

int& STTop(ST& rs)
{assert(rs.top > 0);return rs.a[rs.top-1];
}int main()
{调用全局的ST st1;STInit(st1);STPush(st1, 1);STPush(st1, 2);STModityTop(st1, 3);STTop(st1) = 4;}

表达式的返回值一个临时变量,具有常性,生命周期会被const影响,就是当别名是const,这个临时变量就不会马上销毁,当引用的销毁了这个临时变量才销毁

1.2const引用

1.可以引用一个const对象,但是必须用const引用。const也可以引用普通对象,因为对象的访问权限可以在引用的过程缩小,但是不能放大。

2.int& rb=a*3;double d=12.34;int& rd=d;a*3是一个表达式,是存储在一个临时变量中,就是说rb的引用对象是临时对象,而c++规定临时对象具有常性,所以这里触发了权限放大(常性是常量的特性,不能被修改,而引用没有const,就说明引用可以改变这个常量,权限被放大了),必须要用常引用才可以。(权限不可以放大,但是可以缩小,int b=1;const int& rb=b;)

3.临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象,c++中把这个未命名对象叫做临时对象

4.在类似转换时会发生隐式转换,有临时变量,例如int a=10 是常量10拷贝放到整形变量a里面,函数返回值也会有临时变量

2.内联函数

1.用inline修饰的函数叫做内联函数,编译时c++编译器会在调用的地方展开内联函数,调用内联函数就不需要建立栈帧了,可以提高效率。

#define Add(a,b) ((a)+(b))
int main()
{int ret = Add(1, 2);//宏定义后面不加分号是因为下面有报错//cout << Add(1, 2); << endl;//之所以要加外面的括号是防止优先级导致结果错cout << Add(1, 2) * 5 << endl;//之所以里面加括号也是优先级会影响Add(1 & 2, 3 & 4);return 0;
}

2.inline对于编译器而言只是一个建议,你加了inline编译器也可以选择在调用的地方不展开,不同编译器关于inline什么情况是不同的(代码的行数),c++为规定这个。inline适用于频繁调用的短小函数,对于递归函数,代码多一点的函数,加上inline也会被编译器忽略掉。

3.C语言实现宏宏函数也会在预处理时替换展开,但是宏函数实现很复杂且容易出错,不方便调试,C++设计inline目的是替换C的宏函数

4.vs编译器debug版本下默认是不展开inline的,这样方便调试,debug版本想展开需要设置一下

5.inline不建议声明和定义分离到俩个文件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会报错。

3.指针空值nullptr

在C语言中NULL实际上是一个宏,在传统的C头文件(stddef.h)里,可以看到下面的代码:

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

NULL可能被定义为字面常量0,或者定义为无类型指针(void*)的常量。下面是使用NULL遇到的麻烦,比如:

void Fun(int x)
{cout << "f(int)" << endl;
}
void Fun(int* x)
{cout << "f(int *)" << endl;
}
int main()
{Fun(0);Fun(NULL);//Fun((void*)0);return 0;
}

可以看到俩个都是int,NULL为参数并没有打印int*,而(void*)0就会报错,因为俩个参数都不符合,要隐式转换,不知道进哪一个函数里面,所以NULL设计的有些不合理,于是有了nullptr,

C++11中引入nullptr,nullptr是一种特殊关键字,nullptr是一种特殊类型的字面量,它可以转换成任意其它类型的指针类型。使用nullptr定义指针可以避免类型转换的问题,因为nullptr只能被隐式转换成指针类型,而不能转换为整数类型。

 

4.类

4.1类的引入

C语言结构体只能定义变量,在C++中,结构体不仅可以定义变量,也可以定义函数。

C语言用的是struct,而C++用class来代替,也可以使用struct。

4.2类的定义

class className
{
// 类体:由成员函数和成员变量组成
};   // 一定要注意后面的分号

class为定义类的关键字,className为类的名字,{}为类的主体,注意类定义结束时后面的分号不能省略。

类体中内容为类的成员:类中的变量为类的属性或成员变量;类中的函数称为类的方法或者成员函数。

类的俩种定义方式:

1.声明和定义全部放在类体中,注意的是在类中定义的成员函数会被当做内联函数处理

下面定义一个类:

class person
{
public:void ShowInfo(){cout << _name << _sex << _age << endl;}
private:char* _name;char* _sex;int _age;
};int main()
{return 0;
}

也可以把成员函数的实现放在另一个文件里面。

4.3类的访问限定符及封装

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

访问限定符说明:

1.public修饰的成员在类外可以被访问

2.protected和private修饰的成员在类外不能直接被访问

3.访问权限作用域从该访问限定符出现的位置开始到下一个访问限定符出现时为止

4.如果后面没有访问限定符,作用域到}结束

5.private默认权限为private,struct默认为public

4.4类的实例化

用类类型创建对象的过程,称为类的实例化

1.类是对象进行描述的,是一个模型一样的,限定了类有那些成员,定义出一个类并没有分配实际的内存空间来存储它

2.一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,并存储类成员变量

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

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

相关文章

ES6 Module 的语法(十二)

ES6&#xff08;ECMAScript 2015&#xff09;引入了模块&#xff08;Modules&#xff09;的概念&#xff0c;使得JavaScript代码可以更容易地组织和复用。 1. export 关键字 命名导出 (Named Exports) 你可以使用 export 关键字导出多个变量、函数或类。 // module.js export…

嵌入式C++、Qt/QML和MQTT:智能工厂设备监控系统的全流程介绍(附代码示例)

1. 项目概述 本项目旨在开发一套先进的智能工厂设备监控系统&#xff0c;集成嵌入式技术、工业通信协议和人机界面等多项技术&#xff0c;实现对工厂设备的全方位实时监控、高精度数据采集和智能化分析。该系统将显著提升工厂设备的运行效率&#xff0c;大幅降低维护成本&…

【第33章】MyBatis-Plus之预防安全漏洞

文章目录 前言一、什么是漏洞&#xff1f;二、如何预防漏洞1.表字段部分2.字段参数/变量部分3. 使用工具类预防 三、关于恶意漏洞的说明总结 前言 软件漏洞可以对系统造成严重危害&#xff0c;如果被人恶意利用&#xff0c;会导致病毒感染、数据泄漏或损坏的风险&#xff0c;还…

基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 仿真效果图 仿真图 代码 系统论文 资源下载 设计的内容和要求 熟悉51系…

thinkphp5多层with关联查询错误问题

官方文档 https://www.kancloud.cn/manual/thinkphp5/139045 V5.0.7版本以上&#xff0c;支持使用数组方式定义嵌套预载入&#xff0c;例如下面的预载入要同时获取用户的Profile关联模型的Phone、Job和Img子关联模型数据&#xff1a; $list User::with([profile>[phone,j…

TS类型声明文件(一)如何在ts npm包项目中生成 d.ts 文件

现在TS项目很多&#xff0c;如果你开发的npm包不支持类型声明文件&#xff0c;对使用ts的开发者不太友好&#xff0c;开发者无法获得ts类型提示。如何在自己的 npm 包中自带 .d.ts 文件&#xff0c;以确保使用者不需要额外配置 tsconfig.json 就能获得类型提示&#xff0c;以下…

Python练习题(3)

1.使用requests模块获取这个json文件http://java-api.super-yx.com/html/hello.json 2.将获取到的json转为dict 3.将dict保存为hello.json文件 4.用文件流写一个copy(src,dst)函数,复制hello.json到C:\hello.json import requests import jsondef copy(src, dst):read_file o…

【typedb】例子:药物发现 1: 模式导入

typedb-examples/drug-discovery/ Drug discovery监听0.0.0.0:1729 但这么连接肯定不行: localhost:1729 可以: 一直无法点击schema图标:先创建一个数据库 选中数据库: 选中后就可以了:

我的第128天创作纪念日

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;初阶数据结构笔记专栏&#xff1a; 初阶数据结构笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章…

演示:【Avalonia-Controls】Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库

一、目的&#xff1a;分享一个Avalonia皮肤&#xff0c;主题&#xff0c;自定义控件&#xff0c;数据库&#xff0c;系统模块资源库 开源地址&#xff1a; GitHub - HeBianGu/Avalonia-Controls: Avalonia控件库 Nuget包地址&#xff1a; NuGet Gallery | Packages matchin…

02MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件 画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本 定时器与定时事件

大模型时代的目标检测

https://zhuanlan.zhihu.com/p/663703934https://zhuanlan.zhihu.com/p/6637039341.open set/open word/ood 这个任务是指在实际应用上可以检测任何前景物体&#xff0c;但是有些不需要预测类别&#xff0c;只要检测出框就行。在很多场合也有应用场景&#xff0c;有点像类无关…

Memcached vs Redis——Java项目缓存选择

在Java项目开发中&#xff0c;缓存系统作为提升性能、优化资源利用的关键技术之一&#xff0c;扮演着至关重要的角色。Memcached和Redis作为两种流行的缓存解决方案&#xff0c;各有其独特的优势和应用场景。本文旨在通过分析项目大小、用户访问量、业务复杂度以及服务器部署情…

Chubby VS Zookeeper

Chubby 和 Zookeeper 是两种分布式协调服务&#xff0c;主要用于管理分布式系统中的配置、同步和命名等任务。以下是对这两种系统的比较&#xff1a; Chubby 开发者&#xff1a;由 Google 开发和使用&#xff0c;作为其内部服务的一部分。 设计目标&#xff1a;为 Google 的…

ABAP中将采购订单的预制发票过账的BAPI的使用方法

在ABAP中&#xff0c;将采购订单的预制发票过账的BAPI主要是BAPI_INCOMINGINVOICE_POST。这个BAPI用于将之前通过BAPI_INCOMINGINVOICE_PARK等函数创建的预制发票过账到SAP系统中&#xff0c;生成相应的会计凭证。 使用方法 以下是使用BAPI_INCOMINGINVOICE_POST的基本步骤&a…

力扣 爬楼梯

动态规划算法基础篇。 class Solution {public int climbStairs(int n) {int[] f new int[n 1];f[0] 1;f[1] 1;//当爬到n阶楼梯时&#xff0c;可知是由n-1阶或n-2阶楼梯而来for(int i 2; i < n; i) {f[i] f[i - 1] f[i - 2];//后面的每一阶种数由前两个状态得到}ret…

Milvus 核心设计 (3) ---- metric及index原理详解与示例(1)

目录 背景 Floating point embeddings 特点 适用场景 丈量方式 Euclidean distance (L2) Inner product (IP) Cosine similarity (COSINE) 代码写法 索引类型 In-Memory FLAT 索引 IVF_FLAT IVF_FLAT的工作流程 平衡准确性与速度 性能考虑 代码写法 IVF_SQ8 …

栈和队列 OJ (一)

括号匹配问题 题目链接&#xff1a; https://leetcode.cn/problems/valid-parentheses/ 遇到左括号入栈&#xff0c;遇到右括号&#xff0c;我们就出栈看看括号是否匹配 这里要注意如果左括号多于右括号的情况下&#xff0c;字符串循环遍历结束时&#xff0c;栈不为空&#x…

Android --- Kotlin学习之路:自己写一个SDK给别的APP用(暴漏一个接口,提供学生的身高数据)

今天又来肝kotlin了&#xff0c;主题是&#xff1a;用kt写一个SDK给其他人用&#xff0c;这个小技能在项目中会经常用到&#xff0c;应该有很多小伙伴还不会用&#xff0c;不会的请往下看—⬇ 在项目里面新建一个module 选择Android library&#xff0c;然后点击finish就行了 …

React有哪些优点和缺点

React 作为一个广泛使用的 JavaScript 库&#xff0c;在前端开发领域具有显著的优点&#xff0c;但同时也存在一些缺点。以下是对 React 的一些主要优点和缺点的概述&#xff1a; 优点 组件化开发&#xff1a; React 鼓励将 UI 分解为小的、独立的、可复用的组件。这种方式使得…