《C++PrimePlus》第8章 函数探幽

8.1 内联函数

使用内联函数

#include <iostream>
using namespace std;inline double square(double x) { return x * x; }int main(){double a;a = square(5.0);cout << "a = " << a << endl;return 0;
}

8.2 引用变量

将引用用作函数参数(使用const)

#include <iostream>
using namespace std;
double cube(const double &ra);int main(){double x = 3.0;cout << cube(x) << " = cube of " << x << endl;cout << cube(5) << " = cube of " << "5" << endl;cout << cube(x+5) << " = cube of " << x+5 << endl;return 0;
}double cube(const double &ra) {return ra*ra*ra;
}

将引用用于结构

#include <iostream>
#include <string>
using namespace std;struct free_throws {string name;int made;int attempts;float percent;
};void set_pc(free_throws &ft);
void display(const free_throws &ft);
free_throws &accumulate(free_throws &target, const free_throws &source);int main(){free_throws one = { "Rick", 13, 14 }; // 最后一个值没赋值,为空free_throws two = { "Jack", 10, 16 };free_throws team = { "All", 0, 0 };set_pc(one); // 赋值display(one); // 展示display(accumulate(team, one)); // 汇总return 0;
}void set_pc(free_throws &ft) { // 要修改原始数据,不加constif (ft.attempts != 0)ft.percent = 100.0 * float(ft.made) / float(ft.attempts);elseft.attempts = 0;
}void display(const free_throws &ft) {cout << "Name: " << ft.name << endl;cout << "Made: " << ft.made << '\t';cout << "Attempts: " << ft.attempts << '\t';cout << "Percent: " << ft.percent << endl;
}
// 把函数的返回值定义为结构体引用
free_throws &accumulate(free_throws &target, const free_throws &source) {target.attempts += source.attempts;target.made += source.made;set_pc(target);return target;
}

将引用用于类的对象

#include <iostream>
#include <string>
using namespace std;
string version1(const string &s1, const string &s2);
const string &version2(string &s1, const string &s2);
// const string &version3(string &s1, const string &s2);int main(){string input;string copy;string result;cout << "Enter a string: ";getline(cin, input);copy = input;cout << "You string: " << input << endl;result = version1(input, "***"); // 在字符串前后都加上***cout << "Your string enhanced: " << result << endl;cout << "Your input: " << input << endl;cout << "-------------------------------------" << endl;result = version2(input, "###");cout << "Your string enhanced: " << result << endl;cout << "Your input: " << input << endl;//cout << "-------------------------------------" << endl;//input = copy;//result = version3(input, "@@@");//cout << "Your string enhanced: " << result << endl;//cout << "Your input: " << input << endl;return 0;
}
// const string &s2 对应的是 "***"
// 当使用const限定符时,会产生临时变量并进行类型转换
string version1(const string &s1, const string &s2) {string temp;temp = s2 + s1 + s2;return temp;
}
// 返回一个string类的对象的引用
const string &version2(string &s1, const string &s2) {s1 = s2 + s1 + s2;return s1;
}/*错误的使用方法:返回临时变量的引用
const string &version3(string &s1, const string &s2) {string temp;temp = s2 + s1 + s2;return temp;
}
*/

对象、继承和引用

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
const int LIMIT = 5;
void file_it(ostream &os, double fo, const double fe[], int n);int main(){fstream fout;// 先在路径中里新建这个txt文件const char *fn = "ep-data.txt";fout.open(fn);if (!fout.is_open()) {cout << "Can't open " << fn << "." << endl;exit(EXIT_FAILURE);}double objective; // 物镜的焦距cout << "Enter the focal length of telescope objective in mm: ";cin >> objective;double eps[LIMIT]; // 目镜的焦距for (int i = 0; i < LIMIT; i++) {cout << "Eyepieces #" << i + 1 << ": ";cin >> eps[i];}file_it(cout, objective, eps, LIMIT); // 在终端上显示file_it(fout, objective, eps, LIMIT); // 在文件中显示cout << "Done." << endl;return 0;
}
// ostream &os 基类的引用,可以指向基类的对象,也可以指向派生类的对象
void file_it(ostream &os, double fo, const double fe[], int n) {os << "Focal length of objective: " << fo << endl;os << "f.l. eyepieces" << " magnification" << endl;for (int i = 0; i < n; i++) {os << "    " << fe[i] << "    " << int(fo / fe[i] + 0.5) << endl;}
}

8.3 默认参数

默认参数的用法(取出字符串的前n个值)

#include <iostream>
using namespace std;
const int ArSize = 80;
char *left(const char *str, int n = 1); // 默认参数n=1int main(){char sample[ArSize];cout << "Enter a string: " << endl;cin.get(sample, ArSize);char *ps = left(sample, 4);cout << ps << endl;delete[] ps; // 注意new和delete成对出现ps = left(sample); // 使用默认参数cout << ps << endl;delete[] ps;return 0;
}char *left(const char *str, int n) {int m = 0;while (m < n && str[m] != '\0') m++; // 确定字符串长度char *p = new char[m + 1];int i;for (i = 0; i < m; i++) {p[i] = str[i];}p[i] = '\0'; // 最后要补上一个空字符return p;
}

8.4 函数重载

函数重载示例(取出字符串/数字的前n个值)

#include <iostream>
using namespace std;
const int ArSize = 80;
char *left(const char *str, int n = 1);
unsigned long left(unsigned long num, unsigned int ct);int main(){const char *trip = "Hawaii";unsigned long n = 12345678;int i;char *temp;for (i = 0; i < 10; i++) {cout << left(n, i) << endl;temp = left(trip, i);cout << temp << endl;delete[] temp;}return 0;
}char *left(const char *str, int n) {int m = 0;while (m < n && str[m] != '\0') m++; // 确定字符串长度char *p = new char[m + 1];int i;for (i = 0; i < m; i++) {p[i] = str[i];}p[i] = '\0'; // 最后要补上一个空字符return p;
}unsigned long left(unsigned long num, unsigned int ct) {unsigned long n = num;unsigned int digits = 1;if (num == 0 || ct == 0) return 0; // 特殊情况while (n /= 10) digits++; // 判断数字有几位if (digits > ct) {ct = digits - ct; // 要除几次10while (ct--) num /= 10;return num;}elsereturn num;
}

8.5 函数模板

函数模板示例(交换两个数的值)

#include <iostream>
using namespace std;
template <typename T>
void Swap(T &a, T &b);int main(){int i = 10;int j = 20;cout << "i, j = " << i << ", " << j << "." << endl;Swap(i, j);cout << "Afer swap, i, j = " << i << ", " << j << "." << endl;double x = 24.5;double y = 81.7;cout << "x, y = " << x << ", " << y << "." << endl;Swap(x, y);cout << "Afer swap, x, y = " << x << ", " << y << "." << endl;return 0;
}template <typename T>
void Swap(T &a, T &b) {T temp;temp = a;a = b;b = temp;
}

重载的模板示例(交换两个数或两个数组)

#include <iostream>
using namespace std;
template <typename T>
void Swap(T &a, T &b);
template <typename T>
void Swap(T a[], T b[], int n);
const int LIMIT = 8;
void show(int arr[], int n);int main(){int i = 10;int j = 20;cout << "i, j = " << i << ", " << j << "." << endl;Swap(i, j);cout << "Afer swap, i, j = " << i << ", " << j << "." << endl;int d1[LIMIT] = { 0,7,0,4,1,7,7,6 };int d2[LIMIT] = { 0,7,2,0,1,9,6,9 };cout << "Original arrays: " << endl;show(d1, LIMIT);show(d2, LIMIT);Swap(d1, d2, LIMIT);cout << "After swap: " << endl;show(d1, LIMIT);show(d2, LIMIT);return 0;
}template <typename T>
void Swap(T &a, T &b) {T temp;temp = a;a = b;b = temp;
}template <typename T>
void Swap(T a[], T b[], int n) {T temp;for (int i = 0; i < n; i++) {temp = a[i];a[i] = b[i];b[i] = temp;}
}void show(int arr[], int n) {for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;
}

调用函数时的最佳匹配(打印数组内容)

#include <iostream>
using namespace std;
template <typename T>
void ShowArray(T arr[], int n);
template <typename T>
void ShowArray(T *arr[], int n);struct debts {char name[50]; // 名字double amount; // 数量
};int main(){int things[6] = { 13,31,103,301,310,130 };struct debts mr_E[3] = {{"Rick", 2400.00},{"Jack", 1300.0},{"Rose", 1800.0}};double *pd[3]; // 3个元素的数组,每个元素都是指针for (int i = 0; i < 3; i++) {pd[i] = &mr_E[i].amount;}ShowArray(things, 6);// 更匹配 void ShowArray(T *arr[], int n)// 会打印出来指针指向的数值ShowArray(pd, 3); return 0;
}template <typename T>
void ShowArray(T arr[], int n) {cout << "template A:" << endl;for (int i = 0; i < n; i++)cout << arr[i] << " ";cout << endl;
}template <typename T>
void ShowArray(T *arr[], int n) {cout << "template B:" << endl;for (int i = 0; i < n; i++) cout << *arr[i] << " ";cout << endl;
}

引导编译器使用指定函数(打印较小的值)

#include <iostream>
using namespace std;
template <class T>T lesser(T a, T b) { // 函数1 返回较小值return a < b ? a : b;
}int lesser(int a, int b) { // 函数2 返回绝对值的较小值a = a < 0 ? -a : a;b = b < 0 ? -b : b;return a < b ? a : b;
}int main(){int m = 20, n = -30;double x = 15.5, y = -25.9;// 非模板函数优先,调用的是函数2cout << lesser(m, n) << endl;// 非模板函数不是最优(要进行类型转换),调用的是函数1cout << lesser(x, y) << endl;// 尖括号<>告诉编译器使用模板函数,调用函数1cout << lesser<>(m, n) << endl;// 把x和y强制转换为int类型,再使用模板函数2cout << lesser<int>(x, y) << endl;return 0;
}

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

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

相关文章

java: 无效的目标发行版: 17 问题解决

今天在写完类点击运行后显示java: 无效的目标发行版: 17 网上查询了一番&#xff0c;发现有几个地方需要注意。 还有一个就是设置中&#xff0c;下面的就是我本次问题所在&#xff0c;不知道为什么&#xff0c;他自动添加了下面的东西 一个方法是把目标字节码版本改为正确的&a…

(C++)验证回文字符串

愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/valid-pali…

OpenAI 超 700 名员工联名逼宫董事会;ChatGPT 新功能“阅后即焚”丨 RTE 开发者日报 Vol.89

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

数据资产到底如何入表?

2024年1月1日起&#xff0c;财政部《企业数据资源相关会计处理暂行规定》正式施行&#xff0c;距离现在只有一个多月的时间。 数据资源入表意味着企业可以将数据资源确认为企业资产负债表中“资产”一项。对于拥有丰富数据资源的企业来说&#xff0c;有望在财务报表中体现其真…

Spring Boot单元测试

目录 1.概述 2.基本使用 3.优势 4.常用属性 1.概述 所谓单元测试就是对功能最小粒度的测试&#xff0c;落实到JAVA中就是对单个方法的测试。对单个方法的测试用junit即可&#xff0c;关于junit作者另一位篇文章中有详细介绍&#xff0c;感兴趣的小伙伴可以去看看&#xff…

Sqlite安装配置及使用

一、下载SQLite Sqlite官网 我下载的是3370000版本:sqlite-dll-win64-x64-3370000.zip 和 sqlite-tools-win32-x86-3370000.zip 二、解压下载的两个压缩包 三、配置环境 四、检查是否安装配置成功 winR&#xff1a;输入cmd调出命令窗口&#xff0c;输入sqlite3后回车查看s…

百度爬虫的工作原理解析

百度作为中国最大的搜索引擎&#xff0c;其工作原理备受关注。本文将深入探讨百度爬虫的工作原理&#xff0c;介绍其基本流程以及关键技术&#xff0c;帮助读者更好地理解搜索引擎背后的技术核心。 百度爬虫是百度搜索引擎的重要基石&#xff0c;它们被广泛用于收集互联网上的网…

08-黑马点评项目发布笔记和查看笔记功能的实现

发布笔记 数据模型 tb_blog探店笔记表,包含笔记的标题、文字、图片等 tb_blog探店笔记表对应的实体类 增加用户图标和和用户姓名以及是否被点赞过了的字段,这些字段不属于Blog表只是为了实现在展示笔记的时候同时展示用户的信息 Data EqualsAndHashCode(callSuper false) …

Vue框架学习笔记——v-bind数据单向绑定和v-model数据双向绑定

文章目录 v-bind&#xff0c;数据单向绑定简写形态&#xff08;省略v-bind&#xff0c;只留冒号&#xff09;示例一&#xff08;将输入框数据改为&#xff1a;哈哈哈哈哈&#xff09;&#xff1a;实例二&#xff08;将Vue实例中的name改为字符串&#xff1a;"单向绑定&quo…

多模态大模型训练数据集汇总介绍

RefCOCO、RefCOCO、RefCOCOg 这三个是从MS-COCO中选取图像得到的数据集&#xff0c;数据集中对所有的 phrase 都有 bbox 的标注。 RefCOCO 共有19,994幅图像&#xff0c;包含142,209个引用表达式&#xff0c;包含50,000个对象实例。RefCOCO 共有19,992幅图像&#xff0c;包含1…

Mybatis Plus分页实现逻辑整理(结合芋道整合进行解析)

Mybatis Plus分页实现逻辑整理&#xff08;结合芋道整合进行解析&#xff09; 我希望如春天般的你&#xff0c;身着白色的婚纱&#xff0c;向我奔赴而来&#xff0c;我愿意用全世界最温情的目光&#xff0c;朝着你的方向望去——姗姗来迟。 1.背景介绍 https://baomidou.com/p…

有依次对应关系的数组X、Y、Z,如何排序其中一个X数组,使得另外的数组还与排序完成后的数组相对应(C语言实现)

1. 目的 有依次对应关系的数组X、Y、Z&#xff0c;排序其中一个X数组&#xff0c;使得另外的数组还与排序完成后的数组相对应&#xff0c;并打印出排序完成后的X、Y、Z数组。 2. 具体实现 以下面的这个对应关系为例&#xff0c;进行相应编程实现。 X [3.7,7.7,-6.6,1.5,-4.5…

Linux系统编程学习 NO.9——git、gdb

前言 本篇文章简单介绍了Linux操作系统中两个实用的开发工具git版本控制器和gdb调试器。 git 什么是git&#xff1f; git是一款开源的分布式版本控制软件。它不仅具有网络功能&#xff0c;还是服务端与客户端一体的软件。它可以高效的处理程序项目中的版本管理。它是Linux内…

深入理解Linux网络笔记(六):深度理解TCP连接建立过程

本文为《深入理解Linux网络》学习笔记&#xff0c;使用的Linux源码版本是3.10&#xff0c;网卡驱动默认采用的都是Intel的igb网卡驱动 Linux源码在线阅读&#xff1a;https://elixir.bootlin.com/linux/v3.10/source 5、深度理解TCP连接建立过程 1&#xff09;、深入理解liste…

python查找算法_顺序查找

顺序查找&#xff08;Sequential Search&#xff09;是一种简单直观的搜索算法&#xff0c;用于在无序数组中查找特定元素。它的基本思想是逐个遍历数组中的元素&#xff0c;直到找到目标元素或遍历完整个数组。本文将介绍顺序查找的基本原理&#xff0c;并通过Python代码进行详…

【剑指offer|图解|链表】链表的中间结点 + 链表中倒数第k个结点

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、算法模板 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️链表的中间结点二. ⛳️链表中倒数第k个结点&#x1f4dd;结语 &#x1f4c…

如何为视频添加旁白,有哪些操作技巧?

简而言之&#xff0c;画外音是视频的旁白&#xff0c;在教程视频中添加旁白可以使视频更加有趣&#xff0c;并向观看者传达更多的信息。 如果您是视频制作人&#xff0c;想要为视频添加旁白&#xff0c;可阅读以下文章&#xff0c;可以帮助您更好地进行配音。 制作配音的技巧…

www.testfire.nets渗透测试报告

www.testfire.nets渗透测试报告 一、测试综述 1.1.测试⽬的 通过实施针对性的渗透测试&#xff0c;发现testfire.net⽹站的安全漏洞&#xff0c;锻炼自己的渗透水平 1.2.测试范围 域名&#xff1a;www.testfire.net IP:65.61.137.117 测试时间&#xff1a; 2023年11月…

AC修炼计划(AtCoder Beginner Contest 329)

传送门&#xff1a;&#xff33;&#xff4b;&#xff59; Inc, Programming Contest 2023&#xff08;AtCoder Beginner Contest 329&#xff09; - AtCoder A&#xff0c;B&#xff0c;C&#xff0c;D 这四道题比较简单&#xff0c;就不多叙述。 E - Stamp 这题是一道比较…

opencv-图像平滑

高斯平滑 高斯平滑即采用高斯卷积核对图像矩阵进行卷积操作。高斯卷积核是一个近似服从高斯分布的矩阵&#xff0c;随着距离中心点的距离增加&#xff0c;其值变小。这样进行平滑处理时&#xff0c;图像矩阵中锚点处像素值权重大&#xff0c;边缘处像素值权重小。 import cv2 …