c++ 笔记1

2023-11-05

1.inline内联函数##

1.inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义,解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题。

2.inline的使用是有所限制的,inline只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。

3.inline函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。

4.定义在类中的成员函数缺省都是内联的,如果在类定义时就在类内给出函数定义,那当然最好。如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的。

2.构造函数初始化

成员变量再构造函数中初始化中使用":"函数方式性能比直接在构造函数中赋值要快,建议使用这种方式。

3.构造函数重载注意事项

黄色标注的构造函数定义将出现问题,如果该函数与上面构造函数同时出现,在无参初始化该类对象时将产生冲突,因为第一个构造函数已经有参数默认初始化列表了,定义该类对象时可以不加入参数,这就产生了冲突。

4.常量成员函数

在一个类中,如果成员函数中没有改变成员函数操作(例如get操作),那么建议在该方法声明处加入const关键字,如果不加入const关键字,那么c++编译器将认为该函数可能会修改类的成员变量。这样做有个好处,可以看到上图的"?!"一图,使用者利用了const关键字定义并通过构造函数初始化了一个complex类,这个类将不能被修改,只能读取属性。当使用者调用complex的real()或者imag()方法时,如果这两个方法在定义处没有加入const关键字,那么将报错。

5.参数传递和返回值使用const引用

函数参数传递,如果不需要改变参数值,建议使用const reference减小开销。

返回值建议使用引用,但如果返回引用的是该函数的一个指向堆局部变量指针,例如*ptr,那么不能使用引用,因为该局部变量在函数调用后就以及销毁了,引用可以认为是给当前对象换了个别名,如果当前对象已经被销毁,那么该“别名”也就失去了意义,不存在了。

当然,如下图所示,对于临时变量也不能返回引用:

6.友元

相同类的各个实例对象互为友元,可以通过彼此的内部方法调用传入参数的内部私有成员变量。

7.运算符重载this指针

如上图所所示,在运算符重载过程中隐藏了this指针,该指针编译器会处理,使用者不能显式声明。

8.规范化代码一

complex.h

#ifndef __MYCOMPLEX__
#define __MYCOMPLEX__

class complex; 
complex&
  __doapl (complex* ths, const complex& r);
complex&
  __doami (complex* ths, const complex& r);
complex&
  __doaml (complex* ths, const complex& r);


class complex
{
public:
  complex (double r = 0, double i = 0): re (r), im (i) { }
  complex& operator += (const complex&);
  complex& operator -= (const complex&);
  complex& operator *= (const complex&);
  complex& operator /= (const complex&);
  double real () const { return re; }
  double imag () const { return im; }
private:
  double re, im;

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


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);
}

inline complex&
__doami (complex* ths, const complex& r)
{
  ths->re -= r.re;
  ths->im -= r.im;
  return *ths;
}
 
inline complex&
complex::operator -= (const complex& r)
{
  return __doami (this, r);
}
 
inline complex&
__doaml (complex* ths, const complex& r)
{
  double f = ths->re * r.re - ths->im * r.im;
  ths->im = ths->re * r.im + ths->im * r.re;
  ths->re = f;
  return *ths;
}

inline complex&
complex::operator *= (const complex& r)
{
  return __doaml (this, r);
}
 
inline double
imag (const complex& x)
{
  return x.imag ();
}

inline double
real (const complex& x)
{
  return x.real ();
}

inline complex
operator + (const complex& x, const complex& y)
{
  return complex (real (x) + real (y), imag (x) + imag (y));
}

inline complex
operator + (const complex& x, double y)
{
  return complex (real (x) + y, imag (x));
}

inline complex
operator + (double x, const complex& y)
{
  return complex (x + real (y), imag (y));
}

inline complex
operator - (const complex& x, const complex& y)
{
  return complex (real (x) - real (y), imag (x) - imag (y));
}

inline complex
operator - (const complex& x, double y)
{
  return complex (real (x) - y, imag (x));
}

inline complex
operator - (double x, const complex& y)
{
  return complex (x - real (y), - imag (y));
}

inline complex
operator * (const complex& x, const complex& y)
{
  return complex (real (x) * real (y) - imag (x) * imag (y),
			   real (x) * imag (y) + imag (x) * real (y));
}

inline complex
operator * (const complex& x, double y)
{
  return complex (real (x) * y, imag (x) * y);
}

inline complex
operator * (double x, const complex& y)
{
  return complex (x * real (y), x * imag (y));
}

complex
operator / (const complex& x, double y)
{
  return complex (real (x) / y, imag (x) / y);
}

inline complex
operator + (const complex& x)
{
  return x;
}

inline complex
operator - (const complex& x)
{
  return complex (-real (x), -imag (x));
}

inline bool
operator == (const complex& x, const complex& y)
{
  return real (x) == real (y) && imag (x) == imag (y);
}

inline bool
operator == (const complex& x, double y)
{
  return real (x) == y && imag (x) == 0;
}

inline bool
operator == (double x, const complex& y)
{
  return x == real (y) && imag (y) == 0;
}

inline bool
operator != (const complex& x, const complex& y)
{
  return real (x) != real (y) || imag (x) != imag (y);
}

inline bool
operator != (const complex& x, double y)
{
  return real (x) != y || imag (x) != 0;
}

inline bool
operator != (double x, const complex& y)
{
  return x != real (y) || imag (y) != 0;
}

#include <cmath>

inline complex
polar (double r, double t)
{
  return complex (r * cos (t), r * sin (t));
}

inline complex
conj (const complex& x) 
{
  return complex (real (x), -imag (x));
}

inline double
norm (const complex& x)
{
  return real (x) * real (x) + imag (x) * imag (x);
}

#endif   //__MYCOMPLEX__

complex_test.cpp

#include <iostream>
#include "complex.h"

using namespace std;

ostream&
operator << (ostream& os, const complex& x)
{
  return os << '(' << real (x) << ',' << imag (x) << ')';
}

int main()
{
  complex c1(2, 1);
  complex c2(4, 0);

  cout << c1 << endl;
  cout << c2 << endl;
  
  cout << c1+c2 << endl;
  cout << c1-c2 << endl;
  cout << c1*c2 << endl;
  cout << c1 / 2 << endl;
  
  cout << conj(c1) << endl;
  cout << norm(c1) << endl;
  cout << polar(10,4) << endl;
  
  cout << (c1 += c2) << endl;
  
  cout << (c1 == c2) << endl;
  cout << (c1 != c2) << endl;
  cout << +c2 << endl;
  cout << -c2 << endl;
  
  cout << (c2 - 2) << endl;
  cout << (5 + c2) << endl;
  
  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ 笔记1 的相关文章

  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne
  • 为什么匹配模板类上的部分类模板特化与没有模板匹配的另一个部分特化不明确?

    这个问题可能很难用标题中的句子来描述 但这里有一个最小的例子 include

随机推荐

  • Linux压缩解压命令

    1 tar 解包 tar xvf FileName tar 打包 tar cvf FileName tar DirName 注 tar是打包 不是压缩 2 gz 解压1 gunzip FileName gz 解压2 gzip d FileN
  • mysql 批量 update 多个条件_MySQL更新表数据(八)

    更新数据是使用数据库时最重要的任务之一 在本教程中 您将学习如何使用MySQL UPDATE语句来更新表中的数据 1 MySQL UPDATE语句简介 我们使用UPDATE语句来更新表中的现有数据 也可以使用UPDATE语句来更改表中单个行
  • 15 行代码在 wangEditor v5 使用数学公式

    前言 wangEditor v5 正式版发布在即 为了验证它的扩展性 我开发了几个常用的第三方插件 本文介绍一下 formula 插件的设计和使用 插入数学公式要使用 LateX 语法 渲染公式需要依赖工具 KateX 如 c pm sqr
  • ctf-攻防世界-web:disabled_button

    wp 一 提示是前端知识 有一个不能按的按钮 我们F12开发者工具来看看这个按钮 咦 有一个disabled 只要把这个disabled 删掉 按钮就可以按下了 点一下按钮 flag出现 完美 二 或者审计代码 hackbar用post方式
  • Android 获取USB设备的类型

    Version info Linux 3 10 Android 4 2 一 问题 现在有USB设备插入Android系统 那么如何得知插入的设备类型 是USB打印机 U盘 还是USB鼠标 二 USB类型规定 对于USB类型 USB组织是有规
  • 数据监控与报警:将Scrapyd与监控工具集成,实现爬虫异常时的自动警报通知

    目录 1 数据监控与报警的重要性 2 集成监控工具 3 监控爬虫运行状态 4 监控网站结构变化
  • 什么是NoSQL,为什么要使用NoSQL?

    详见 什么是NoSQL 为什么要使用NoSQL 曲健磊的个人博客的博客 CSDN博客 nosql https baike so com doc 5569749 5784951 html 1 为什么用 NoSQL 1 1 单机 MySQL 的
  • HCIP第七天

    OSPF的不规则区域 OSPF区域划分的要求 1 区域之间必须存在ABR 2 区域划分必须按照星型拓扑结构来进行划分 常见的不规则区域 1 远离骨干的非骨干区域 2 不连续骨干区域 远离骨干的非骨干区域 1 使用VPN隧道 直接在非法的AB
  • 2023Testing Expo

    8月9日 11日 2023汽车测试及质量监控博览会将于上海世博展览馆1号馆举行 本次展会将展示测试和验证技术在整车 零部件和系统开发领域中的新发展 新产品和新解决方案 怿星科技将携最新的ETH测试 智驾测试 PPS测试等方案亮相测试展 届时
  • 如何学习好数学

    数学大咖单墫总结数学解题的12条原则 1 要享受到解题的乐趣 对解题有浓厚的兴趣 能有几分痴迷更好 2 要有充足的信心 3 要有百折不回的决心与坚韧不拔的毅力 4 要做100道有质量的题目 5 反复探索 大胆地跟着感觉走 6 从简单的做起
  • 临界区操作的原子性

    所谓的原子性就是操作在未执行完之前不会被打断 在多线程变成的时候 很多时候都会在线程函数中或者被线程调用的函数中使用临界区来实现函数操作的原子性 临界区保证当前进入临界区的线程能够完整执行完临界区中保护的代码不被打断 但是当时我一直对临界区
  • python:json格式化输出

    参考 https stackoverflow com questions 12943819 how to prettyprint a json file import json your json foo bar baz null 1 0
  • kibana启动失败no known master node, scheduling a retry或者master_not_discovered_exception

    今天在用到elasticsearch和kibana时遇到错误 主要就是这种报错master not discovered exception 找不到master节点 有两种解决方法 一种是安装elasticsearch使用 msi安装包的形
  • Android Studio更新Gradle版本

    Android Studio更新Gradle版本 1 在File分栏下 点击Project Structure 2 按照图示步骤操作 选中Project 点击Android Gradle Plugin Version复选框下三角符号 选择需
  • 2022.0306避障小车学习1

    要求 使用stm32f103单片机 应用RTOS实时系统 使用超声波模块 oled屏 l298n直流步进电机 驱动模块和小车底盘 思路 在任务里用超声波实时测出距障碍物的距离 并将距离显示在oled屏上 再根据判断距离大小调用前进或者后退那
  • web应用开发实战 - node.js

    了解Node js Node js 是一个基于 Chrome JavaScript 运行时建立的一个平台 Node js 是一个基于 Chrome V8 引擎的 JavaScript 运行时 Node js是运行在服务端上的 JavaScr
  • 单页面引入vue和element

    引入vue 1 可以直接在页面中引入 2 https cdn jsdelivr net npm vue 2 dist vue js 打开该链接下载vue 存放在本地 引入element 方法同上
  • 交换机的简单描述

    工作原理 1 交换机有张表 MAC地址表 一开始未通讯之前 MAC地址表是空的 2 同一个局域网中主机A访问主机B 3 主机A会将自己的MAC地址和对面的MAC地址封装进数据帧 自己的是源MAC地址 对面是目 的MAC地址 4 交换机会收到
  • [极客大挑战 2019]HardSQL 1

    极客大挑战 2019 HardSQL 1 首先打开题目 明显的发现这是一个sql注入的题 我们先用 和 测试是否有注入报错 发现用 时报错 所以这题很明显是有sql注入的 于是我们就利用用语句 admin or 1 1 测试得到 发现这里是
  • c++ 笔记1

    c 笔记 1 inline内联函数 2 构造函数初始化 3 构造函数重载注意事项 4 常量成员函数 5 参数传递和返回值使用const引用 6 友元 7 运算符重载this指针 8 规范化代码一 complex h complex test