【学习记录】C++面向对象高级编程【更新中】

C++面向对象高级编程

  • 1 inline-内联函数
    • 1.1 什么是内联函数?
    • 1.2 为什么需要内联函数?
  • 2 构造函数
    • 2.1 构造函数是什么?
    • 2.2 为什么需要构造函数?
    • 2.3 ctor(构造函数)可以有很多个-overloading重载
    • 2.4 ctors放在private区-Singleton
  • 3 参数传递与返回值
    • 3.1 参数传递:值传递 vs. 引用传递 (to const)
    • 3.2 返回值传递:值传递 vs. 引用传递 (to const)
  • 4 friend(友元)
  • 5 操作符重载(operator overloading)-1,成员函数——this

1 inline-内联函数

1.1 什么是内联函数?

如果某个函数(只有一两行语句)前面加上“inline”的关键字,则该函数被称为内联函数。在编译时,在函数被调用的地方将会被替换成该函数体。

1.2 为什么需要内联函数?

主要是为了解决一些频繁调用的小函数大量消耗栈内存的问题

2 构造函数

class complex {
public:
	complex(double r = 0, double i = 0)
		: re(r), im(i) 
	{ }
	complex& operator += (const complex&);
	double real() const { return re;  }
	double imag() const { return im;  } //class内置函数,默认是inline
private:
	//T re, im;
	double re, im;

	friend complex& __doapl(complex*, const complex&);
};

2.1 构造函数是什么?

complex类的构造函数主要是以下三行语句:

complex(double r = 0, double i = 0) 
  : re(r), im(i) 
{ }

在创建对象时,我们可以调用构造函数:

complex c1(2, 1);
complex c2;
complex* p = new complex(4);

2.2 为什么需要构造函数?

中间行是initialization list(初值列,初始列),实际上就是对re和im进行初始化并进行初始值的赋值。虽然我们在{ }内进行赋值也可以,但是这样就“放弃”了初始化的阶段,虽然最后还是把值放进去了,但是时间点完了,效率也会低一点。

2.3 ctor(构造函数)可以有很多个-overloading重载

重载的意思是说,c++允许多个同名的函数存在,比如说下面两个函数:

double real () const { return re; }
void real(double r ) { re = r; }

他们的名称是一样的,但是对于编译器来说,他们经过编译后的实际名称是不一样的。所以他们可以同时存在,因为编译器知道当他遇到这个名称的函数时自己要调用哪一个函数。
在这里插入图片描述
但是对于构造函数来说,下面这种情况是不允许的:

complex (double r = 0; double i = 0)
  : re (r), im (i)
{ }
complex () : re (0), im (0) { }
complex c1;
complex c2();

因为上面的构造函数具有默认参数,两种构造函数都可以用上面两种方式被调用,对于编辑器来说,他就不知道到底要调用哪一个构造函数。

2.4 ctors放在private区-Singleton

class A{
public:
	static A& getInstance();
	setup() {...}
private:
	A();
	A(const A& rhs);
	...
};

A& A::getInstance(){
    static A a;
    return a;
}

当构造函数放在private里时,说明它只能被创造一次(已经在类中创建好了),需要使用时调用类的getInstance()函数获取它。

3 参数传递与返回值

3.1 参数传递:值传递 vs. 引用传递 (to const)

值传递不能改变原始变量的值,引用传递可以改变(const除外)。在可以的情况下,尽量都使用引用传递函数参数。
下面是引用传递的一个例子:

#include <iostream>
 
void changeValue(int& numRef) {
    numRef = 5;
}
 
int main() {
    int num = 10;
    changeValue(num);
    std::cout << num << std::endl; // 输出结果为5,原始值被修改
    return 0;
}

3.2 返回值传递:值传递 vs. 引用传递 (to const)

需要注意的是,使用引用传递返回值时,这个引用是否还有效?如果当一个函数结束,引用的空间被销毁,那么传出去的东西就是坏的。

4 friend(友元)

class complex
{
...
private:
  double re, im;
  friend complex& __doapl (complex*, const complex&);
}

inline complex& doapl (complex* ths, const complex& r)
{
  ths->re += r.re;
  ths->im += r.im;
  return *ths;
}

友元函数可以自由取得这个类中的private成员。
相同class的各个object互为友元。可以看到下面例子中c2可以直接获得c1中的private成员:

class complex{
public:
  complex (double r=0, double i=0)
    : re (r), im (i)
  { }
  int func(const complex& param){
      return param.re + param.im;
  }
private:
  double re, im;
};

...
{
    complex c1(2, 1);
    complex c2;

    c2.func(c1);
}

5 操作符重载(operator overloading)-1,成员函数——this

inline complex& __doapl(complex* ths, const complex& r){
    ths->re += r.re;
    ths->im += r.im;
    return *ths;
}

inline complex& complex:: operator += (const complex& r){
    return __doapl(this, r);
}
{
    complex c1(2, 1);
    complex c2(5);

    c2 += c1;
}

当编译器看到使用“+=”这个操作符时,它是作用在左边的成员身上的,也就是“c2”。如果“c2”有对这个操作符做定义的话,那么编译器就可以执行定义的相关操作,也就是下面这个函数:

inline complex& complex:: operator += (this, const complex& r){
    return __doapl(this, r);
}

可以发现我在重写这个函数时,参数中多了一个“this”,但实际上代码中是没有的(不能写出来)。“this”是一个指针,它代表的是调用这个函数的成员变量,也就是“c2”。那么“r”就是“c1”。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Anthropic发布最强大模型Claude 3,实力碾压GPT-4和Gemini!

前言 2024年3月4日&#xff0c;Anthropic 发布了Claude 3新版系列模型&#xff0c;含Haiku、Sonnet 和 Opus三个版本。其中最强大的模型在各种基准测试中均优于OpenAI的GPT-4和Google的 Gemini 1.0 Ultra&#xff0c;已成为大模型领域的新巨头。 大家如果对AI感兴趣&#xff0c…

TensorRT入门:trtexec开发辅助工具的使用

文章目录 一、trtexec简介二、trtexec使用1.trtexec常用参数1. 构建阶段2. 运行阶段 2.基本使用方法1. trtexec最基本的使用方法&#xff0c;读取onnx模型并通过trtexec测试推理性能。2. trtexec解析ONNX文件&#xff0c;使用优化选择构建TensorRT引擎并保存至.plan文件补充&am…

力扣--动态规划64.最小路径和

思路分析&#xff1a; 基本思路&#xff1a; 本算法采用动态规划的思想&#xff0c;通过构建一个额外的二维矢量 dp 来存储每个位置的最小路径和。最终目标是求得右下角位置的最小路径和&#xff0c;即整个网格的最小路径和。 初始化&#xff1a; 初始化矢量的行数和列数&…

使用awk和正则表达式过滤文本或字符串 - 详细指南和示例

当我们在 Linux 中运行某些命令来读取或编辑字符串或文件中的文本时&#xff0c;我们经常尝试将输出过滤到感兴趣的特定部分。这就是使用正则表达式派上用场的地方。 什么是正则表达式&#xff1f; 正则表达式可以定义为表示多个字符序列的字符串。关于正则表达式最重要的事情之…

考研数学|数一125学长备考经验+资料

考研数学复习规划的关键&#xff0c;是不要执着于进度&#xff0c;不要执着于每天每个时间段准确的划分去做什么做什么&#xff0c;就好像完成任务的权重大于复习质量的权重一样&#xff0c;本末倒置了。 正确的做法&#xff0c;是聚焦于学习质量&#xff0c;持之以恒。所需要掌…

FreeRTOS操作系统学习——FreeRTOS工程创建

FreeROTS工程创建 详细步骤 如无特殊情况&#xff0c;大部人都要配置为外部高速时钟 另外&#xff0c;本实验使用了FreeRTOS&#xff0c;FreeRTOS的时基使用的是Systick&#xff0c;而 STM32CubeMX中默认的HAL库时基也是Systick&#xff0c;为了避免可能的冲突&#xff0c;最…

如何理解XML解析库?

untangle untangle 是一个简洁的用于解析 XML 文档的库。输入一个 XML 文档后&#xff0c;untangle 将文档的结构映射成结点和属性&#xff0c;并返回一个 Python 对象。 形如以下的 XML 文件&#xff1a; <?xml version"1.0"?> <root><child nam…

BUUCTF-Misc-[安洵杯 2019]Attack1

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 下载附件打开是一个流量包文件 拖到kali尝试用foremost是否可以分离 分离出来一个压缩包需要密码&#xff1a; 寻找密码&#xff0c;打开数据包导出http数据&#xff0c;发现一个lsass.dump文件 使用kali中mimkatz命令查看 得到…

测试需求平台10-DBUtils 优化数据连接与 SQL Limit 实现分页

✍此系列为整理分享已完结入门搭建《TPM提测平台》系列的迭代版&#xff0c;拥抱Vue3.0将前端框架替换成字节最新开源的arco.design&#xff0c;其中约60%重构和20%新增内容&#xff0c;定位为从 0-1手把手实现简单的测试平台开发教程&#xff0c;内容将囊括基础、扩展和实战&a…

干货!带你快速了解Python元组

1.元组 元组一般用来存储多个数据&#xff0c;使用() 2.创建元组 创建空元组 tup1 () print(tup1) # () print(type(tup1)) # <class tuple> 创建非空元组&#xff08;元组中只有一个元素&#xff0c;一般要在元素的后面加 , 若不加 , 该数据类型不一定是元组…

【Leetcode每日一题】 前缀和 - 寻找数组的中心下标(难度⭐)(28)

1. 题目解析 题目链接&#xff1a;724. 寻找数组的中心下标 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于计算题目所给数组是否存在某一个元素左边的和等于右边的和&#xff0c;存在返回那个元素下标即可&#xff0c;不…

#WEB前端(JS基础语法)

1.实验&#xff1a; 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; &#xff08;1&#xff09;数据类型 var&#xff0c;let&#xff0c;const var,let声明变量&#xff0c;const声明常量。var声明的变量具有函数作用域,let声明的变量具有块级作用域&#xff0c;let跟安全更…

基于SSM的农业电商服务系统(农产品销售管理系统)(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的农业电商服务系统&#xff08;农产品销售管理系统&#xff09;&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#…

Golang pprof 分析程序的使用内存和执行时间

一、分析程序执行的内存情况 package mainimport ("os""runtime/pprof" )func main() {// ... 你的程序逻辑 ...// 将 HeapProfile 写入文件f, err : os.Create("heap.prof")if err ! nil {panic(err)}defer f.Close()pprof.WriteHeapProfile(f…

图像AI换脸软件:AI FaceSwap 中文版

AI FaceSwap 是一款利用人工智能技术进行面部交换的软件。该软件通过先进的人工智能算法&#xff0c;能够将一个人的面部表情、神态和特征准确地映射到另一个人身上&#xff0c;实现面部交换的效果。用户只需要提供两张照片&#xff0c;一张是目标人物的照片&#xff0c;另一张…

一维化01背包(详细)

http://t.csdnimg.cn/P7R3G 之前我们介绍了01背包&#xff0c;但是dp数组是二维化的&#xff0c;现在我们需要将其变成一维数组&#xff0c;如果已经对二维化的01背包十分了解了&#xff0c;那么理解一维化的dp数组也不是问题。 目录 分析 遍历顺序 原二维遍历 一维倒序遍…

GPT-4 及更高版本:大型语言模型的力量

GPT-4革命&#xff1a;人工智能如何重塑SEO行业 在人工智能领域&#xff0c;GPT-4 等语言模型的演变标志着一个重要的里程碑。 本文深入探讨了 GPT-4 的功能和潜力&#xff0c;同时也思考了人工智能领域的未来。 GPT-4 的出现&#xff1a;人工智能的新时代OpenAI 开发的 GPT-4…

Java引用强度

强引用 > 软引用 > 弱引用 > 虚引用 强引用&#xff1a;传统的创建Java对象的方式&#xff0c;如&#xff1a;Object obj new Object();任何情况下&#xff0c;只要存在强引用关系&#xff0c;垃圾回收器永远不会回收掉被引用的对象。 软引用&#xff1a;描述一些还…

微信小程序开发学习笔记《20》uni-app框架-分类导航区域与楼层区域

微信小程序开发学习笔记《20》uni-app框架-分类导航区域与楼层区域 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、分类导航区域 1.1 获取分类导航的数据 实现思路: 定义data数据在onLoad…

smardaten数据报表功能全新上线,迎战“中国式报表”!

数据报表是企业业务数据统计分析最主要的应用方式之一。 面对复杂多元的报表结构、大量的数据处理需求时&#xff0c;“中国式报表”依然是业务人员、特别是财务人员进行数据统计分析的主要方式。虽然绝大多数企业都已部署高效的BI平台&#xff0c;但报表统计与可视化BI之间的…