Effective C++ 2e Item30

matlab球面投影(二) matlab球面投影,想做一个全景相机,不知道,要做成啥样,于是在MATLAB先仿真一下,看下是个啥样子 百度别人做的,复制下面的代码到MATLAB的命令串口下,,网上找了张全景图,可以是bmp,jpg,改程序就可以了 回车运行就可以看到结果。 复制下面代码时,下面的中文注释记得删除,MATLAB是会报错的, close all; clear all; clc [x,y,z]=sphere(50); A=imread('a.JPG'); //名字是自己命名的,记得改 B=warp(x,y,-z, 阅读详情

条款30: 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低

使一个成员为private或protected的原因是想限制对它的访问,对吗?劳累的编译器要费九牛二虎之力来确保你设置的访问限制不被破坏,对不对?所以,写个函数来让用户随意地访问受限的成员没多大意义,对不对?如果你确实认为有意义,那么请反复阅读本段,直到你不这样认为为止。

实际编程中很容易违反这条规则,下面是个例子:

class Address { ... };           // 某人居住在此

class Person {
public:
  Address& personAddress() { return address; }
  ...

private:
  Address address;
  ...
};

成员函数personAddress为调用者提供的是Person对象中所包含的Address对象,但是,也许是出于效率上的考虑,返回结果采用的是引用,而不是值(见条款22)。遗憾的是,这个成员函数的做法有违当初将Person::address声明为private的初衷:

Person scott(...);             // 为简化省略了参数

Address& addr =                // 假设addr为全局变量
  scott.personAddress();

现在,全局对象addr成为了scott.address的另一个名字,利用它可以随意读写scott.address。实际上,scott.address不再为private,而是public,访问级提升的根源在于成员函数personAddress。当然,本例中给出的address 的访问级是private,如果是protected,情况完全一样。

不仅仅是引用,指针也会产生以上问题。下面的例子和上面相同,只不过这次用的是指针:

class Person {
public:
  Address * personAddress() { return &address; }
  ...

private:
  Address address;
  ...
};

Address *addrPtr =
  scott.personAddress();        // 问题和上面一样

而且,对于指针来说,要担心的不仅仅是数据成员,还要考虑到成员函数。因为返回一个成员函数的指针也是有可能的:

class Person;                   // 提前声明

// PPMF = "pointer to Person member function"
// (指向Person成员函数的指针)
typedef void (Person::*PPMF)();

class Person {
public:
  static PPMF verificationFunction()
  { return &Person::verifyAddress; }

  ...

private:
  Address address;

  void verifyAddress();

};

如果你过去没试过象上面那样将成员函数指针和typedef结合起来的用法,可能会觉得Person::verificationFunction的声明有点吓人。别害怕,它的全部含义只不过是:

· verificationFunction是一个没有输入参数的成员函数
· 它的返回值是Person类中一个成员函数的指针
· 被指向的函数(即,verificationFunction的返回值)没有输入参数且没有返回值,即void。

至于static关键字,当它用于对成员的声明时,其含义是:整个类只有这个成员的一份拷贝,并且这个成员可以不通过类的具体对象来访问。有关static的完整介绍可以参考C++教程。(如果你的C++教程里没有介绍静态成员,请把书页撕了扔到垃圾回收站吧。注意封面一定不要乱扔以免破坏环境。最后,去借或买本更好的教程吧。)

最后一个例子中,verifyAddress是一个私有成员函数,这意味着它只是类的一个实现细节,只有类的成员才应该知道它(当然,友员也知道)。但是,由于公有成员函数verificationFunction返回了指向verifyAddress的指针,用户就可以做这样的事:

PPMF pmf = scott.verificationFunction();

(scott.*pmf)();                     // 等同于调用
                                    // scott.verifyAddress

这里,pmf成了Person::verifyAddress的同义词,只是有个重要的区别:可以没有限制地使用它。

虽然前面说了那么多,有一天你可能为了程序的性能还是不得不写象上面那样的函数--------返回值是某个访问级较低的成员的指针或引用。但同时,你又不想牺牲private和protected为你提供的访问限制。这种情况下,你可以通过返回指向const对象的指针或引用来达到两全其美的效果。详细介绍参见条款21。

STM32(HAL库)驱动OLED 通过STM32F103C8T6单片机采用HAL库方式对0.96寸OLED(IIC通讯)屏幕进行驱动。 阅读详情

相关推荐

智能座舱通信技术解析:从CAN总线到车载以太网与V2X

在汽车电子与智能网联快速融合的背景下,座舱智能化已不再是简单的屏幕堆砌,而是依赖底层通信技术构建的复杂系统。CAN总线因高可靠性与确定性传输,持续承担车身控制与安全信号的传递;车载以太网则凭借高带宽优势,成为多屏高清视频与OTA升级的核心通道;V2X车路协同技术进一步将座舱与外界的实时信息互联。理解这些技术的分工协作,是掌握智能座舱架构、开展座舱测试与故障排查的关键。本文从实际测试经验出发,梳理不同总线在座舱内部及外部的应用逻辑,结合低成本的实验台架搭建指南,展示从信号采集、网关转发到多媒体流传输的完整链路

weixin_29284657的博客 344

C++:常对象、常成员变量、常成员函数、指向对象的常指针、指向常对象的指针、对象的常引用

C++中常对象、常成员函数、常成员变量常对象常数据成员常成员函数 常对象 类名 const 对象名 const 类名 对象名 所有成员的值都不能修改, (所有数据成员都是常数据成员) (非要改变成员用mutable标记成员变量) const对象只能调用const成员函数 不能调用非const函数,但类中可能有非const函数,但不能用 必须要有初值 常数据成员 必须用参数初始化表初始化,因为其不能赋值 能被常/非常成员函数引用 常成员函数 void f1() const //const加后面

weixin_41838721的博客 1295

开源代码分享(29)-基于拉丁超立方抽样的风光场景生成和削减

作为分层抽样方法的一 种,拉丁超立方抽样具有良好的抽样精度和效率[14]。本文使用多场景方法来描述可再生能源(风电、光伏)的不确定性。以风电功率为例,首先假定风电功率服从正态分布 N(μ, δ 2 ),μ 为预测值的期望值,δ 为其波动的百分比。接着,采用拉丁超立方抽样[21]生成大量服从概率分布约束的风电出力场景,并采用考虑 Kantorovich 距离[22]的场景削减技术处理该场景,进行场景削减。最后,导出具有相应概率的削减之后的场景。

配电网和matlab的博客 923

C++基础知识(1)

C++面向对象三大特性 封装,继承,多态 封装 就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可以信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。实例:将函数定义和函数声明放在不同的文件中。 继承 指可以让某个类型的对象获得另一个类型的对象的属性的方法。它

qq_40123329的博客 487

SQL注入:联合查询的三个绕过技巧

在SQL注入中,可以利用科学计数法来绕过对输入的限制。例如,可以使用科学计数法来绕过对字符串长度的限制,通过将字符串拆分成多个部分并使用科学计数法来表示。此外,还可以利用数据库的特定特性或语法来替代原始的查询语句,从而执行联合查询或其他恶意操作。另外,还可以尝试利用无列名注入的技巧,通过在原始查询中使用通配符或其他方式来绕过对列名的限制,从而执行恶意操作。

qq_68163788的博客 3795

基于halcon的HSV颜色匹配实例

HSV颜色识别原图代码结果 原图 代码 dev_update_off () dev_close_window () *颜色数组 FuseColors := ['Orange','Red','Blue','Yellow','Green'] *画笔颜色数组 DisplayColors := ['coral','red','blue','goldenrod','forest green'] * HSV模型中H分量: Orange 10-30, Red 0-10,Blue 125-162,Yellow 3

qq_39467811的博客 3544

C++学习笔记-对象

this指针 类的成员函数用名为this的额外的隐式参数来访问调用它的那个对象。 this是一个常量指针,我们不能改变this中保存的地址。 默认情况下,this是指向非常量对象的常量指针。这样的this不能绑定到一个常量对象上。自然,常量对象无法调用普通的成员函数。在成员函数的参数列表之后加上const,则此成员变量的this指针就变成指向常量对象的指针,常量对象就可以调用这个成员函数

jo_lan的博客 675

MATLAB 2022b 用户专属:保姆级IPOPT求解器安装配置全流程(含OPTI工具箱)

本文为MATLAB 2022b用户提供IPOPT求解器的详细安装与配置指南,涵盖OPTI工具箱的适配安装、环境变量设置及常见问题解决方案。通过实战案例演示非线性优化问题的求解过程,帮助用户高效部署这一强大的优化工具,提升工程计算效率。

weixin_29092031的博客 406

SQL---基本常用函数

SQL—基本常用函数 提示:本人新手,仅供参考 案例成绩表结构 1、AVG 函数 AVG 函数返回数值列的平均值,NULL 值不包括在计算中 -- 查询整个年级的语文平均分 SELECT AVG(score) AS "语文平均分" FROM grade WHERE `subject` = '语文' -- 查询语文成绩高于平均分的同学及分数 SELECT st_name AS '姓名',score AS '分数' FROM grade WHERE `subject` = '语文' AND score &g

qq_49810363的博客 1343

【红绿灯识别】基于计算机视觉实现道路信号灯检测识别系统附Matlab代码

随着自动驾驶技术的快速发展,对道路交通信号灯的检测识别技术也提出了更高的要求。本文提出了一种基于计算机视觉的道路信号灯检测识别系统,该系统能够准确地检测和识别道路交通信号灯,并输出信号灯的颜色信息。该系统采用深度学习方法,利用卷积神经网络(CNN)对道路交通信号灯进行检测和识别。实验结果表明,该系统能够在复杂的环境中准确地检测和识别道路交通信号灯,具有较高的实用价值。道路交通信号灯是道路交通管理的重要组成部分,它能够有效地组织交通,提高道路通行效率,保障交通安全。

qq_59747472的博客 341

使用 Python 爬虫获取中国证券市场公司公告数据

本文详细介绍了如何使用 Python 爬虫技术从中国证券市场(如巨潮资讯网)爬取公司公告数据。通过分析网页结构,编写爬虫脚本,抓取并存储公告信息,我们实现了从网页抓取数据的全过程。此外,本文还展示了如何应对反爬虫机制,并介绍了数据分析与可视化的基本方法。未来,我们可以通过机器学习等技术进一步挖掘公告中的潜在信息,例如,通过情感分析对公告内容进行情绪分类,或者预测某些公告类型对股市走势的影响等。希望本文能帮助你理解如何使用 Python 爬虫技术获取和处理证券市场的数据,并为你的数据分析项目提供帮助。

2201_76125261的博客 1888

C++学习(7)--转向effective c++(3)

条款18: 争取使类的接口完整并且最小本条款中的一些基本概念:// 返回可以读/写的元素t& operator[](int index);// 返回只读元素const t& operator[](int index) const;概括起来就是说,无端地在接口里增加函数不是没有代价的,所以在增加一个新函数时要仔细考虑:它所带来的方便性(只有在接口完整的前提下才应该考虑增加一个新函数以提供

zhao0057的专栏 729

51单片机8×8LED点阵屏动态显示取模汉字+ Proteus仿真

51单片机8×8LED点阵屏动态显示取模汉字+ Proteus仿真 Proteus仿真 取模软件:pctolcd2002 程序代码 #include<reg52.h> unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//行选 unsigned char code tabb[]={0x08,0x49,0x49,0x7F,0x08,0x49,0x49,0x7F};//选列"出" unsigned cha

perseverance51博客 8057

Effective C++ 2e Item7

条款7:预先准备好内存不够的情况operator new在无法完成内存分配请求时会抛出异常(以前的做法一般是返回0,一些旧一点的编译器还这么做。你愿意的话也可以把你的编译器设置成这样。关于这个话题我将推迟到本条款的结尾处讨论)。大家都知道,处理内存不够所产生的异常真可以算得上是个道德上的行为,但实际做起来又会象刀架在脖子上那样痛苦。所以,你有时会不去管它,也许一直没去管它。但你心里一定还是深深

lostmouse的专栏 1668

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

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Effective C++ 2e Item1

 从C转向C++对每个人来说,习惯C++需要一些时间,对于已经熟悉C的程序员来说,这个过程尤其令人苦恼。因为C是C++的子集,所有的C的技术都可以继续使用,但很多用起来又不太合适。例如,C++程序员会认为指针的指针看起来很古怪,他们会问:为什么不用指针的引用来代替呢?C是一种简单的语言。它真正提供的只有有宏、指针、结构、数组和函数。不管什么问题,C都靠宏、指针、结构、数组和函数来解决。而C

lostmouse的专栏 1488

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Effective C++ 2e Item5

内存管理C++中涉及到的内存的管理问题可以归结为两方面:正确地得到它和有效地使用它。好的程序员会理解这两个问题为什么要以这样的顺序列出。因为执行得再快、体积再小的程序如果它不按你所想象地那样去执行,那也一点用处都没有。“正确地得到”的意思是正确地调用内存分配和释放程序;而“有效地使用”是指写特定版本的内存分配和释放程序。这里,“正确地得到”显得更重要一些。然而说到正确性,C++其实从C继承

lostmouse的专栏 1199

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Effective C++ 2e Item44

条款44: 说你想说的;理解你所说的在本章关于 "继承和面向对象设计" 的简介中,我曾强调,理解不同的面向对象构件在C++中的含义十分重要。这和仅仅知道C++语言的规则有很大的不同。例如,C++规则说,如果类D从类B公有继承,从D的指针到B的指针就有一个标准转换;B的公有成员函数将被继承为D的公有成员函数,等等。这些规则都是正确的,但在将设计思想转化为C++的过程中,它们起不到任何作用。相反,

lostmouse的专栏 1148

Effective C++ 2e Item15

条款15: 让operator=返回*this的引用C++的设计者Bjarne Stroustrup下了很大的功夫想使用户自定义类型尽可能地和固定类型的工作方式相似。这就是为什么你可以重载运算符,写类型转换函数(见条款M5),控制赋值和拷贝构造函数,等等。他做了这么多努力,那你最少也该继续做下去。让我们看看赋值。用固定类型的情况下,赋值操作可以象下面这样链起来:int w, x, y,

lostmouse的专栏 1079

Effective C++ 2e Item33

条款33: 明智地使用内联内联函数------多妙的主意啊!它们看起来象函数,运作起来象函数,比宏(macro)要好得多(参见条款1),使用时还不需要承担函数调用的开销。你还能对它们要求更多吗?然而,你从它们得到的确实比你想象的要多,因为避免函数调用的开销仅仅是问题的一个方面。为了处理那些没有函数调用的代码,编译器优化程序本身进行了专门的设计。所以当内联一个函数时,编译器可以对函数体执行特

lostmouse的专栏 1141

Effective C++ 2e Item50

条款50: 提高对C++的认识C++中有很多 "东西":C,重载,面向对象,模板,例外,名字空间。这么多东西,有时让人感到不知所措。怎么弄懂所有这些东西呢?C++之所以发展到现在这个样子,在于它有自己的设计目标。理解了这些设计目标,就不难弄懂所有这些东西了。C++最首要的目标在于:· 和C的兼容性。很多很多C还存在,很多很多C程序员还存在。C++利用了这一基础,并建立在 ---- 我是

lostmouse的专栏 1376

Effective C++ 2e Item4

条款4:尽量使用C++风格的注释旧的C注释语法在C++里还可以用,C++新发明的行尾注释语法也有其过人之处。例如下面这种情形:    if ( a > b ) {      // int temp = a;    // swap a and b      // a = b;      // b = temp;    }假设你出于某种原因要注释掉这个代码块。从软件工程的角度看,写这段代码的程

lostmouse的专栏 1080

Effective C++ 2e Item24

条款24: 在函数重载和设定参数缺省值间慎重选择会对函数重载和设定参数缺省值产生混淆的原因在于,它们都允许一个函数以多种方式被调用:void f();                             // f被重载void f(int x);f();                                  // 调用f()f(10);                 

lostmouse的专栏 1012

Effective C++ 2e Item28

条款28: 划分全局名字空间全局空间最大的问题在于它本身仅有一个。在大的软件项目中,经常会有不少人把他们定义的名字都放在这个单一的空间中,从而不可避免地导致名字冲突。例如,假设library1.h定义了一些常量,其中包括:const double LIB_VERSION = 1.204;类似的,library2.h也定义了:const int LIB_VERSION = 3;很

lostmouse的专栏 1076

Effective C++ 2e Item31

条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用本条款听起来很复杂,其实不然。它只是一个很简单的道理,真的,相信我。先看第一种情况:返回一个局部对象的引用。它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的。也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的。所谓生命空间,是指它们所在的函数体。当函数返回时,程序的控制离开了这

lostmouse的专栏 1058

Effective C++ 2e Item10

 条款10. 如果写了operator new就要同时写operator delete让我们回过头去看看这样一个基本问题:为什么有必要写自己的operator new和operator delete?答案通常是:为了效率。缺省的operator new和operator delete具有非常好的通用性,它的这种灵活性也使得在某些特定的场合下,可以进一步改善它的性能。尤其在那些需要动态分

lostmouse的专栏 1190

Effective C++ 2e Item8

条款8. 写operator new和operator delete时要遵循常规自己重写operator new时(条款10解释了为什么有时要重写它),很重要的一点是函数提供的行为要和系统缺省的operator new一致。实际做起来也就是:要有正确的返回值;可用内存不够时要调用出错处理函数(见条款7);处理好0字节内存请求的情况。此外,还要避免不小心隐藏了标准形式的new,不过这是条款9的话

lostmouse的专栏 1123
上一篇: Effective C++ 2e Item29
下一篇: Effective C++ 2e Item31
lostmouse
博客等级 码龄26年 22粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值