【C++】【类与对象知识整理】(一)

c++面试知识整理 C++面试题1. 基础知识1.1 内存1.1.0 内存四区1.1.1 简述C、C++程序编译的内存分配情况1.1.2 分配函数与释放函数1.2 预编译1.2.1 头文件问题1.2.2 const 与 #define相比有什么优点1.3 宏,内联函数1.3.1 内联函数1.3.2 内联函数与宏的差别1.3.3 写一个 “标准”宏MIN1.3.4 typedef 和define 有什么区别1.4 指针1.4.1 指针常量和常量指针1.4.2 指针函数和函数指针1.4.3 指针数组数组指针1.4.4 函数传参1. 阅读详情

在之前我确实没有什么做笔记的习惯,但是在接触C++了之后,发现有很多很细节的东西,如果不做笔记的话复习会相当的麻烦,所以我觉得开始记录笔记,也希望对大家有所帮助(笔芯❤)

  • 临时变量
	//权限可以平移可以缩小不可以放大
	double d = 12.34;
	//类型转换会生成临时变量
	int i = d;

	const int& r = d;
	//临时变量具有常性,不可以修改

	int x = 0, y = 1;
	x + y;  //如果不用值来接受,也是会产生临时变量的
	const int& r2 = x + y;
  • 开空间
	int a = 0;    
	int& b = a;        //语法上不开空间

	int* p = 0;      //语法上要开空间 

初步通过汇编来理解

在这里插入图片描述

  1. [a] 的空间放到 eax 然后再放到 [b] 上 --> (可以看出引用在底层是一样的)
  2. lea 👉 取地址
  3. 转换成汇编了之后引用就相当于指针了

结论: 引用不开空间,指针才需要开空间


  • 引用和指针的不同点:
  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。

  2. 引用在定义时必须初始化,指针没有要求

  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体

  4. 没有NULL引用,但有NULL指针

  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)

  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

  7. 有多级指针,但是没有多级引用

  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

  9. 引用比指针使用起来相对更安全,到后期C++中引用会用的更多一点,但是不能完全替代。(例如链表)

🔺在结论四中也有特殊情况,虽然下面 r 确实存入空指针但其实是不会报错的

在这里插入图片描述

在这里插入图片描述

⭐语法上看起来有解引用,其实并没有
在这里插入图片描述

🔺结论五

	int a = 0;
	int& b = a;
	cout << sizeof(b) << endl;
	cout << sizeof(int&) << endl;

在这里插入图片描述


  • 内联函数

概念:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

void swap(int& a, int& b)
{
	//...
}

// 频繁调用的小函数
// c语言使用宏函数解决

#define ADD(a, b) ((a) + (b))
//为什么不能加分号 -> 替换的时候会多加一个分号
//为什么要加外面的括号 -> 表达式优先级
//为什么要加里面的括号 

内联会让我们调用的函数进行展开

//Debug版本下面默认不展开 -> 方便调试
inline int Add(int a, int b)
{
	int ret = a + b;
	return a + b;
}

int main()
{
	int c = Add(1, 2);
	cout << c << endl;
	return 0;
}

怎么判断无法展开,下图中,只要是callAdd就说明没有展开

在这里插入图片描述
总结内联:

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,
    ⭐缺陷:可能会使目标文件变大
    ⭐优势:少了调用开销,提高程序运行效率。
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同。
  3. 一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。

内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求

  1. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
/ F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
 cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
 f(10);
 return 0;
}
// 链接错误:main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl 
f(int)" (?f@@YAXH@Z),该符号在函数 _main 中被引用

在这里插入图片描述
其实内联函数是没有地址的哟

【面试题】
宏的优缺点?
优点:
1.增强代码的复用性。
2.提高性能。
缺点:
1.不方便调试宏。(因为预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查 。
C++有哪些技术替代宏?

  1. 常量定义 换用const enum
  2. 短小函数定义 换用内联函数

  • auto关键字(C++)
int j = 0;
// 右边初始化自动推导类型
auto i = 0;

👉随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:

  1. 类型难于拼写
  2. 含义不明确导致容易出错

在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量。

C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

int TestAuto()
{
	return 10;
}
int main()
{
	int a = 10;
	auto b = a;
	auto c = 'a';
	auto d = TestAuto();
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化
	return 0;
}

在这里插入图片描述

细节: aoto* 指定必须是指针

🔺【注意】
使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

auto的使用细则

  1. auto与指针和引用结合起来使用:
    用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
int main()
{
    int x = 10;
    auto a = &x;
    auto* b = &x;
    auto& c = x;

    //typeid 可以查看类型
    cout << typeid(a).name() << endl;
    cout << typeid(b).name() << endl;
    cout << typeid(c).name() << endl;

    *a = 20;
    *b = 30;
    c = 40;
    return 0;
}
  1. 在同一行定义多个变量:
    当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
void TestAuto()
{
	auto a = 1, b = 2;
	auto c = 3, d = 4.0;  // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}

在这里插入图片描述

  • aoto不能推导的场景
  1. aoto不能作为函数的参数
// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
void TestAuto(auto a)
{}
  1. auto不能直接用来声明数组
void TestAuto()
{
	int a[] = { 1,2,3 };
	auto b[] = { 4,5,6 };
}

在这里插入图片描述
为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有lambda表达式等进行配合使用。

  • 基于范围的for循环(C++11)
	int array[] = { 1, 2, 3, 4, 5 };
	//C++11 范围for
	//自动取数组array中, 赋值给e
	//自动++, 自动判断结束
	for (auto e : array)
		cout << e << " ";
//不支持倒序遍历

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。
for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。


  • C++98中的指针空值

·C++中,用 nullptr 来代替 NULL·
在这里插入图片描述

BPC坏点矫正 whatis the Bad Pixel? 坏点为死点,也就是基本不随照度变化呈现光电线性转换的关系。表现为暗态常亮,亮态常暗。 坏点分类:静态坏点:亮坏点,暗坏点。 动态坏点:在一定像素范围内,该点表现正常,而超过这一范围,该点表现的比周围像素要亮。与sensor ... 阅读详情

相关推荐

Zotero插件安装保姆级教程:从Jasminum到Sci-Hub,一站式搞定文献管理

本文提供Zotero插件安装的保姆级教程,从Jasminum到Sci-Hub,一站式搞定文献管理。通过详细配置和实战案例,帮助用户高效构建文献工作流,提升研究效率。重点介绍了元数据抓取、PDF管理、文献分析和知识产出等关键插件的使用方法。

weixin_42531516的博客 171

(2011.09.08)《C++ Primer》第一部分学习笔记汇总——基本语言

《C++ Primer》第一部分学习笔记汇总——基本语言   《C++ Primer》 第1章学习笔记 第01章:快速入门   这一章,书上用了一个例子贯穿每部分的内容,“书店的书本销售情况”(包括销售册数与单价)。   第二节:介绍输入与输出 @ 学习摘录001: ——endl称为操纵符(manipulator),可刷新与设备相关联的缓冲区。 ——在刷新缓冲区时,用户可立即看到

Neicole ~~ 学习旅程(大学) 1735

YOLO系列训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法(GTX16xx系列显卡大坑)

YOLO系列训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法(GTX16xx系列显卡大坑)

weixin_55249340的博客 3万+

C++类和对象知识点整理一

C++类和对象知识点整理(1) 1、面向过程和面向对象的区别 面向过程: a.自顶向下,每一个过程可以看成函数,缺点是不易改动 b.面向过程编程采取的是时间换取空间的策略  c.面向过程是分析解决问题的步骤,然后用函数把这些步骤一步一步实现,然后在使用的时候一一调用即可 面向对象: a.面向对象是把构成问题的事物分成各个对象,容易修改,例如加入功能,如果是面向过程的设计,需要改动一连串

Ycx_lq的博客 1268

YF-S401水流量传感器在STM32上的精准计量实现

本文详细介绍了YF-S401水流量传感器与STM32微控制器的集成应用,实现精准水流计量。通过外部中断和外部时钟两种脉冲计数方案,结合硬件配置、软件滤波和校准技巧,确保高精度流量测量。适用于智能家居和工业自动化中的水控系统,提升系统稳定性和测量准确性。

rainy的博客 897

Python实战:5分钟搞定VCF文件中每个样本的SNP统计(附bcftools安装指南)

本文介绍了三种高效统计VCF文件中每个样本SNP数量的Python方法,包括原生解析、结合bcftools的推荐方案以及使用PyVCF3专业库。特别推荐bcftools结合Python的方法,适用于中大型VCF文件,显著提升处理效率。文章还提供了bcftools安装指南和进阶统计技巧,帮助生物信息学分析人员快速完成SNP统计任务。

weixin_30555125的博客 494

类与对象练习题(一)---Point类

我是计算机专业的一位大一本科生,C++小白,下面是我们学校在学习C++时用的基础练习题,我感觉这些题比较适合初学C++的码友,所以利用空闲时间将这些题整理出来,一是为了让初学C++的码友有所参考,二也是为了复习一下所学过知识。(因准备急促,如有代码错误,还请各位码友指正。) Point类01 定义一个Point类,数据成员包括私有数据成员为double类型的点坐标x,y;成员函数包括构造函数Point(用于实现对数据成员x,y的初始化),成员函数Display(用于输出点坐标x、y,输出格式为点坐标用逗号分

Lucky_追梦仔的博客 1万+

GPS从入门到放弃(十七) --- 对流层延时

GPS从入门到放弃(十七) — 对流层延时 对流层概念 对流层(Troposphere)地球大气层靠近地面的一层。它同时是地球大气层里密度最高的一层,它蕴含了整个大气层约75%的质量,以及几乎所有的水蒸气及气溶胶。 对流层的下界与地面相接,上界高度随地理纬度和季节而变化,在低纬度地区平均高度为1718公里,在中纬度地区平均为1012公里,在高维度地区平均为8~9公里,并且夏季高于冬季。 卫星导航...

tyst08的专栏 1万+

C++ 类与对象关键知识总结

class 类名 {// 访问权限控制(public/private/protected)public:// 公有成员(外部可访问)数据成员类型 数据成员名;// 属性成员函数返回值类型 成员函数名(参数列表) { 函数体 } // 行为private:// 私有成员(仅类内部可访问)数据成员类型 数据成员名;protected:// 保护成员(类内部+子类可访问)数据成员类型 数据成员名;// 注意分号不能少!类定义末尾的分号容易忘记,导致编译错误。

2401_87257340的博客 806

YOLOv8环境搭建+训练自己的数据详细项目

直接按照路径会有问题,找到自己 requirements.txt 文件路径,我这里是pip install -r D:\ultralytics-main\ultralytics-main\requirements.txt。首先去自己的anaconda的安装的envs(虚拟环境),在导航栏输入cmd,进入命令窗口。到官方网站下载yolo模型 ,下载好后解压,里面有个文件requirements.txt。然后安装ultralytics ,这是必须的。

m0_63172128的博客 2万+

Imagenet数据集1000类别中英文

英文 {0: 'tench, Tinca tinca', 1: 'goldfish, Carassius auratus', 2: 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias', 3: 'tiger shark, Galeocerdo cuvieri', 4: 'hammerhead, hammerhead shark', 5: 'electric ray, cram.

识物专栏 1800

【C++】【类与对象知识整理】(二)

类和对象知识汇总

Reeuse的博客 997

【Windows Server 2019】发布服务器 | 远程桌面服务的安装与配置 Ⅰ——理论,实验拓扑和安装基于RemoteAPP的RDS

博客介绍了Windows Server中远程桌面服务的理论,实验拓扑以及基于RemoteAPP的RDS安装。博文介绍了如何在Windows Server上部署发布服务器。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 6129

C++期末复习小整理(一)

2019期末C++易错点整理(一) 网络1801张恒 五一劳动节期间整理 1.绪论 面向对象设计方法的主要特征是继承 面向对象方法比面向过程方法更加先进 C++相对于C的最根本变化是引进了类和对象的概念 对象的封装是抽象的封装,外界可以直接干预 封装就是将一组数据和与这组数据有关的操作组装在一起,形成一个实体,这个实体就是对象,而实现封装性则需要类的帮助 在考概念题的时候喜欢考标识符的定义,这个知...

qq_43460290的博客 2243

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++ 类与对象(下篇)笔记整理

若成员是自定义类型(如类 A),且该类没有默认构造函数(即必须传参才能构造),则必须在初始化列表中给该成员传递构造参数。cpp运行// 类A:无默认构造函数(只有带参构造)class A {private:int _a;public:A(int a) : _a(a) {} // 带参构造,无默认构造// 类B:包含A类型成员,必须用初始化列表初始化_aobjclass B {private:A _aobj;

rechol的博客 1741

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++知识点整理

虽说还没学完这本书,但是我想着这件事差不多已经可以着手开始做了,就慢慢整理,慢慢更新,总会写完的。 这篇博客是会更新的,直到把我认为要考的内容写完 有和同学讨论这篇博客啦,因为我真的很想把这篇博客写好,我也确实发现了一些问题,就是我这篇博客是基于你C语言的基础ok,C++愿意照着课本看,却有点疑惑,可以来这里看看我的理解的,当然如果你学的很棒的话,这篇博客没有吊用,相信自己就好了,其实我有想着...

permi_yaxileni的博客 7667

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

初识Cpp之 一、基础知识

​ C++融合了三种不同的编程方式:1、C语言代表的过程性语言,2、C++在C语言的基础上添加的类代表的面向对象语言,3、C++模板支持的泛型编程。使用C++的原因之一是为了利用其面向对象的特性。要利用这种特性,必须对标准C语言知识有较为深入的了解,因为它提供了基本类型、运算符、控制结构和语法规则。​ 面向对象编程(Object Oriented Programming, OOP)的诞生,试图让语言来满足问题的要求,其理念是设计与问题本质特性相对应的数据格式。

Shen Mu Xin's Blog 2989

C++入门基础知识总结(2022整理)

一、C++入门基础知识之什么是C++? 1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。 PDF版、C++资料教程、C++电子书籍获取 关注微信公众号:“ C和C加加 ” 回复关键字:“ C++ ”即可领取 二、C++入门基础..

weixin_55305220的博客 2万+

C++ 类与对象(上)笔记(整理与补充)

类是 “成员变量”(描述对象属性 / 状态)与 “成员方法”(描述对象行为 / 操作)的集合,是封装思想的直接体现。为保证代码模块化与可维护性,C++ 中类的声明与定义声明(Declaration):放在.h(头文件)中,仅告知编译器 “类的结构”(包含哪些成员变量、成员方法的签名),不涉及具体实现。定义(Definition):放在.cpp(源文件)中,实现.h中声明的成员方法(填充函数逻辑)。声明是 “向编译器承诺某个实体的存在”,仅告知实体的 “名称与签名”,不分配内存或填充实现逻辑。

rechol的博客 1004

C++知识整理 - 类与对象的概念

主要内容 对象 封装与信息隐蔽 抽象 继承与重用 多态性 类的声明 成员函数 1)类外定义成员函数 2)内置成员函数 3)成员函数的存储方式 类声明和成员函数的定义分离 C++并不是一种纯粹的面向对象的语言,而是一种基于过程和面向对象的混合型语言。C++面向对象的机制就是为了解决编写大程序时遇到的困难。 面向对象的程序设计有4个主要的特点:抽象、封装、继承和多态性。C++的类...

春雪阁 471

c++类和对象的复习整理

c++类和对象的复习整理一、类的定义 一、类的定义 类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。 class Circle { public://公有属性 char *name; int length; void print() { cout<<na...

qq_45930294的博客 1142

C++入门05 类与对象

听课笔记简单整理,供小伙伴们参考~🥝🥝

weixin_42789937的博客 1292

C++类与对象知识整理

类的定义 class className { // 类体:由成员函数和成员变量组成 }; 这是定义类的一般形式,class为类的关键字,className为类的名字(可自定义名字),{}两个大括号中放的就是类体,由成员函数和成员变量组成。**这里一定注意类定义结束时的;**在类体外定义成员时需使用::作用域解析符指明这个成员属于哪个类。 类的两种定义方式: 1.声明和定义全放在类体中,主要指成员函...

qq_41913858的博客 215

【C++】类与对象知识点整理

1、类的6个默认成员函数 空类:如果一个类中什么成员都没有,形如下面这样,我们就称其为空类。 class Date { }; 那空类中什么都没有吗?并不是,任何一个类,在我们不写内容的情况下都会自动生成6个默认成员函数。 2、构造函数 1、概念 构造函数是一个特殊的成员函数,名字和类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命...

swag_wg的博客 465

【C++闯关笔记】封装①:类与对象

本文介绍了C++面向对象编程中的封装概念。通过对比C语言面向过程与C++面向对象的差异,阐述了类的基本定义和访问限定符的作用。重点讲解了类的六个默认成员函数中的四个关键函数:构造函数(初始化对象)、析构函数(清理资源)、拷贝构造函数(对象复制)和赋值运算符重载(对象赋值)。文章通过洗衣服的生动例子说明面向对象的优势,并详细分析了封装带来的数据安全性、可扩展性等好处。最后提供了一个完整的Date类示例,展示了这些概念的实际应用。该文适合C++初学者理解面向对象编程的核心思想。

Kaisir777的博客 1018

C++面向对象整理(1)之初识类和对象

类的定义、类成员函数、类外定义、构造函数、类对象初始化、匿名对象

ULTRAmanTAROACE的博客 1363
上一篇: 【数据结构】【排序】其实超级简单啦!
下一篇: 【C++】【类与对象知识整理】(二)
Reuuse
博客等级 码龄3年 611粉丝 72原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Reuuse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值